代码之家  ›  专栏  ›  技术社区  ›  Idan K

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

  •  33
  • Idan K  · 技术社区  · 15 年前

    我用c++模式运行Emacs23,但有一些缩进问题。

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

    这似乎是自动缩进的默认行为。 不过,我想把它改成这样:

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

    有没有一种方法可以通过配置c++模式或my.emacs文件来轻松完成这一任务?

    5 回复  |  直到 13 年前
        1
  •  41
  •   Chris    4 年前

    我的.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
  •  22
  •   Chris    4 年前

    这是我的。。。这与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)
    
        3
  •  9
  •   Chris    4 年前

    .emacs 文件:

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

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

    • 转到要缩进的行

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

    • 接受默认建议

    • 进入

    • 类型 标签

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

    看见 要更改的lisp代码。您可以在.emacs文件中:

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

    AStyle 自动将EXACS外部的C++源代码格式化。

        4
  •  3
  •   chen bin    4 年前

    将以下代码插入 ~/.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代码。我的文章中列出了破解代码的详细步骤,基本上你需要阅读这个函数 c-缩进线 在/usr/share/emacs/24.3/lisp/progmodes/cc中定义-命令.el

    稳定的 Emacs的版本(23.4,24.3,24.4)如果不更改默认设置(缩进有不同的配置文件,我的设置基于默认配置文件)。

        5
  •  1
  •   Mekk    10 年前

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

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