我已经编写了几个几乎相同的函数,除了它们的名称。例如:
; x is name, such as function/paragraph/line/etc.
(defun my-x-function
(interactive)
(mark-x) (do-more-stuff) (modify-x))
有没有办法自动生成这样的函数?我感觉这就是宏的作用,但我不确定如何使用它们。任何帮助,也许包括一个小的例子将是伟大的。
谢谢!
发布于 2010-03-13 13:00:23
是的,这正是宏的作用所在。下面是一个简单的宏,它根据您指定的模式构建函数:
(defmacro make-my-function (name)
(list 'defun (intern (format "my-%s-function" name)) ()
(list 'interactive)
(list (intern (format "mark-%s" name)))
(list 'do-more-stuff)
(list (intern (format "modify-%s" name)))))
您可以将此宏复制到Emacs中的*scratch*
缓冲区,并对其进行求值,然后检查其工作方式是否如下:
(make-my-function x) ; type control-J here
my-x-function ; <-- Emacs's output
(symbol-function 'my-x-function) ; type control-J here
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output
更常见的情况是使用backquote工具来更简洁地编写宏,但所有宏的工作方式基本上都与上面的示例相同。
发布于 2010-03-17 21:37:31
宏可以做到这一点,但是有很多模板模块可以让emacs完成类似的工作。我使用一种名为yasnippet.el的东西来快速生成代码。例如,在一个C源文件中,如果我输入for<TAB>
,就会得到一个For循环模板;它允许我填充模板,设置变量名、限制和内部循环内容。
看起来像这样:
您可以为您喜欢的任何内容设置模板。函数定义、if语句、switch语句等等。为不同的模式设置不同的模板。C中for
循环的模板与C#中for
循环的模板不同,以此类推。非常方便。
https://stackoverflow.com/questions/2437254
复制相似问题