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

时间:2009-03-19 19:08:12

标签: c++ emacs indentation

我正在使用c ++模式运行emacs 23并且存在一些缩进问题。 假设我有这段代码:

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

这似乎是自动缩进的默认行为。 但是我想改变它,所以它会是这样的:

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

有没有办法通过配置c ++模式或我的.emacs文件来轻松完成?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:21)

这是我的...这符合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)

答案 2 :(得分:9)

简短回答:将此行放入.emacs文件中:

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

答案很长:......

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

  • 转到要缩进的行

  • 输入C-C C-O(字母“O”,而非零)

  • Enter 接受默认建议

  • 输入“0”(即零),无需额外缩进,按 Enter

  • 输入标签以重新加入该行。

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

这个方法的好处是,您实际上可以查看要更改的lisp代码。您可以输入.emacs文件:

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

此外,您可能需要查看程序AStyle以自动格式化emacs之外的C ++源代码。

答案 3 :(得分: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 '(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.org/posts/ccjava-code-indentation-in-emacs.html

关键问题是c-set-offset 不可靠以便再次检测语法上下文(Emacs24.3.1)。所以唯一可靠的方法是分析原始的emacs代码。我的文章中列出了破解代码的详细步骤,基本上您需要阅读/usr/share/emacs/24.3/lisp/progmodes/cc-中定义的函数 c-indent-line 。 cmds.el

有些人抱怨我的设置不起作用。实际上它适用于所有稳定版本的Emacs(23.4,24.3,24.4),如果你不改变默认设置(缩进有不同的配置文件,我的设置基于默认配置文件)。 / p>

我的关键点是,在这个特定问题上,您需要阅读代码。

答案 4 :(得分:0)

在调整单个偏移之前,请配置首选样式。我使用stroustrup,你尝试其他人,请参阅http://www.emacswiki.org/emacs/IndentingC#toc1了解名称,http://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup了解示例

M-x customize-variable c-default-style (并为C ++ _

设置首选项