从Emacs生成代码

时间:2009-01-05 16:21:36

标签: emacs code-generation

如何在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 个答案:

答案 0 :(得分:7)

我同意键盘宏会以最快的速度获得结果。

更有趣的是程序化方法:

(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")))

答案 1 :(得分:5)

一般来说,当你第一次面对这类问题时,你会使用键盘宏,就像JB已经说过的那样。

第二次,请查看Steve Yegge撰写的这篇非常有趣的文章:http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html,其中包含与您完全一样的问题解决方案。

为了您的方便和我自己的照明,我实际上继续进行测试:

我会从

开始
A
...
A

26次

并做一个

M-x replace-regexp

A
\\newcommand{\\c\,(string (+ ?A \#))}{\\mathcal \,(string (+ ?A \#))}

答案 2 :(得分:4)

A到Z只有26行。与自然使用键盘宏,imho。

相比,你会浪费更多时间来自动生成

答案 3 :(得分:3)

这取决于你的背景。我只需输入M-!和:

perl -e"print map {q(\newcommand{\c).$_.q(}{\mathcal ).qq($_}\n)} A..Z

答案 4 :(得分:3)

您知道rectangle selection吗?

还有string-rectangle

  • 将点(光标)放在文本的开头,标记(C-SPC
  • 放置在最后一行的开头
  • 输入M-x string-rectangle
  • 键入一个字符串(\ newcommand {\ c)

这将在标记之后的每一行之前插入该字符串。

答案 5 :(得分:3)

我没有足够的业力或其他任何评论,但我想改善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具有chars的读者语法。您可以只编写(string-to-char "X")而不是?X。然后,您可以使用printf样式format代替char-to-stringconcat来生成最终结果:

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

现在它很简洁,无需考虑M-:提示符。

我还要指出TeX也有宏,如果这确实是TeX。

编辑:Joe Casadonte的另一种风格建议; (incf foo)(setq foo (+ foo 1))更容易输入。

答案 6 :(得分:1)

或者如果你想一次一个地进行交互式方式

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

每次你想要文本时,只需eval和M-x somefun

答案 7 :(得分:1)

不完全是答案。

对于不使用emacs或vim的人,我想补充一点,您可以打开Excel并使用其自动填充功能和文本连接功能来生成此类代码。

答案 8 :(得分:0)

我喜欢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)))))

两者结合起来不应该太难。