Emacs 如何使用Paredit注释掉Lisp s-exp的全部或部分内容?
在编辑Lisp代码时,有时完全注释掉顶级定义很有用,如下所示: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 () ...) 。。
;(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之前到达所需位置。如果您希望超级安全,可以使用(或)而不是零。