在遇到 paredit 模式之前,我使用M-;
注释掉当前行或注释掉带有标记集的区域。
但是在paredit模式下,除非我手动C-a
插入或在我之前标记行,否则我似乎无法注释掉当前行,因为在这种模式下,在行首使用将插入行上方和中间或末尾of line 将插入一个行尾注释。;
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))
and(print "hello")
怎么办?将点移到要注释掉的第一个表达式的开头,然后按C-M-SPC
两次选择两个表达式,然后按M-;
。
选择表达式(相对于选择行)不仅更安全(在不引入不匹配括号的意义上),而且更方便。例如,您将如何注释掉 dotimes 表单?使用C-M-SPC
全选dotimes表格比一选一选五行更方便。
这里故事的寓意类似于 Vim 的以下寓意:“在 Vim 中,诀窍是你使用文本对象(单词、行、句子、代码块等),而不是字母。”
在 Lisp 编辑中,诀窍是您使用表达式(sexps),而不是使用线条或字母。
为了使事情更方便,您可能希望定义一个命令,注释掉点后面的前 N 个表达式,其中 N 由命令连续调用的次数或前缀参数指定。或者一个命令,它在点之后注释掉一个表达式并将点移动到下一个表达式的开头,如果有的话。
如果你真的想注释掉当前行,输入 Cq ;在行的开头。
问题是那几乎从来都不是你想要的。
只需键入;
以注释掉从该点开始可以在该行上注释的所有内容。(后面的任何结束分隔符都将移到下一行。)
如果试图评论一个空行或一个行的结尾,只需使用;
光标所在的;
位置。在注释掉代码时,应该考虑注释掉一个s 表达式而不是一行。这样可以保持括号的平衡。Paredit 为此提供了一个有用的界面。
该;
键可用于较低级别的表单,它们将由paredit自动平衡,尽管我觉得它更难看:(光标是|
但不是#|
or |#
)
(foo (bar | baz) quuz)
变成:
(foo (bar ; baz
) quuz)
但
|(blah bla bl a)
产生错误。
如果安装了 SLIME,那么slime-insert-balanced-comments
可以使用它会很高兴地插入注释,同时保持平衡的括号。这条评论恰好是一个使用#|
and的读取宏|#
。总是受欢迎的,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)