Emacs C++模式下的缩进不正确?

问题描述 投票:36回答:5

我在Emacs 23的C++模式下运行,遇到了一些缩进的问题,假设我有这样的代码,这似乎是自动缩进的默认行为。

void foo()
{
   if (cond)
     { <---
        int i;
        ...
     } <---
}

这似乎是自动缩进的默认行为,但是我想改变它,使它变成这样。

void foo()
{
   if (cond)
   {
      int i;
      ...
   }
}

有没有办法通过配置c++模式或我的.emacs文件来实现这个目标?

c++ emacs indentation
5个回答
41
投票

我的.emacs文件中有以下内容。

(defun my-c++-mode-hook ()
  (setq c-basic-offset 4)
  (c-set-offset 'substatement-open 0))
(add-hook 'c++-mode-hook 'my-c++-mode-hook)

你可以在任何一行上按[ctrl -c -ctrl -s]来决定要编辑的偏移量。 在第一行中,如果后面有一个大括号 if 它会说 substatement-open.


22
投票

这是我的......这符合visual studio的默认设置。

(defun my-c-mode-common-hook ()
 ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode
 (c-set-offset 'substatement-open 0)
 ;; other customizations can go here

 (setq c++-tab-always-indent t)
 (setq c-basic-offset 4)                  ;; Default is 2
 (setq c-indent-level 4)                  ;; Default is 2

 (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))
 (setq tab-width 4)
 (setq indent-tabs-mode t)  ; use spaces only if nil
 )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

9
投票

简短的回答。把这行写进你的 .emacs 文件。

(c-set-offset 'substatement-open 0)

长答案:...

对于我们这些刚接触 emacs-lisp 的人来说,有一个非常简单的方法,在 http:/www.cs.cmu.edu:

  • 转到你想缩进的那一行

  • C-C C-O型(那是字母 "O",不是0)。

  • 媒体 进入 接受默认建议

  • 输入 "0"(就是零),不需要额外的缩进,按 进入

  • 种类 标签 来重新缩进该行。

  • 在这种情况下,未来的"{"将有正确的标签设置,直到你重新启动emacs。

这个方法的好处是,你可以真正的做到 看到 你想修改的lisp代码。你可以放在你的.emacs文件中。

(c-set-offset 'SYNTACTIC-SYMBOL OFFSET)

另外,你可能会想看看这个程序。风格 来在emacs之外自动格式化C++源代码。


3
投票

实际上,公认的答案是错误的。Emacswiki也帮不上忙。

在下面的代码中插入 ~/.emacs:

(defun fix-c-indent-offset-according-to-syntax-context (key val)
  ;; remove the old element
  (setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist))
  ;; new value
  (add-to-list 'c-offsets-alist (cons key val)))

(add-hook 'c-mode-common-hook
          (lambda ()
            (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
              ;; indent
              (fix-c-indent-offset-according-to-syntax-context 'substatement-open 0))
            ))

http:/blog.binchen.orgpostsccjava-code-indentation-in-emacs.html。 的技术细节。

关键的问题是c-set-offset是指 不可靠 来检测语法上下文了(Emacs24.3.1)。所以唯一可靠的方法就是分析emacs的原始代码。黑客代码的详细步骤在我的文章中列出,基本上你需要阅读函数 c-indent-line 其中定义在usrshareemacs24.3lispprogmodescc-cmds.el中。

有些人抱怨说我的设置不工作。事实上,它在所有的 稳定的 版本的Emacs(23.4,24.3,24.4),如果你不改变默认设置(缩进有不同的配置文件,我的设置是基于默认配置文件)。

我的关键点是,关于这个具体问题,你需要阅读代码。


1
投票

在调整单个偏移量之前,先配置好喜欢的风格。我用的是stroustrup,你我的尝试一些其他的,见 http:/www.emacswiki.orgemacsIndentingC#toc1 姓名和 http:/en.wikipedia.orgwikiIndent_style#Variant:_Stroustrup。 为例

M-x customize-variable c-default-style(并为C++_设置你喜欢的风格)。

© www.soinside.com 2019 - 2024. All rights reserved.