在emacs中,如何在C / C ++中禁用注释自动缩进?

时间:2012-06-16 06:48:21

标签: emacs indentation mode

有时我希望在行(//)或行/* */上完全左对齐临时注释。但是,CC Mode在键入第二个键时通过自动缩进来覆盖它。一般来说,我喜欢自动缩进关键字等,但我更希望它被禁用以进行评论。 (更新:即。我想禁用 c-electric - 键绑定触发注释缩进的方式,但注释仍应正常缩进)

我已经尝试将这些行放在.emacs中,但它不会阻止这种行为。

(c-electric-slash nil)
(c-electric-star nil)

2 个答案:

答案 0 :(得分:9)

简答:

(eval-after-load 'cc-mode
  '(progn
     (define-key c-mode-base-map "/" 'self-insert-command)
     (define-key c-mode-base-map "*" 'self-insert-command)))

以下是我的观点:

找出绑定到/的函数:C-h k /

它说“/运行命令c-electric-slash,这是一个交互式编译的Lisp 函数'cc-cmds.el'“。

(如果您没有看到cc-cmds.el的链接,那么您没有安装elisp源。假设您不在Windows上,可以使用系统的软件包管理器进行安装emacs-el包,然后重试。)

按照该链接打开cc-cmds.el。搜索c-electric-slash除了函数定义之外没有找到任何其他内容,因此密钥不会绑定在此文件中。从此目录中搜索cc-mode.el会显示:

(define-key c-mode-base-map "/" 'c-electric-slash)

现在我们知道要覆盖/键绑定的“keymap”的名称。

如果你在你的init文件中添加这样的东西,你可能会在启动时遇到错误:

(define-key c-mode-base-map "/" 'self-insert-command)

...因为在cc-mode.el之前加载了init文件,并且c-mode-base-map未定义。所以我们使用eval-after-load(在我的答案的顶部)。第一个参数'cc-mode必须匹配cc-mode.el末尾的provide语句。如果您不知道progn的含义,请执行C-h f progn

如果您喜欢这种学习/发现Emacs的方式,您可以考虑阅读我的"How to learn Emacs"

答案 1 :(得分:0)

我建议您查看c-indent-comment-alist& c-indent-comments-syntactically-p个变量。请参阅有关此变量的帮助的更多信息(C-h v)以及CC模式手册的“Customizing Indentation”和“Style Variables”部分