Emacs评论/取消注释当前行

时间:2012-03-13 17:12:09

标签: emacs elisp

我知道已经有一个关于这个问题的Emacs问题,并且已经关闭,但我发现它非常重要且非常重要。

基本上,我想评论/取消注释当前行。我希望用宏可以很容易,但我发现它确实不是。

如果当前行已注释,请取消注释。如果取消注释,请对其进行评论。我还要评论整行,而不仅仅是从光标位置。

我试过像这样的宏:

C-一个

'comment-dwim

但这只是评论一条线,而不是取消注释它,如果已经评论过。

我不确定它有多容易,但如果有某种方式,我真的很喜欢它。

另外,我非常喜欢这个想法的原因是,当我使用Geany时,我只使用 C-e 而且它非常完美。

6 个答案:

答案 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-;