如何评论paredit中的当前行?

时间:2012-11-03 14:19:28

标签: emacs comments paredit

在我遇到paredit模式之前,我使用M-;注释掉当前行或注释掉带有标记集的区域。

但是在paredit模式下,似乎我无法注释掉当前行,除非我C-a并手动插入;或在M-;之前标记该行,因为在此模式下在行的开头使用M-;会在行上方插入;;;,在行的中间或末尾会插入一行结尾注释。

所以我的问题是如何以更优雅的方式评论当前行?

4 个答案:

答案 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)