我如何说服emacs C ++模式而不是模板参数?

时间:2013-05-10 00:13:04

标签: c++ emacs

这个问题困扰了我多年,我想知道是否有人有解决方案。问题是在C ++模式下,似乎emacs无法确定<运算符是否“小于”或“开始模板参数”,这会混淆自动缩进功能。考虑这样的事情:

bool foo() {
  return X < Y &&
             Y < Z;
}

Y向右移动,如果我在c-set-offset的行上运行C-c C-oY < Z},它会告诉我当前行偏移为{{1 }}。最糟糕的是,包括其他功能在内的任何代码都将完全搞砸了标签。通常我只是小心地手动分隔下一个函数的开头。

编辑:要确认,以下代码正确缩进:

template-args-cont

编辑2:我有一些自定义样式和偏移量的东西,但即使用-q启动emacs来忽略我的.emacs文件也会出现同样的问题。我目前正在使用版本:

bool foo() {
  return X == Y &&
    Y == Z;
}

在Mac OS X 10.8上,但我确定我在ubuntu上看到了同样的问题,但是我必须进行双重检查。

有没有人找到解决方案? Corey发现添加parens GNU Emacs 24.1.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2012-06-10 on bob.porkrind.org 是一种解决方法。

1 个答案:

答案 0 :(得分:3)

这看起来更像是C ++问题,而不是cc-mode。后者可能会使用一些更智能的启发式方法来处理更简单的问题,例如你的问题,但一般来说,如果不知道X是否为模板,这种小于/模板开放的冲突很难解决。

请考虑以下代码:

#include <iostream>
using std::cout;

#ifdef TEMPLATE
template <int I>
int X(int arg)
{
  return I + arg;
}
#else
int X = -1;
#endif

int main(int argc, char** argv)
{
  const int Y = 0;

  int foo = 1, bar = 2;

  cout << (X < Y && 10 > (foo + bar)) << '\n';
  return 0;
}

如果3在源中,则打印#define TEMPLATE,否则打印1,如果在cout << ...打破&&行,则会打印出来找出适当的缩进,除非你知道该文件的确切构建环境。