编辑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方法来完成基本相同的事情,请注释掉要重新编译的部分内容,请不要犹豫,建议它们!
答案 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-SPC
为mark-sexp
),然后对其进行评论(M-;
为comment-dwim
)。
在paredit 23中,只需输入;
就不会将任何不必要的东西推到线下。所以它会为你的第二个例子做正确的事情。如果您想要注释z
而不是y
,则只会将结束分隔符推送到另一行。