Генерация кода из Emacs - PullRequest
       15

Генерация кода из Emacs

4 голосов
/ 05 января 2009

Как я могу быстро написать следующий код в emacs?

\newcommand{\cA}{\mathcal A}
\newcommand{\cB}{\mathcal B}
\newcommand{\cC}{\mathcal C}
...
...
\newcommand{\cY}{\mathcal Y}
\newcommand{\cZ}{\mathcal Z}

Есть ли способ быстрее, чем писать

A
B
C
D
.
.
.
Y
Z

а потом делать макрос в каждой строке? (изменяя A на \ newcommand {\ cA} {\ mathcal A})

Ответы [ 9 ]

7 голосов
/ 05 января 2009

Я согласен, что макрос клавиатуры даст результат быстрее всего.

Больше удовольствия - программный подход:

(loop 
      for n from (string-to-char "A") to (string-to-char "Z")
      for c = (char-to-string n)
      do (insert (concat "\\newcommand{\\c" c "}{\\mathcal " c "}\n")))
5 голосов
/ 05 января 2009

В общем, когда вы сталкиваетесь с подобной проблемой в первый раз, вы используете клавиатурные макросы, как уже сказал JB.

Во второй раз прочитайте эту очень очень интересную статью Стива Йегге: http://steve -yegge.blogspot.com / 2006/06 / spark-and-new-emacs-22.html , который содержит решения для проблем, как у вас.

Для вашего удобства и моего собственного освещения, я на самом деле пошел вперед и протестировал его:

Я бы начал с

A
...
A

26 раз

и сделать

M-x replace-regexp

A
\\newcommand{\\c\,(string (+ ?A \#))}{\\mathcal \,(string (+ ?A \#))}
4 голосов
/ 05 января 2009

от А до Я только 26 строк. Имхо, вы бы потратили больше времени на автоматизацию генерации, чем просто естественное использование макросов клавиатуры.

3 голосов
/ 09 января 2009

Мне не хватает кармы или чего-то еще, чтобы комментировать, но я хотел немного улучшить стиль HD.

Вот оригинал:

(loop 
  for n from (string-to-char "A") to (string-to-char "Z")
  for c = (char-to-string n)
  do (insert (concat "\\newcommand{\\c" c "}{\\mathcal " c "}\n")))

Во-первых, Emacs Lisp имеет синтаксис читателя для символов. Вместо (string-to-char "X") вы можете просто написать ?X. Затем вы можете использовать printf-style format вместо char-to-string и concat для получения окончательного результата:

(loop for n from ?A to ?Z
      do (insert (format "\\newcommand{\\c%s}{\\mathcal %s}\n" n n)))

Теперь достаточно набрать текст, не задумываясь о подсказке M-:.

Я также укажу, что у TeX также есть макросы, если это действительно TeX.

Редактировать: еще один совет по стилю для Джо Касадонте; (incf foo) гораздо проще набрать, чем (setq foo (+ foo 1)).

3 голосов
/ 06 января 2009

Знаете ли вы, выбор прямоугольника ?

Там также string-rectangle:

  • поставить точку (курсор) в начале текста, пометить (C-SPC)
  • поставить точку в начале последней строки
  • тип M-x string-rectangle
  • введите строку (\ newcommand {\ c)

Это будет вставлять эту строку перед каждой строкой после метки.

3 голосов
/ 05 января 2009

Это зависит от вашего фона. Я бы просто набрал M-! и:

perl -e"print map {q(\newcommand{\c).$_.q(}{\mathcal ).qq($_}\n)} A..Z
1 голос
/ 25 февраля 2009

Не совсем ответ.

Для людей, которые не используют emacs или vim, я хотел бы добавить, что вы можете открыть Excel и использовать его функцию автозаполнения и функцию объединения текста для генерации такого кода.

1 голос
/ 05 января 2009

Или интерактивный способ, если вы хотите сделать их по одному

(defun somefun(inputval)
  (interactive "sInputVal: ")
  (insert ( format "\\newcommand{\\c%s}{\\mathcal %s}" inputval inputval) )
)

просто eval и M-x somefun каждый раз, когда вы хотите текст

0 голосов
/ 05 января 2009

Мне нравится петля HD чуть лучше моей, но вот альтернативный, более обобщенный подход:

(defun my-append (str)
  "Substitute A-Z in STR and insert into current buffer.

Looks for '--HERE--' (without quotes) in string STR, substitutes the
letters A-Z in the string and then inserts the resulting string into
the current buffer."
  (interactive "sInput String: ")
  (let ((lcv 0)
        letter newstr)
    (while (< lcv 26)
      (setq letter (+ ?A lcv))

      (insert (replace-regexp-in-string "--HERE--" (char-to-string letter) str t t) "\n")

      (setq lcv (+ lcv 1)))))

Не должно быть слишком сложно объединить их.

...