使用C++ 0x枚举类的Emacs cc模式缩进问题

Ala*_*ing 33 c++ emacs enums indentation c++11

Emacs cc-mode似乎还没有识别enum classC++ 0x中引入的类型安全.我得到的结果是第二个,第三个等枚举的双缩进:

enum class Color {
    Blue,
        Red,
        Orange,
        Green
        };
Run Code Online (Sandbox Code Playgroud)

我想要的是:

enum class Color {
    Blue,
    Red,
    Orange,
    Green
};
Run Code Online (Sandbox Code Playgroud)

你能推荐一个好的命令添加到.emacs哪个会使cc模式处理enum class它与处理普通旧模式的方式相同enum吗?

nsc*_*hum 26

这就是问题:

cc模式在某种程度上依赖于关键字是单个单词的假设.添加支持enum_class代替enum class只是改变一些正则表达式的问题.

相反,Emacs将此视为一个类.解决这个问题的正确方法是教Emacs这是一个枚举.但这超出了答案的范围.

这是黑客:

因此,在这种情况下,我们将修改现有缩进以使其行为不同.(可以在这个要点中修改代码.)

(defun inside-class-enum-p (pos)
  "Checks if POS is within the braces of a C++ \"enum class\"."
  (ignore-errors
    (save-excursion
      (goto-char pos)
      (up-list -1)
      (backward-sexp 1)
      (looking-back "enum[ \t]+class[ \t]+[^}]+"))))

(defun align-enum-class (langelem)
  (if (inside-class-enum-p (c-langelem-pos langelem))
      0
    (c-lineup-topmost-intro-cont langelem)))

(defun align-enum-class-closing-brace (langelem)
  (if (inside-class-enum-p (c-langelem-pos langelem))
      '-
    '+))

(defun fix-enum-class ()
  "Setup `c++-mode' to better handle \"class enum\"."
  (add-to-list 'c-offsets-alist '(topmost-intro-cont . align-enum-class))
  (add-to-list 'c-offsets-alist
               '(statement-cont . align-enum-class-closing-brace)))

(add-hook 'c++-mode-hook 'fix-enum-class)

这没有经过严格测试.;)

这个怎么运作:

c-offsets-alist确定语法树中不同位置的缩进.它可以分配常量或函数.

这两个函数找出当前位置是否是内部enum class {...}.如果是这种情况,则返回0或' - ,cc模式解释为缩进深度.如果不是,则返回默认值.

inside-class-enum-p 只需向上移动到前一个大括号,并检查它之前的文本是否为"枚举类".

  • 当然.我添加了一些文档(并修改了一些代码). (2认同)