这个问题困扰了我多年,我想知道是否有人有解决方案。问题是在C ++模式下,似乎emacs无法确定<
运算符是否“小于”或“开始模板参数”,这会混淆自动缩进功能。考虑这样的事情:
bool foo() {
return X < Y &&
Y < Z;
}
Y向右移动,如果我在c-set-offset
的行上运行C-c C-o
(Y < 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
是一种解决方法。
答案 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 << ...
打破&&
行,则会打印出来找出适当的缩进,除非你知道该文件的确切构建环境。