【问题标题】:Emacs C++-mode incorrect indentation?Emacs C++ 模式缩进不正确?
【发布时间】:2010-10-14 09:31:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 查看emacswiki.org/emacs/IndentingC#toc2">Emacs关于缩进C的wiki
  • 为了记录,这种缩进模式是 GNU 风格。所有 GNU 程序都必须遵循这种缩进风格。
  • 是的,我在某处读到过,但我受不了
  • 为您的用户而不是您自己编写代码通常是一种很好的做法。大多数不编写 GNU 代码的人使用其他样式。

标签: c++ emacs indentation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢!我一直在到处寻找这个......只要我记得。
    • (setq c-default-style "bsd" c-basic-offset 4) 用更少的行完成了很多。虽然缩进标签模式应该保留。
    • 我什么都做不了——这快把我逼疯了——花括号仍然在 if 语句中缩进。
    • 这很奇怪。当您在 c 文件中时,您是否看到变量 c-mode-common-hook 被覆盖?
    【解决方案3】:

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

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

    长答案:...

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

    • 转到要缩进的行

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

    • Enter 接受默认建议

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

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

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

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

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

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

    【讨论】:

    • 这似乎是最方便的方法,但是有没有一种方法可以定义一个包含所有更改的样式?
    • 有点晚了,但我必须说这是自定义缩进最简洁的方法,而且非常简单。我喜欢长答案部分。
    【解决方案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- 中定义的函数 c-indent-line cmds.el

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

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

    【讨论】:

      【解决方案5】:

      在调整单个偏移量之前,配置首选样式。我用 stroustrup,你可以试试其他的,名字见http://www.emacswiki.org/emacs/IndentingC#toc1,例子见http://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup

      M-x 自定义变量 c-default-style (并为 C++_ 设置您的首选

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2021-11-12
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        相关资源
        最近更新 更多