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
的方式相同?
答案 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
只需移动到前一个大括号,并检查它前面的文本是否为“枚举类”。