2

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

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

Y 在右边,如果我在与 的行上运行c-set-offset(with C-c C-o) Y < Z,它告诉我当前行偏移量是template-args-cont。最糟糕的是,任何低于此的代码,包括其他功能,都会完全搞砸标签。通常我只是小心地手动空格下一个函数的开头。

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

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

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

GNU Emacs 24.1.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
 of 2012-06-10 on bob.porkrind.org

在 mac OS X 10.8 上,但我确定我在 ubuntu 上看到过同样的问题,但我必须仔细检查版本。

有没有人找到解决方案?Corey 发现添加括号(X < Y)是一种解决方法。

4

1 回答 1

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;
}

它会打印3if #define TEMPLATEis 到源代码中,1否则,如果您cout << ...在 -op 处换行,&&除非您知道该文件的确切构建环境,否则无法确定正确的缩进。

于 2013-05-13T06:35:18.770 回答