41

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

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

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

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

有没有办法通过配置 c++ 模式或我的 .emacs 文件轻松做到这一点?

4

5 回答 5

44

我的 .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

于 2009-03-19T19:18:16.677 回答
25

这是我的……这与 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)
于 2009-03-19T23:54:25.733 回答
12

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

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

长答案:...

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

  • 转到要缩进的行

  • 键入 CC CO(那是字母“O”,而不是零)

  • Enter接受默认建议

  • 键入“0”(即零)表示没有额外的缩进,按Enter

  • 键入Tab以重新缩进该行。

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

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

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

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

于 2009-03-20T00:14:26.823 回答
4

接受的答案实际上是错误的。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.org/posts/ccjava-code-indentation-in-emacs.html

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

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

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

于 2014-09-26T03:09:43.813 回答
1

在调整单个偏移量之前,配置首选样式。我使用 stroustrup,您可以尝试其他一些,请参阅http://www.emacswiki.org/emacs/IndentingC#toc1的名称和http://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup的例子

Mx customize-variable c-default-style (并为 C++_ 设置您的首选

于 2015-02-03T22:05:42.203 回答