【发布时间】:2012-11-03 14:19:28
【问题描述】:
在遇到 paredit 模式之前,我使用 M-; 注释掉当前行或注释掉带有标记集的区域。
但在 paredit 模式下,我似乎无法注释掉当前行,除非我 C-a 并手动插入 ; 或在我 M-; 之前标记行,因为在此模式下使用 M-; 在行首将在行上方插入;;;,在中间或行尾插入行尾注释。
所以我的问题是如何以更优雅的方式注释掉当前行?
【问题讨论】:
在遇到 paredit 模式之前,我使用 M-; 注释掉当前行或注释掉带有标记集的区域。
但在 paredit 模式下,我似乎无法注释掉当前行,除非我 C-a 并手动插入 ; 或在我 M-; 之前标记行,因为在此模式下使用 M-; 在行首将在行上方插入;;;,在中间或行尾插入行尾注释。
所以我的问题是如何以更优雅的方式注释掉当前行?
【问题讨论】:
我不认为 paredit 提供任何注释掉一行的命令,所以我将分享一个无论是否使用 paredit 都有效的提示。
假设你有这个代码:
(defun my-hi ()
(dotimes (_ 2)
(print "hello")
(print (+ 1
2))
(print "world"))
(print "the end"))
如果要注释掉第三行,只需选择表达式,然后按M-;。也就是说,将指针移动到表达式(print "hello") 之前的任何空白处,然后按C-M-SPC 选择表达式,然后按M-; 注释掉表达式。
如果你想注释掉两行怎么办,例如,如果你想注释掉跨越两行的表达式(print (+ 1 2))怎么办?同理,将点移到表达式开始前的任意空白处,然后按C-M-SPC M-;。
现在,如果您想注释掉包含表达式(print "world") 的行怎么办?但这是个坏主意。相反,您只想注释掉表达式(print "world")。怎么做?还是一样。
如果你想注释掉循环内除了第一条语句之外的所有语句,也就是注释掉(print (+ 1 2))和(print "hello")怎么办?将点移到要注释掉的第一个表达式的开头,然后按C-M-SPC两次选择这两个表达式,然后按M-;。
选择表达式(相对于选择行)不仅更安全(在不引入不匹配括号的意义上),而且更方便。例如,您将如何注释掉 dotimes 表单?使用C-M-SPC 选择整个dotimes 表格,比一一选择五行更方便。
这里故事的寓意类似于 Vim 的以下寓意:“在 Vim 中,诀窍是您使用文本对象(单词、行、句子、代码块等),而不是字母。”
在 Lisp 编辑中,诀窍是使用表达式 (sexps),而不是使用线条或字母。
为了使事情更方便,您可能想要定义一个命令,该命令在点后面的前 N 个表达式中取出,其中 N 由命令连续调用的次数或前缀参数指定。或者是一个命令,它在点之后输出一个表达式并将点移动到下一个表达式的开头(如果有的话)。
【讨论】:
如果你真的想注释掉当前行,输入 C-q ;在行首。
问题是这几乎不是你想要的。
【讨论】:
只需键入; 即可注释掉从该点开始在该行上可以注释的所有内容。 (后面的任何结束分隔符都将移到下一行。)
【讨论】:
如果试图评论一个空行或一个空行的结尾,只需使用; 和; 应该所在的光标。在注释掉 code 时,应该考虑注释掉 s-expression 而不是一行。这样可以保持括号的平衡。 Paredit 为此提供了一个有用的界面。
; 键可用于较低级别的表单,它们将通过 paredit 自动平衡,虽然我觉得它更丑:(光标是 | 但不是 #|或|#)
(foo (bar | baz) quuz)
变成:
(foo (bar ; baz
) quuz)
但是
|(blah bla bl a)
产生错误。
如果安装了 SLIME,则可以使用 slime-insert-balanced-comments,它会很高兴地插入评论同时保持括号平衡。这条评论恰好是一个使用#| 和|# 的读取宏。随时欢迎来到C-q ;,但它会使他们不平衡。 paredit 的全部意义在于使它们保持平衡。
(|defun (blah) blah) -> #|(defun (blah) blah)|#
它找到了可能的最低级别的形式:
(foo (bar | fuux) duux) -> (foo #|(bar | fuux)|# duux)
我的.emacs.el 文件中有这个,因为slime-insert-balanced-comments 默认情况下没有绑定到键。
(global-set-key (kbd "C-c ;") 'slime-insert-balanced-comments)
【讨论】: