在我遇到paredit模式之前,我使用M-;
注释掉当前行或注释掉带有标记集的区域。
但是在paredit模式下,似乎我无法注释掉当前行,除非我C-a
并手动插入;
或在M-;
之前标记该行,因为在此模式下在行的开头使用M-;
会在行上方插入;;;
,在行的中间或末尾会插入一行结尾注释。
所以我的问题是如何以更优雅的方式评论当前行?
答案 0 :(得分:2)
我不认为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-;
。
选择表达式(而不是选择行)不仅更安全(在不引入不匹配的parens的意义上),而且更方便。例如,你如何评论dotimes表格?使用C-M-SPC
选择整个dotimes表单比逐行选择五行更方便。
这里故事的寓意类似于Vim的以下道德:"在Vim中,诀窍是你使用文本对象(单词,行,句子,代码块等),而不是字母。 "
在Lisp编辑中,诀窍是你使用表达式(sexps),而不是使用行或字母。
为了使事情更方便,您可能希望定义一个命令,该命令用于注释前面的N个表达式,其中N由连续调用命令的次数或前缀参数指定。或者是一个命令,用于在点之后注释掉一个表达式并移动指向下一个表达式的开头(如果有的话)。
答案 1 :(得分:1)
如果你真的要注释掉当前行,请键入C-q;在行的开头。
问题在于,这几乎不是你想要的。
答案 2 :(得分:1)
只需输入;
即可注释掉可以在该行上注释的所有内容。 (以下任何结束分隔符将移动到下一行。)
答案 3 :(得分:0)
如果尝试评论空行或结尾,只需使用;
,光标位于;
。在评论代码时,应考虑注释掉 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)