Emacs评论/取消评论当前行

我知道Emacs已经有了一个关于这个问题的问题,而且这个问题已经结束了,但是我觉得这个问题相当重要。

基本上,我想评论/取消注释当前行。 我以为这是一个非常容易的macros,但是我发现它确实不是。

如果当前行被注释,则取消注释。 如果未注释,请对其进行评论。 而且我也要评论整个行,而不仅仅是从光标位置。

我尝试了这样一个macros:

'comment-dwim 

但是,这只能用于评论一条线,而不是取消评论,如果它已经评论。

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

另外,我非常喜欢这个想法的原因是当我使用Geany的时候,我只是用了Ce而且是完美的。

试试这个function,并绑定到你最喜欢的键:

 (defun toggle-comment-on-line () "comment or uncomment current line" (interactive) (comment-or-uncomment-region (line-beginning-position) (line-end-position))) 

Trey的function很完美,但不是非常灵活。

试试这个:

 (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命令才会被更改。

我接受了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) 

我很惊讶comment-region例程没有被提及。 (虽然我承认这可能表明我错过了一些东西。)我已经在我的.emacs文件中拥有以下行20年的更好的一部分。 它在我所关心的大多数主要编程模式中运行良好。

(global-set-key "\Cc\Cc" 'comment-region)

从“评论区”的文档来看,

文件:评论或取消注释该地区的每一行。 只用Cu前缀arg,取消区域中每行的注释。 数字前缀arg ARG表示使用ARG注释字符。 如果ARG是否定的,则删除多个注释字符。 即使是换行符不结束注释的语法,注释也会在每一行中被终止。 空白行不会得到意见。

我想你误解了键盘macros如何工作。 @Trey提供的是一个Emacs-Lisp命令。 你可以在不理解Emacs-Lisp的情况下完成这个任务。

首先找出你想要的键序列,然后把这个序列logging成一个macros。

你提出这个: Ca M-; (M-;是comment-dwim )。 它是做你想到的? 如果没有的话,当你把它作为一个键盘macros来播放的时候,它不会神奇地工作。

这个答案在这里适用。 它定义了注释或取消注释当前行的命令comment-region-lines行,或者区域(如果活动)。

它与comment-or-uncomment-region类似,但它可以让您决定是取消注释还是注释。 它可以让你嵌套评论,而不是自动取消评论区域,如果它已经被注释掉。

使用数字前缀arg,它会使用许多注释开始字符(例如,, ;;;;;; …在Lisp中)。 用简单的Cu前缀arg取消注释。 我将它绑定到Cx C-;