我知道已经有一个关于这个问题的Emacs问题,并且已经关闭,但我发现它非常重要且非常重要。
基本上,我想评论/取消注释当前行。我希望用宏可以很容易,但我发现它确实不是。
如果当前行已注释,请取消注释。如果取消注释,请对其进行评论。我还要评论整行,而不仅仅是从光标位置。
我试过像这样的宏:
C-一个
'comment-dwim
但这只是评论一条线,而不是取消注释它,如果已经评论过。
我不确定它有多容易,但如果有某种方式,我真的很喜欢它。
另外,我非常喜欢这个想法的原因是,当我使用Geany时,我只使用 C-e 而且它非常完美。
答案 0 :(得分:90)
Trey的功能完美无缺,但不是很灵活。
请改为尝试:
(defun comment-or-uncomment-region-or-line ()
"Comments or uncomments the region or the current line if there's no active region."
(interactive)
(let (beg end)
(if (region-active-p)
(setq beg (region-beginning) end (region-end))
(setq beg (line-beginning-position) end (line-end-position)))
(comment-or-uncomment-region beg end)))
如果当前行或区域处于活动状态,则注释/取消注释。
如果您愿意,可以修改函数以在(un)注释当前行之后跳转到下一行:
(defun comment-or-uncomment-region-or-line ()
"Comments or uncomments the region or the current line if there's no active region."
(interactive)
(let (beg end)
(if (region-active-p)
(setq beg (region-beginning) end (region-end))
(setq beg (line-beginning-position) end (line-end-position)))
(comment-or-uncomment-region beg end)
(next-line)))
请注意,只有更改的内容是函数末尾添加的next-line
命令。
答案 1 :(得分:39)
尝试此功能,并绑定到您最喜欢的键:
(defun toggle-comment-on-line ()
"comment or uncomment current line"
(interactive)
(comment-or-uncomment-region (line-beginning-position) (line-end-position)))
答案 2 :(得分:9)
我接受了Trey的回答并对其进行了改进,以便当一个区域处于活动状态时它也能正常工作,但随后在该区域工作:
(defun comment-or-uncomment-line-or-region ()
"Comments or uncomments the current line or region."
(interactive)
(if (region-active-p)
(comment-or-uncomment-region (region-beginning) (region-end))
(comment-or-uncomment-region (line-beginning-position) (line-end-position))
)
)
(define-key c-mode-base-map (kbd "C-/") 'comment-or-uncomment-line-or-region)
答案 3 :(得分:2)
我很惊讶没有提到comment-region
例行程序。 (虽然我承认它可能表明我错过了一些东西。)我的.emacs文件中有以下几行,为期20年。它适用于我关心的大多数主要编程模式。
(global-set-key "\C-c\C-c" 'comment-region)
来自'comment-region'的文档
文档:注释或取消注释区域中的每一行。只是 C-u前缀arg,取消注释区域中的每一行。数字前缀arg ARG 表示使用ARG评论字符。如果ARG是否定的,删除那么多 而是评论字符。甚至,评论也会在每一行终止 对于换行不结束评论的语法。空白行 没有得到评论。
答案 4 :(得分:1)
我认为你误解了键盘宏的工作方式。 @Trey提供的是Emacs-Lisp命令。你可以在不理解Emacs-Lisp的情况下为自己完成这个。
首先找出执行所需操作的键序列,然后将该序列记录为宏。
你提出这个: C-a M - ; (M-;是comment-dwim
)。它能做到你想到的吗?如果没有,那么当你把它作为键盘宏播放时,它就不会神奇地工作。
答案 5 :(得分:1)
This answer适用于此处。它定义了用于注释或取消注释当前行的命令comment-region-lines
,或者定义了活动区域。
它类似于comment-or-uncomment-region
,但允许您决定是否取消注释或评论。它允许您嵌套注释,而不是在已经注释掉的情况下自动取消注释该区域。
使用数字前缀arg,它在Lisp中使用了许多评论开始字符(例如;
,;;
,;;;
,...。使用简单的C-u
前缀arg,它会取消注释。我将它绑定到C-x C-;
。