1

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

但是在paredit模式下,除非我手动C-a插入或在我之前标记行,否则我似乎无法注释掉当前行,因为在这种模式下,在行首使用将插入行上方和中间或末尾of line 将插入一个行尾注释。;M-;M-;;;;

所以我的问题是如何以更优雅的方式注释掉当前行?

4

4 回答 4

3

我不认为 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 由命令连续调用的次数或前缀参数指定。或者一个命令,它在点之后注释掉一个表达式并将点移动到下一个表达式的开头,如果有的话。

于 2014-07-16T13:17:24.243 回答
1

如果你真的想注释掉当前行,输入 Cq ;在行的开头。

问题是那几乎从来都不是你想要的。

于 2012-11-03T19:16:35.447 回答
1

只需键入;以注释掉从该点开始可以在该行上注释的所有内容。(后面的任何结束分隔符都将移到下一行。)

于 2013-06-13T18:20:51.767 回答
0

如果试图评论一个空行或一个行的结尾,只需使用;光标所在的;位置。在注释掉代码时,应该考虑注释掉一个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)
于 2016-01-19T02:52:44.933 回答