【问题标题】:Emacs cc-mode indentation problem with C++0x enum classC++0x枚举类的Emacs cc-mode缩进问题
【发布时间】:2011-09-23 18:03:35
【问题描述】:

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 不能很好地与 C++0x 配合使用。
  • 这是 C++0x 的少数问题之一。我正计划做一些 ELISP 工作来纠正这个问题,但我现在没有真正需要它。问题应该不难,因为它将 enum 和 class 视为两个关键字(不能相互跟随),这会导致双缩进。
  • 您是否尝试向 发送错误报告?
  • 我现在会的,谢谢。但有了这个问题,我正在寻找一个临时解决方案添加到.emacs,直到 cc-mode 更新。
  • 您使用哪种 cc-mode 样式?

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


【解决方案1】:

这是问题所在:

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

这两个函数判断当前位置是否在enum class {...}内。如果是这种情况,它们会返回 0 或 '-,cc-mode 将其解释为缩进深度。如果不是,则返回默认值。

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

【讨论】:

  • 嗨,您能否简要介绍一下黑客正在做什么。换句话说,它是如何识别这种特殊情况的?我正在慢慢学习 lisp,所以我非常感谢像这样的优秀代码作为学习更多内容的机会。
  • 当然。我添加了一些文档(并稍微修改了代码)。
  • 有一个缺点:如果你的枚举类有一个尾随“,”结束的“}”将不会正确缩进。例如,“枚举类 A { one=1,two=2,}”
  • 非常感谢,这非常好。我只需要用“*”替换正则表达式中的最后一个“+”,但有人在 gist 上写了它。
  • 在 Emacs 27 中不再需要这个 hack,它默认正确缩进“enum class”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多