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

11
有时候我希望在行或者一块代码的注释中使用临时注释并让它们左对齐。然而,CC Mode会在输入第二个键时自动缩进,这覆盖了我的设置。通常情况下,我喜欢关键字等自动缩进,但是我希望在注释中禁用它(更新:即我想禁用c-electric-键绑定触发注释缩进的方式,但注释仍应该正常缩进)。我尝试过将这些行放入.emacs文件中,但无法阻止这种行为。
(c-electric-slash nil)
(c-electric-star nil)
2个回答

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”的名称。 如果您将以下内容添加到初始化文件中,可能会在启动时出现错误:
(define-key c-mode-base-map "/" 'self-insert-command)

因为你的初始化文件在cc-mode.el之前加载,而c-mode-base-map未定义。所以我们使用eval-after-load(就像我回答开头的那样)。第一个参数'cc-mode必须与cc-mode.el末尾的provide语句匹配。如果你不知道progn是什么意思,请执行C-h f progn
如果你喜欢这种学习/发现Emacs的方式,你可以考虑阅读我的"如何学习Emacs"

太棒了!解释得非常好!而且它还有效 :) ...谢谢...我一定会阅读你建议的指南。 - Peter.O
建议:更新此代码以使用 with-eval-after-load - Clément
说句实话,在我创建一个从c-mode派生的主模式时,我一直在努力解决这个问题。通过将这两个define-key行添加到我的模式键映射的定义中(并将c-mode-base-map更改为我的本地映射的名称),我能够消除这种行为。谢谢! - mattsilver

0
我建议查看 c-indent-comment-alistc-indent-comments-syntactically-p 变量。有关这些变量的更多信息,请参见帮助 (C-h v) 和 CC-mode 手册中的 " 自定义缩进 " 和 " 样式变量 " 部分。

我还没有完全阅读它(更别说处理新的emacs术语了),但我有一种感觉,你的建议会改变缩进方式。我不想改变缩进行为:在大多数情况下,我确实希望注释行能够正常缩进,但我不想让 (c-electric-slash(c-electric-star 决定缩进发生在按下 /* 时。也许简单的方法就是将 /* 键从 electric 函数重新绑定到 self-insert-command,但仅限于 CC Mode(这是我不知道如何做的部分)。 - Peter.O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接