Emacs cc-mode 似乎还不能识别 C++0x 中引入的类型安全 enum class
。我得到的结果是第二个、第三个等枚举的双缩进:
enum class Color {
Blue,
Red,
Orange,
Green
};
我想要的是:
enum class Color {
Blue,
Red,
Orange,
Green
};
你能推荐一个添加到 .emacs
的好命令,这将使 cc-mode 对待 enum class
的方式与对待普通的旧 enum
?
最佳答案
这是问题所在:
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
确定语法树中不同位置的缩进。它可以被分配常量或函数。
这两个函数判断当前位置是否在inside enum class {...}
。如果是这种情况,它们会返回 0 或 '-,cc-mode 将其解释为缩进深度。如果不是,则返回默认值。
inside-class-enum-p
只是向上移动到前一个大括号并检查它之前的文本是否是“枚举类”。
关于c++ - C++0x枚举类的Emacs cc-mode缩进问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497374/