Emacs评论/取消评论当前行[重复]
Posted
技术标签:
【中文标题】Emacs评论/取消评论当前行[重复]【英文标题】:Emacs comment/uncomment current line [duplicate] 【发布时间】:2012-03-30 03:10:23 【问题描述】:我知道已经有一个关于此的 Emacs 问题,并且已关闭,但我发现它非常相关和重要。
基本上,我想注释/取消注释当前行。我原以为使用宏会相当容易,但我发现事实并非如此。
如果当前行被注释,取消注释。如果未注释,请注释它。而且我还会注释掉整行,而不仅仅是从光标位置。
我试过这样的宏:
C-a
'comment-dwim
但这仅适用于注释一行,如果它已被注释,则不能取消注释。
我不确定这有多容易,但如果有什么办法,我真的很喜欢。
另外,我非常喜欢这个想法的原因是,当我使用 Geany 时,我只是使用了 C-e,它非常完美。
【问题讨论】:
参见 (emacswiki.org/emacs/CommentingCode) 底部的“另请参阅”。 il-debug 看起来很方便。 Emacs 25 将comment-line
绑定到 C-x C-;
。
如果你喜欢 Geany 的注释/取消注释,你应该选择一些带有 shift 和箭头的行然后使用 M-;
组合 C-x C-;
或 C-a C-;
不起作用。
【参考方案1】:
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)))
如果当前行或区域处于活动状态,则对当前行或区域进行匹配/取消匹配。
如果您愿意,可以修改函数以在(取消)注释当前行之后跳转到下一行,如下所示:
(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
命令。
【讨论】:
完美运行!谢谢! 如果在注释一行之后,光标移动到下一行,这实际上可能会更好,因此重复按下键绑定会注释连续的行。有什么建议吗? @justingordon 我在原始版本下编辑了一个替代版本。享受吧! 这太棒了!它应该是默认行为。 使用next-logical-line
而不是 next-line
可能更有意义,这样万一行长,用户不会评论它,然后再取消评论。【参考方案2】:
试试这个功能,并绑定到你最喜欢的键:
(defun toggle-comment-on-line ()
"comment or uncomment current line"
(interactive)
(comment-or-uncomment-region (line-beginning-position) (line-end-position)))
【讨论】:
谢谢,效果很好! 完美!正是需要的。comment-or-uncomment-region
具有误导性。它仅适用于线路。
@Maven在一个region上工作,传入的region是从行首到行尾...
嗯!!也许我匆忙测试了它。我会再次检查。如果我在一条线上选择部分区域,它会包括整条线吗?【参考方案3】:
我接受了 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)
【讨论】:
感谢您还提到如何绑定到组合键。 我必须将组合键部分更改为:(global-set-key (kbd "<C-kp-divide>") 'comment-or-uncomment-line-or-region)
才能使其工作。
当我将“C-/”替换为“C-m”时,它确实不起作用。为什么?
C-m
硬连线到 RET
,类似于 C-g
的硬连线方式。我认为您不能将其用于其他任何用途。【参考方案4】:
我很惊讶comment-region
例程没有被提及。 (尽管我承认这可能表明我错过了一些东西。)在 20 年的大部分时间里,我的 .emacs 文件中有以下行。它适用于我关心的大多数主要编程模式。
(global-set-key "\C-c\C-c" 'comment-region)
来自'comment-region'的文档
文档:注释或取消注释该区域中的每一行。只需 C-u 前缀 arg,取消注释区域中的每一行。数字前缀 arg ARG 表示使用 ARG 注释字符。如果 ARG 是负数,删除那么多 而是注释字符。注释在每一行都终止,即使 对于换行符不结束注释的语法。空行做 没有得到 cmets。
【讨论】:
我 +1 了你的答案,因为 comment-region 总是很好......但据我所知,它并不像 OP 所要求的那样方便:无论他在当前线路的哪个位置,他都希望能够打开/关闭 cmets。使用 comment-region 仍然需要:从行首开始,设置标记,从行尾开始,然后是 comment-region(这比一个独特的快捷方式要复杂得多)切换 cmets 开/关)。但是我的 Emacs-fu 并不强大,所以我可能错了...... OP 知道comment-dwim
是comment-region
功能的超集。
@TacticalCoder 是的,你是对的。我一直在使用与切换绑定的注释区域很长时间,以至于我忽略了适当的细节而没有看到它。
@event_jr:不,comment-dwim
绝对是 not 的超集 comment-region
功能。这是一个常见的误解。【参考方案5】:
我认为您误解了键盘宏的工作原理。 @Trey 提供的是 Emacs-Lisp 命令。不了解 Emacs-Lisp 也可以自己完成。
首先找出执行所需操作的键序列,然后将该序列记录为宏。
你提出了这个:C-a M-;(M-;是comment-dwim
)。它是否符合您的想法?如果不是,那么当您将其作为键盘宏播放时,它就不会神奇地工作。
【讨论】:
【参考方案6】:This answer 适用于此。它定义了命令comment-region-lines
对当前行或区域(如果处于活动状态)进行设置或取消设置。
它类似于comment-or-uncomment-region
,但它让您决定是取消评论还是评论。它允许您嵌套 cmets,而不是在区域已被注释掉时自动取消注释。
使用数字前缀 arg 时,它会使用很多注释开始字符(例如,;
、;;
、;;;
、... 在 Lisp 中)。使用普通的 C-u
前缀 arg 它会取消。我将它绑定到C-x C-;
。
【讨论】:
以上是关于Emacs评论/取消评论当前行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Microsoft VSCode 隐藏/取消隐藏评论?
让 Emacs 填充段落与类似 javadoc 的注释配合得很好