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-dwimcomment-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 的注释配合得很好

Eclipse评论/取消评论快捷方式?

在vim中注释/取消注释多个固定行

sql 3 WordPress评论相关的SQL查询。取消所有评论,删除所有未批准的评论,并删除垃圾评论

通过匿名委托取消订阅事件[重复]