我对VIM很新。我得到了一些源代码,这是一团糟。乍一看,我想至少得到一个清晰,有条理的代码视图,所以我喜欢正确格式化,我的意思是缩进取决于函数的深度等等。
我想知道是否可以使用VIM完成,否则你可以推荐使用哪种其他命令行工具。
由于
答案 0 :(得分:59)
虽然vim是真正的瑞士刀,但我仍然更喜欢使用外部工具来完成某些工作。与使用内置等效方法相比,这种方法有时更直观,更容易记忆。
在缩进的情况下,我通过astyle过滤整个文件缓冲区。 astyle参数在几分钟内更容易掌握,特别是如果你不是vim guru的话。此外,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行)
答案 1 :(得分:27)
您可以执行以下操作:
gg=G
答案 2 :(得分:13)
我现在强烈推荐clang-format。一旦安装了clang格式,它就允许将clang格式简单地集成到Vim中:
http://clang.llvm.org/docs/ClangFormat.html#vim-integration
它是唯一能够真正理解您的C ++代码的代码美化器,它非常智能地将代码美化为更像人而不是机器。 E.g:
void TestFunction(int argument1, int argument2,
int argument3);
void TestFunctionVeryLongName(int argument1,
int argument2,
int argument3);
void TestFunctionWithRidiculouslyLongName(
int argument1, int argument2, int argument3);
答案 3 :(得分:4)
Vim肯定会这样做,虽然结果可能并不完美:
您可以通过以下方式了解有关平等命令的更多信息::help =
答案 4 :(得分:4)
有一个vim插件可以在vim中对代码进行格式化。它叫做vim-autoformat,你可以在这里下载:
https://github.com/Chiel92/vim-autoformat
它将外部代码格式化程序集成到vim中。例如,如果要格式化 C,C ++,C#或Java 代码,则需要安装程序astyle,vim会自动将其设置为格式程序。
答案 5 :(得分:4)
还有一个依赖clang-format
的Vim插件:vim-clang-format
然后您可以简单地将格式化命令映射到适合您的任何内容。
答案 6 :(得分:2)
我不编写C ++代码,但是我编写了一些Java代码。
相反,Vim支持某些常用语言的格式化。 我为我设置了一个捷径,以便在缓冲区中格式化整个代码。 它将返回我刚编辑的那一行:)
" format the file
map <leader>fm gg=G'.
答案 7 :(得分:1)
根据m000的想法,通用解决方案是使用UniversalIndentGUI作为外部工具。
答案 8 :(得分:0)
只需解决这个确切的问题,所以我想我会为拯救他人一些时间做出贡献。
您可以使用gg=G
缩进代码。但是,当您想要调整自动缩进的发生时,事情变得难以理解。因此,如果您只关心删除了错误的空格并且并不真正关心格式化样式,gg=G
是最快捷的方式,因为它是内置的。
如果您确实想要控制样式(例如,您尝试使代码符合a style guide),那么您将需要一个外部工具来处理您的文件。您可以使用:%!<toolname> <options>
在vim中调用该工具。这将通过工具管理文件并重新加载处理结果。 (显然,您可以将此用于您想要对文件执行的任何其他操作)
接下来的问题是,您应该选择哪种外部工具?无论如何,方法是相同的:
现在,您使用的工具取决于您尝试复制的样式。如果你试图复制一种广泛使用的风格,那么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>
不要在风格上评判我。只需使用该工具即可重现您想要的内容。