Emacs上的Lisp:如何注释多行表达式?

14
例如,如果我想评论这个:
(defun noop ()
  nil)
每次在"(defun"之前加分号,defun函数就会跑到下一行。应该如何解决?
GNU Emacs 23.1.1
编辑:我所说的“跑掉”是指当我在“(defun”之前插入分号时,分号后自动插入一个换行符,“(defun”再次开始新的一行。

2
它对我有效,这里没有逃跑。你是说当你在“(defun”之前插入分号时,自动插入一个换行符,并且“(defun”再次从新的一行开始吗?那将非常奇怪;在我的两个emacs版本(GNU Emacs 22.1和基于GNU Emacs 22.3.1的Aquamacs Emacs)中都没有发生这种情况。 - joriki
没错,就是这样。GNU Emacs 23.1.1。 - Ron
2
你很可能已经安装了paredit插件。 - Svante
那么它最终是哪种模式? - Charlie Martin
8个回答

16

请查看命令 M-x comment-region 和相关文档。


7

M-X comment-dwimM-;,这是前者的默认按键绑定,可以为您节省一些按键,因为它不仅可以注释,而且如果已经注释了区域,则可以取消注释。无论如何,请查看Emacs手册以获得适当的描述。


不幸的是,在我的Emacs中,M-x comment-dwim在行末插入分号,而M-;则会插入三个分号和一个换行符。 - Ron

6
Ron,请按CTRL-H m查看次要模式。你有一些“有用的”次要模式处于活动状态。(也许是paredit,但我不确定。)我记得在尝试EMACS Starter Kit时有类似的情况。它只持续了大约30秒钟,然后我就尖叫着找到了如何关闭它。
无论如何,这不是默认的EMACS行为,它是一些init文件或site-emacs添加的。

4
输入C-h k ;,Emacs会告诉你分号绑定的命令是什么,以及定义它的库是哪个。从那里你应该能够弄清楚需要禁用什么东西。 - phils

5

选中这两行文本,然后调用M-x comment-region。还可以查看comment-or-uncomment-regioncomment-dwim函数。


2

针对标题中提到的具体任务(一次性注释跨越多行的完整表达式),首先按下C-M-SPC(绑定了mark-sexp)来将光标后面的表达式设置为区域,然后按下M-;(绑定了comment-dwim,该命令会调用comment-region函数)进行注释。


2
有点晚了,不过关于编程方面的内容,怎么样:

(defmacro comment (&rest a))

2
很遗憾被抓了几年,但这些宏解决方案并不是非常有用,因为BODY仍然需要在没有错误的情况下进行评估。 - ocodo
@ocodo 你所指的 BODY 是什么?这个答案的解决方案与 clojure.core 中的 comment 有何不同? - Rulle
1
@Rulle,BODY是评论的“内容”。Ocodo基本上是正确的,内容必须正确地_parse_。这可能不是文本或指导性评论的最佳解决方案,但对于注释掉s表达式非常有用。它与clojure的定义相同,并且它们共享相同的限制。 - Shlomi

1
如果你在谈论Common Lisp(而不是Emacs-Lisp),你可以使用#+(or)
#+(or)
(defun noop ()
  nil)

详细信息请参见CLHS


0
(defvar orgCmntEnd nil "Org Comment End")

(defun orgCmntBegin (<comment <commentEnd))

(orgCmntBegin "
**  orgCmntBegin. Permits us to include * at the beginning of line as a comment.
Which in turn allows us to switch between emacs-major mode and org-mode for COMEEGA.
Example usage is: 
(orgCmntBegin \"multi-line comment comes here.\" orgCmntEnd)

I wish elisp had a here-document facility. Like common-lisp.
Anybody listening?
" orgCmntEnd)

请添加更多细节以扩展您的答案,例如工作代码或文档引用。 - Community
那是可运行的代码。所有三种形式都可以进行 eval。 - Mohsen Banan
你可以将前两个表单放在一个库中。第三个表单演示了用法。整个事情的美妙之处在于块注释 - 作为字符串 - 被很好地划分,块看起来很漂亮。orgCmntBegin是一个空函数,其文档字符串是注释块,而orgCmntEnd只是一个使使用更明显的变量。 - Mohsen Banan
前面评论的最后一句应该是:orgCmntBegin 是一个空函数,它被包含注释块的字符串调用,第二个参数是 orgCmntEnd,这使得使用更加明显。 - Mohsen Banan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接