4

如何在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})

4

9 回答 9

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")))
于 2009-01-05T17:03:43.870 回答
5

一般来说,当你第一次遇到这种问题时,你会使用键盘宏,正如 JB 已经说过的那样。

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

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

我会从

一种
...
一种

26次

并做一个

Mx 替换正则表达式

一种
\\newcommand{\\c\,(string (+ ?A \#))}{\\mathcal \,(string (+ ?A \#))}
于 2009-01-05T17:20:18.063 回答
4

A到Z只有26行。恕我直言,与自然使用键盘宏相比,您会浪费更多时间自动生成。

于 2009-01-05T16:38:39.333 回答
3

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

perl -e"print map {q(\newcommand{\c).$_.q(}{\mathcal ).qq($_}\n)} A..Z
于 2009-01-05T17:35:15.490 回答
3

你知道矩形选择吗?

还有string-rectangle

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

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

于 2009-01-06T12:01:51.810 回答
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-stringandconcat来生成最终结果:

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

于 2009-01-09T07:16:50.027 回答
1

或者如果你想一次做一个互动的方式

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

每次需要文本时,只需 eval 和 Mx somefun

于 2009-01-05T17:17:58.100 回答
1

不完全是答案。

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

于 2009-02-25T19:03:46.007 回答
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)))))

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

于 2009-01-05T17:11:18.517 回答