Emacs 如何使用Paredit注释掉Lisp s-exp的全部或部分内容?

Emacs 如何使用Paredit注释掉Lisp s-exp的全部或部分内容?,emacs,lisp,paredit,Emacs,Lisp,Paredit,在编辑Lisp代码时,有时完全注释掉顶级定义很有用,如下所示: ;(defun some-fn-which-is-broken (x) ; ...) (foo x ; y z) #+nil (defun foo () ...) 。。。或者只注释掉s表达式的一部分,如下所示: ;(defun some-fn-which-is-broken (x) ; ...) (foo x ; y z) #+nil (defun foo () ...) 。。

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

;(defun some-fn-which-is-broken (x)
;  ...)
(foo x
;    y
     z)
#+nil
(defun foo ()
  ...)
。。。或者只注释掉s表达式的一部分,如下所示:

;(defun some-fn-which-is-broken (x)
;  ...)
(foo x
;    y
     z)
#+nil
(defun foo ()
  ...)
。。。然后重新编译文件并在REPL中测试某些内容,等等

如果启用了paredit模式,则此操作不起作用。如果该点正好位于下面第一个参数之前,则会发生以下情况:

(defun some-fn (x)
  ...)
输入分号,输入的是分号和换行符:

;
(defun some-fn (x)
  ...)
与注释掉s表达式的一部分相同:

(foo x
;    
     y
     z)
我认为,如果定义都在一行上,这是可行的:

;(defparameter *foo* 10)
。。。但否则我就不知道怎么做了。Paredit很棒,我真的很想继续使用它。是否有任何Lisper知道解决此问题的方法,或者有Emacs向导可以快速生成一点Emacs Lisp以绑定到类似
paredit-comment-out-s-expr


如果有一种更为简洁或易懂的方法来完成本质上相同的事情,请注释部分源代码以重新编译,请不要犹豫,推荐它们

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


一般来说,使用M-可能更容易进行评论;(
注释dwim
)而不是手动键入分号。

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

您可以非常轻松地使用一个简单的命令或宏来执行此操作:

(defun comment-sexp () "Comment out the sexp at point." (interactive) (save-excursion (mark-sexp) (paredit-comment-dwim))) (defun注释sexp() “在这一点上注释掉性别歧视。” (互动) (省去远足 (马克·塞克斯) (编辑评论dwim))) 只是一个旁注:

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

;(defun some-fn-which-is-broken (x)
;  ...)
(foo x
;    y
     z)
#+nil
(defun foo ()
  ...)

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

您可以使用
C-M-SPC M-
标记S表达式(
C-M-SPC
用于
标记sexp
),然后注释它(
M-;
用于
注释dwim


在paredit 23中,只需键入
不会推送任何东西,它不必离线。因此,对于第二个示例,它将做正确的事情。如果您想注释掉
z
而不是
y
,它只会将结束分隔符推到另一行。

!正是我想要的。谢谢@spacemanaki另外,多次按C-M-SPC可选择多个s表达式,多次按C-M-u可使您在按C-M-SPC之前到达所需位置。如果您希望超级安全,可以使用(或)而不是零。