你如何使用Paredit注释掉全部或部分Lisp s-exp?

时间:2010-11-26 20:22:37

标签: emacs lisp paredit

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

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

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

(foo x
;    y
     z)

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

启用paredit-mode后,这不起作用。如果该点恰好在下面的第一个paren之前,那么就会发生这种情况:

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

然后键入分号,输入的是分号和换行符:

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

与评论部分s-expression相同:

(foo x
;    
     y
     z)

我认为,如果定义全部在一行上,则可行:

;(defparameter *foo* 10)

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

如果有更多的Lispy或Emacsy方法来完成基本相同的事情,请注释掉要重新编译的部分内容,请不要犹豫,建议它们!

4 个答案:

答案 0 :(得分:30)

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

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

(defun comment-sexp ()
  "Comment out the sexp at point."
  (interactive)
  (save-excursion
    (mark-sexp)
    (paredit-comment-dwim)))

答案 1 :(得分:8)

只是旁注:

#+#-读者宏非常适合评论性别。如果在*FEATURES*中找不到给定符号,则允许忽略以下sexp。只需选择不在*FEATURES*中的符号,并将其与#+一起使用,如下所示:

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

您可以使用C-M-SPC M-;标记S表达式(C-M-SPCmark-sexp),然后对其进行评论(M-;comment-dwim)。

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