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

Emacs cc-mode indentation problem with C++0x enum class

本文关键字:模式 缩进 问题 cc Emacs 枚举 C++0x      更新时间:2023-10-16

Emacs cc模式似乎还不能识别C++0x中引入的类型安全enum class。我得到的结果是第二个、第三个等枚举的双缩进:

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

我想要的是:

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

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

这就是问题所在:

cc模式在某种程度上依赖于关键字是单个单词的假设。添加对enum_class而不是enum class的支持只需更改一些regexp即可。

相反,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)

这并没有经过严格的测试。)

工作原理:

CCD_ 7确定语法树中不同位置的缩进。它可以被分配常量或函数。

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

inside-class-enum-p只是向上移动到前一个大括号,并检查其前面的文本是否为"enum-class"。