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

时间:2011-06-27 18:40:18

标签: c++ emacs enums c++11 indentation

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

enum class Color {
    Blue,
        Red,
        Orange,
        Green
        };

我想要的是:

enum class Color {
    Blue,
    Red,
    Orange,
    Green
};

你能否推荐一个好的命令添加到.emacs,这将使cc模式处理enum class的方式与处理普通旧enum的方式相同?

1 个答案:

答案 0 :(得分:26)

这是问题所在:

cc-mode在某种程度上依赖于关键字是单个单词的假设。添加对enum_class而不是enum class的支持只需更改一些正则表达式。

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

这是黑客:

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

(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确定语法树中不同位置的缩进。它可以被赋予常量或函数。

这两个函数可以确定当前位置是 in enum class {...}。如果是这种情况,则返回0或' - ,cc模式解释为缩进深度。如果不是,则返回默认值。

inside-class-enum-p只需移动到前一个大括号,并检查它前面的文本是否为“枚举类”。