【问题标题】:How do you comment out all or part of a Lisp s-exp using Paredit?如何使用 Paredit 注释掉 Lisp s-exp 的全部或部分内容?
【发布时间】:2011-05-16 08:35:37
【问题描述】:

在编辑 Lisp 代码时,有时完全注释掉顶级定义很有用,如下所示:

;(defun some-fn-which-is-broken (x)
;  ...)

... 或仅注释掉 s 表达式的一部分,如下所示:

(foo x
;    y
     z)

...然后重新编译文件并在 REPL 中测试一些东西,等等。

启用 paredit 模式后,这不起作用。如果该点正好在下面的第一个括号之前,则会发生以下情况:

(defun some-fn (x)
  ...)

你输入一个分号,输入的是一个分号和一个换行符:

;
(defun some-fn (x)
  ...)

与注释掉部分 s 表达式相同:

(foo x
;    
     y
     z)

我认为如果定义都在一行上,这行得通:

;(defparameter *foo* 10)

...但否则我无法找到如何做到这一点。 Paredit 很棒,我真的很想继续使用它。是否有任何 Lispers 知道解决此问题的方法,或者 Emacs 向导可以掀起一点 Emacs Lisp 来绑定到 paredit-comment-out-s-expr 之类的东西?

如果有更多的 Lispy 或 Emacsy 方式来完成基本相同的事情,请注释掉要重新编译的部分源代码,请不要犹豫,提出建议!

【问题讨论】:

    标签: emacs lisp paredit


    【解决方案1】:

    作为权宜之计,您可以使用 C-q (quoted-insert) 插入任意字符,而不会触发任何与模式相关的魔法。例如,在 java 模式下,键入括号会重新缩进当前行,这并不总是我想要的;在这种情况下,我将插入一个带有 C-q 的括号以保留我的缩进。 (或者更多时候,我会输入一个括号,观察缩进的变化,诅咒,撤消,然后用 C-q 重新输入。)

    对于一般评论,使用 M-; (comment-dwim) 可能比手动输入分号更容易。

    【讨论】:

      【解决方案2】:

      将点定位在整个sexp的第一个字符上,用C-M-space标记整个sexp,然后发出M-;进行注释。如果有必要这样做,您的源代码也将被重新格式化,以便只有您标记的 sexp 以及同一行上的任何内容都不会出现在注释中。

      你可以很容易地创建一个简单的命令,甚至是一个宏来做到这一点:

      (defun comment-sexp() “在点注释掉性别。” (交互的) (保存游览 (标记-性别) (paredit-comment-dwim)))

      【讨论】:

      • 漂亮!正是我想要的。谢谢!
      • @spacemanaki 另外,按 C-M-SPC 多次选择多个 s 表达式,多次按 C-M-u 可以让您在按 C-M-SPC 之前到达您想要的位置
      【解决方案3】:

      只是一个旁注:

      #+#- 阅读器宏非常适合注释掉性别。如果在*FEATURES* 中找不到给定符号,它们允许忽略以下sexp。只需选择一个不在*FEATURES* 中的符号,然后将其与#+ 一起使用,如下所示:

      #+nil
      (defun foo ()
        ...)
      

      现在,函数定义将被忽略(除非NIL*FEATURES* 中,这不太可能)。

      【讨论】:

      • 如果你想超级安全,你可以使用 (OR) 代替 NIL。
      【解决方案4】:

      您可以使用C-M-SPC M-; 标记S 表达式(C-M-SPC 表示mark-sexp)然后对其进行注释(M-; 表示comment-dwim)。

      在 paredit 23 中,只需键入 ; 不会推动任何不需要下线的东西。所以它会为你的第二个例子做正确的事情。如果你想注释掉 z 而不是 y 它只会将结束分隔符推到另一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        相关资源
        最近更新 更多