c++ - C++0x枚举类的Emacs cc-mode缩进问题

标签 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-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/

相关文章:

emacs - 在 ansi-term 中使用 ssh 时 Shell 提示重复

java - 我如何解决枚举继承以重命名它?

java - 运行时类型识别

string - 在 Rust 中匹配 Option 静态字符串文字

c++ - 未定义对 `u_fopen_48' 的引用

emacs - Elisp 在 progn 上使用 apply 函数列表

c++ - wxWidgets中如何转发事件?

emacs - 不一致的 M-x align-regexp 与 C-u M-x align-regexp 行为

c++ - 如何为所有非数组类型专门化一个模板?

c++ - 在不同的命名空间中调用别名声明的基类构造函数