怎么让emacs自动使用多行注释?

目前的多行注释是这样的: 也就是多个单行注释的样子

请问怎么才能在选中多行的时候让它自动使用多行注释:

找了半天也没找到是啥函数~

如果用的是默认的注释插件,evil-nerd-commenter,似乎可以用 gca

另外一个 evil-commentary 似乎就没有这功能了。

既然你是先选中再注释,块注释也没有比行注释更方便。

而且块注释有个几个弱点:

  1. 不能嵌套
  2. 不方便部分行 uncomment

当你在调试或者进行二分法排错的时候就很蛋疼了。


块注释的优点是,可以在注释一行当中的一部分,比如在 c-mode 中:

int foo(int bar) {
}

选中参数,注释:

int foo(/*int bar*/) {
}

所以 c-mode 干脆把行注释也用 /**/,这也不符合你的预期:

/* int foo(int bar) { */
/* } */

js-mode 相反,所有注释都用 //,但是也不必担心如何注释部分参数

function foo(bar) {
}

换行是不太好看,临时凑和用,毕竟你不需要长时间留着不用的参数:

function foo(// bar
            ) {
}

至于 evil-nerd-commenter 我认为搞复杂了,引入了太多快捷键,记忆负担且不说,也带来了新的问题,比如cp 是注释一个 paragraphs,但有时你可能不是一眼就能观察到 paragraphs 开始/结束位置,所以就变得有点不可预测。所以选中再注释,是比较笨也比较可靠的方式。

没错, 我想弄多行注释的唯一原因是因为 这种单行注释多了就比较丑~ 而手动在开始和结束的地方敲/**/又略麻烦… 有一些IDE一般都会有这么个功能, 但是emacs没见过, 我测试那几个注释的函数, 注释方式都是多个单行~

gca? 是个啥

如果你块注释了一大片代码,而后又想反注释中间几行,IDE 能明白你的意图?那倒是很智能

(defun 注释()
  (if (多行?)
      (注释块)
    (注释行)))

(defun 注释行()
  (if (当前行存在注释符?)
      (反注释)
    (if (外围存在注释块?)
        (分割外围注释块, 把当前行排除在外)
      (注释))))

(defun 注释块()
  (if (当前块存在注释符?)
      (反注释)
    (if (外围存在注释块?)
        (分割外围注释块, 把当前块排除在外)
      (注释))))

vim 上的 nerd-commenter 支持用这个命令转换插件格式。至于 Emacs 的移植上不知道是否还有这个功能。

你可以通过定义 evil-surround 来实现多行注释。

(add-hook 'c++-mode-hook (lambda ()
                           (push '(?/ . ("/* " . " */")) evil-surround-pairs-alist)))

效果是 visual state 选中文本后按 s/ 在文本两头加注释符号。

然而, 我的elisp还看不懂这些… 这是弄了个啥

我懂你意思了, 不过这函数略有问题, 出来的不是 /**/, 而是两个/在两边…

一个简陋的实现, 只加不减,不考虑嵌套/配对:

(defun my-comment-region()
  (interactive)
  (save-restriction
    (narrow-to-region (region-beginning) (region-end))
    (goto-char (point-max))
    (unless (re-search-backward "\\*\\/" nil t)
      (insert "*/")
      (goto-char (point-min))
      (unless (re-search-forward "\\/\\*" nil t)
        (insert "/*\n")))
    ))

多谢, 只是用来写测试的时候, 代码多了, 这种注释简洁点

兄弟你这份代码,在//前面,怎么插入一个tab实现对齐呀 :innocent:

我会了,\t就行,感谢大佬的代码。

楼上所有办法都太麻烦啰嗦了,最高效的办法: 1、选中需要注释的行 2、M-; 搞定!!!!!

2 个赞

你也不看看原贴是五年前的,用的还是 evil-mode

此话题已在 3 天后被自动关闭。不再允许新回复。