【发布时间】:2011-01-31 04:42:45
【问题描述】:
我对 VIM 比较陌生。我有一些源代码,这是一团糟。乍一看,我至少希望对代码有一个清晰而有条理的视图,所以我希望它的格式正确,我的意思是缩进取决于函数的深度等等。
我想知道是否可以使用 VIM 来完成,否则您可以推荐哪些其他命令行工具。
谢谢
【问题讨论】:
标签: vim code-formatting
我对 VIM 比较陌生。我有一些源代码,这是一团糟。乍一看,我至少希望对代码有一个清晰而有条理的视图,所以我希望它的格式正确,我的意思是缩进取决于函数的深度等等。
我想知道是否可以使用 VIM 来完成,否则您可以推荐哪些其他命令行工具。
谢谢
【问题讨论】:
标签: vim code-formatting
有一个 vim 插件可以在 vim 中对您的代码进行格式化。它叫做 vim-autoformat,你可以在这里下载:
https://github.com/vim-autoformat/vim-autoformat
它将外部代码格式化程序集成到 vim 中。例如,如果要格式化C、C++、C#或Java代码,需要安装程序astyle,vim会自动设置为格式化程序。
【讨论】:
我现在强烈推荐 clang 格式。一旦安装了 clang-format,它就可以将 clang-format 简单地集成到 Vim 中:
http://clang.llvm.org/docs/ClangFormat.html#vim-integration
它是唯一真正懂你的C++代码的代码美化器,美化代码更像人而不是机器真的很聪明。例如:
void TestFunction(int argument1, int argument2,
int argument3);
void TestFunctionVeryLongName(int argument1,
int argument2,
int argument3);
void TestFunctionWithRidiculouslyLongName(
int argument1, int argument2, int argument3);
【讨论】:
equalprg 绑定。这允许您使用G=gg 或其他= 缩进选项调用clang-format。只需将以下内容放入您的 .vimrc 文件中:autocmd FileType c,cpp setlocal equalprg=clang-format
还有一个依赖clang-format的Vim插件:vim-clang-format
然后您可以简单地将格式化命令映射到适合您的任何内容。
【讨论】:
只是必须解决这个确切的问题,所以我想我会为节省其他人一些时间做出贡献。
您可以使用gg=G 缩进您的代码。但是,当您想要调整自动缩进的发生方式时,事情就变得难以理解了。因此,如果您只关心删除错误的空白而不真正关心格式样式,gg=G 是最快的方法,因为它是内置的。
如果您确实想控制样式(例如,您试图使您的代码符合a style guide),那么您将需要一个外部工具来处理您的文件。你可以在 vim 中调用该工具::%!<toolname> <options>。这会将文件通过工具传输并重新加载处理后的结果。 (显然,您也可以将它用于您想要对文件执行的任何其他操作)
那么下一个问题是,你应该选择什么外部工具?不管怎样,方法都是一样的:
现在,您使用哪种工具取决于您要复制的风格。如果您尝试复制一种广泛使用的样式,那么您所需要的很可能是astyle。
如果您尝试复制自定义样式,则需要两件事:
在uncrustify 和greatcode 之间,您应该能够完全复制您想要的样式。
实际上,我撒谎了。还有另一种方法,称为clang-format。但是,您将需要阅读有关它的文档,并且它仍处于早期阶段,因此某些选项不能很好地工作。虽然它是一个漂亮的工具(绝对是最聪明的工具,因为它构建了代码的 AST),它甚至可用于 Windows。
如果您打算花时间阅读手册,还想查看GNU Indent。
当然,还有最后一种方法,实际上是花时间学习 vim 的缩进规则并根据自己的风格编写一个。这需要时间,但它适用于gg=G。
关于 astyle vs uncrustify vs greatcode 的一些说明:
请注意,您不必选择一种工具。使用 vim,您可以映射一个键击以连续执行多个命令,因此理论上您可以使用这些工具的组合来获得您正在寻找的内容。
最后但同样重要的是,这是我的 .vimrc 文件的摘录,我在其中映射了 F12 以使用一些选项调用 astyle:
"A2 = attached brackets
"-s8 indent 8 spaces
"-xc attached braces to class declarations
"-xj remove braces for single statement ifs and elses
"-c convert tabs to spaces in the non-indentation part of the line
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR>
不要以风格来评判我。只需使用该工具重现您想要的内容。
【讨论】:
我不会写 C++ 代码,但我会写一些 Java 代码。
相反,Vim 支持一些常用语言的格式。 我已经为我设置了一个快捷方式来格式化缓冲区中的整个代码。 它将返回到我刚刚编辑的行:)
" format the file
map <leader>fm gg=G'.
【讨论】:
按照 m000 的思路,一个通用的解决方案是使用 UniversalIndentGUI 作为外部工具。
【讨论】:
虽然 vim 是一把真正的瑞士刀,但对于某些工作,我仍然更喜欢外部工具。与使用内置等效方法相比,这种方法有时更直观、更容易记住。
在缩进的情况下,我通过astyle过滤整个文件缓冲区。 astyle 参数在几分钟内更容易掌握,特别是如果您不是 vim 专家。此外,astyle 在微调输出方面提供了更大的灵活性。
先安装astyle:# apt-get install astyle
然后在vim里面::%!astyle(简单的情况-astyle默认模式是C/C++)
或:%!astyle --mode=c --style=ansi -s2(ansi C++ 风格,每个缩进级别使用两个空格)
或:1,40!astyle --mode=c --style=ansi(ansi C++ 风格,仅过滤第 1-40 行)
【讨论】:
equalprg 设置为astyle(例如:set equalprg=~/astyle\ --style=google)来覆盖Vim 的缩进运算符(=)以使用Astyle(例如:set equalprg=~/astyle\ --style=google)
Vim 肯定会这样做,尽管结果可能并不完美:
你可以通过:help =了解更多关于equal命令的信息
【讨论】:
您可以执行以下操作:
gg=G
【讨论】:
V开始进入视觉线模式,然后用j向下移动以选择要格式化的所有行,然后点击=
gg=G。为什么?因为当你用逗号(参数列表,长布尔值)打破长列表时,它会破坏手动对齐。