在emacs中,如何在C/C++;?

在emacs中,如何在C/C++;?,emacs,indentation,mode,Emacs,Indentation,Mode,有时我希望在一行(//)或一块行/**/上有完全左对齐的临时注释。但是,CC模式通过在键入第二个键时自动缩进来覆盖此功能。一般来说,我喜欢自动缩进关键字等,但我更喜欢它被禁用的评论。(更新:即,我想禁用c-electric键绑定触发注释缩进的方式,但注释仍应正常缩进) 我曾尝试将这些行放入.emacs,但这并不能阻止这种行为 (c-electric-slash nil) (c-electric-star nil) 我建议查看c-indent-comment-alist和c-indent-com

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

我曾尝试将这些行放入
.emacs
,但这并不能阻止这种行为

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

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

(eval-after-load 'cc-mode
  '(progn
     (define-key c-mode-base-map "/" 'self-insert-command)
     (define-key c-mode-base-map "*" 'self-insert-command)))
我是这样做的:

(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-hk/

它说“/运行命令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)
…因为您的init文件是在cc-mode.el之前加载的,并且
c-mode-base-map
未定义。因此,我们在加载后使用
eval
(见我的答案顶部)。第一个参数,
'cc-mode
,必须与cc-mode.el末尾的
provide
语句匹配。如果您不知道
progn
的意思,请执行
C-h f progn


如果你喜欢这种学习方式/发现Emacs,你可以考虑阅读我的.< /p>我还没有读过它(更不用说用新的Emacs术语)了,但是我有一种感觉,你的建议改变了事物的缩进。我不想改变缩进行为:我确实希望注释行在大多数情况下正常缩进,但我不希望(c-electric-slash和(c-electric-star指示当按下

/
*
时会出现缩进。这可能很简单,只需将
/
*
键从电气功能重新绑定到
自插入命令
,但仅适用于CC模式(这是我不知道如何做的位).太棒了!多好的解释啊!.而且也很有效:)…谢谢你…我一定会阅读你建议的指南。建议:更新该指南,以便在加载后使用
和eval
。为了实现它的价值,我在创建从
c-mode
派生的主模式时遇到了这个问题。通过将两行
define key
行添加到我模式的键映射定义中(并将
c-mode-base-map
更改为本地地图的名称),我能够消除这种行为。谢谢!