16

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

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

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

(foo x
;    y
     z)

...然后重新编译文件并在 REPL 中测试某些内容等。

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

(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 方式来完成基本相同的事情,请注释掉部分源代码以重新编译,请不要犹豫,建议他们!

4

4 回答 4

34

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

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

(defun comment-sexp()
  “在点注释掉性别。”
  (交互的)
  (保存游览
    (标记-性别)
    (paredit-comment-dwim)))
于 2010-11-26T21:01:10.620 回答
11

只是一个旁注:

和reader 宏非常适合注释掉 sexps #+#-如果给定的符号不在/在*FEATURES*. 只需选择一个不在 中的符号*FEATURES*,然后像这样使用它#+

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

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

于 2010-12-01T12:41:48.343 回答
4

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

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

于 2010-11-26T20:43:26.550 回答
2

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

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

于 2013-06-13T20:25:54.913 回答