【问题标题】:How to comment out current line in paredit?如何注释掉paredit中的当前行?
【发布时间】:2012-11-03 14:19:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: emacs comments paredit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果你真的想注释掉当前行,输入 C-q ;在行首。

      问题是这几乎不是你想要的。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 噢!我只是没有意识到这一点。谢谢!
        【解决方案4】:

        如果试图评论一个空行或一个空行的结尾,只需使用;; 应该所在的光标。在注释掉 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)
        

        【讨论】:

          猜你喜欢
          • 2015-12-23
          • 2011-05-16
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 2011-02-04
          • 2016-01-26
          • 2011-06-01
          相关资源
          最近更新 更多