2009-01-05 98 views
4

如何在emacs中快速编写以下代码?从Emacs生成代码

​​

是否有办法不是写

A 
B 
C 
D 
. 
. 
. 
Y 
Z 

,然后在每一行做宏观更快? (将A更改为\ newcommand {\ cA} {\ mathcal A})

+0

你不应该需要这么多的数学字母。 :-) – ShreevatsaR 2009-01-05 21:27:56

回答

5

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

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

为了您的方便,和我自己的照明,其实我去前进,测试它:

我将开始与

 
A 
... 
A 

26倍

,并做了

的Mx replace-regexp

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

现在,这是真正的人的做法:) – 2009-01-05 17:25:36

4

A到Z只有26行。你会浪费更多的时间来自动生成,而不仅仅是自然地使用键盘宏,恕我直言。

+0

+1只是在你做第一个宏时(包括移动到下一行)定义一个宏,然后执行一个重复计数为25的宏,你就完成了。 – 2009-01-05 16:54:39

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

我喜欢高清的环比我好一点,但这里有一个替代,更广义的方法:

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

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

1

或交互的方式,如果你想要做他们在同一时间

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

只是EVAL和MX somefun你想要的文字

3

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

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

你知道rectangle selection

还有string-rectangle

  • 地方点(光标)在文本的开头,标记(C-SPC
  • 发生在最后一行的起点
  • M-x string-rectangle
  • 键入一个字符串(\ newcommand {\ c)

This will inser从标记开始,每行之前的那个字符串。

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有字符阅读器语法。而不是(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的话。

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

1

不完全是答案。

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