如何禁用Eclipse CDT代码格式化器来处理一段代码块

19

CDT代码格式化程序有相当不错的选项,但似乎没有一个特性可以让用户告诉它忽略一段代码。这个特性在Java代码格式化程序中存在:

// @formatter:off
... // code that should not be formatted
// @formatter:on

这个功能是否存在而我不知道,或者有没有人知道任何好的解决方法?

在我的具体情况中,我正在尝试定义数据结构(枚举类型和字符串数组),我希望它们具有特定的布局。


注意:之前接受的答案是使用Astyle,因为在CDT原生支持此功能之前就提出了这个问题。自那时以来,已经添加了支持,并且@greywolf82最近添加了一个包含此信息的答案,因此接受的答案已更改为指向他的答案。感谢@greywolf82!(仍然可以使用Astyle、clang-format或其他格式化工具作为合理的替代方案。) - Freerobots
5个回答

5
使用Astyle(艺术风格)格式化工具,它比Eclipse CDT内置的格式化工具更加出色,并且具有您需要的功能:

http://astyle.sourceforge.net/astyle.html#_Disable_Formatting

例子:

#include <iostream>

int main(int argc, char** argv)
{
// *INDENT-OFF*
std::cout<<"hello world"<<'\n';
// *INDENT-ON*
}

使用astyle格式化这段代码不会缩进位于 // INDENT-OFF 和 // INDENT-ON 之间的代码,但它也会禁用astyle的其他格式化功能,比如在这种情况下指令之间的间距。

我自己将其配置为外部工具。

唯一的问题是外部工具没有热键,但有一个热键可以“运行最后启动的外部工具”,如果您只使用一个外部工具,它将起到同样的作用。

更多关于配置的细节(Linux):

Astyle:

您可以轻松地从发行版存储库或官方网站获取它。

要设置一个带有格式设置的配置文件:

http://astyle.sourceforge.net/astyle.html#_Options_File

我使用home文件夹变量,只需在您的$ HOME中创建.astylerc文件,我的包含:

--suffix=none
--style=allman
--indent=tab=4
--max-code-length=70
--close-templates
--keep-one-line-blocks
--break-elseifs
--break-closing-brackets
--align-reference=type
--align-pointer=type
--indent-classes
--indent-modifiers
--indent-switches
--indent-cases
--indent-labels
--indent-col1-comments
--min-conditional-indent=0
--pad-oper
--pad-header
--unpad-paren

Eclipse:

“运行”菜单--> “外部工具” --> “外部工具配置...” 添加一个新的“程序”,在配置窗口中:

  • 位置:/usr/bin/astyle(使用whereis或locate来检查)

  • 工作目录:${project_loc}

  • 参数:${selected_resource_loc}

在同样的窗口中,刷新选项卡:

  • 选中“完成后刷新资源”。

  • 选中“所选资源”

同一窗口,常见选项卡:

  • 在收藏夹菜单中显示,选中“外部工具”

我完全忘记了astyle!如果您从此处添加一些示例用法,我将接受此答案: http://astyle.sourceforge.net/astyle.html#_Disable_Formatting - Freerobots
好的,我会提供一些设置建议:当您将其作为外部工具添加到Eclipse中时,请在“Arguments”部分中使用“${resource_loc}”来配置它以格式化当前打开的文件。 - Freerobots
// *INDENT-OFF* 对任何人都有效吗?在我的astyle v2.03中,它被忽略了。 - veio

3

是的,你可以这样做,因为CDT从9.7版本开始支持此功能。行为与JDT完全相同。


谢谢!我在这里找到了跟踪此修复的错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=496249最近,我的团队正在使用 clang-format,它对我们来说非常有效,非常灵活,可以适应我们所需的样式。 - Freerobots
此外,供参考,标签如OP中所指定的。// @formatter:off<code> // @formatter:on - Freerobots

1
如果您使用的是OS X或Linux(我没有检查过Windows,但它可能受支持),您可以使用clang-formatCppStyleclang-format是一个格式化程序实用程序,它与Clang一起提供,并支持在C/C++/ObjC代码中的on/off注释// clang-format on// clang-format off。可以在此处找到有关构建Clang及其实用工具的介绍。http://clang.llvm.org/get_started.html 您不需要在系统上安装整个ClangLLVM文件,因为clang-format是一个独立的程序,可以在没有Clang的情况下工作。旧版本不支持on/off注释,请使用2015年2月的SVN版本3.7。

CppStyle是一款Eclipse插件,它使我们能够在Eclipse CDT中使用clang-formathttps://github.com/wangzw/cppstyle

顺便提一下,在CDT Bugzilla中有同样的功能请求。这个功能可能会在未来得到官方支持,但目前使用clang-formatAstyle似乎是更好的解决方案。https://bugs.eclipse.org/bugs/show_bug.cgi?id=453926


0

我想我可以把这些内容放在一个扩展名被格式化程序忽略的文件中,并在适当的地方包含这个文件。我试过了,它可以工作 - 数据结构会被索引器捕捉到(即自动完成功能可用)。不过,如果有类似于Java中的“@formatter:...”语法的等效语法就更好了。


这种方法的另一个缺点是重构(特别是重命名)无法正常工作。此外,对数据结构的更改似乎不会自动捕获,因此需要进行清理和重建周期。 - Freerobots

0
据我所知,答案很简单,这样的功能不存在。但你可以使用SDK来实现这样的功能。请注意,根据我的经验,文档非常不完整,并且很难找到一个愿意帮助你填补漏洞的Eclipse开发人员。但是,由于该功能在Java格式化程序中存在,并且它是一个开放源代码产品,也许你可以将该逻辑移植到C++格式化程序中。
你也可以避免对整个文件进行格式化,而选择仅按选择格式化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接