前言
写这个总结的起因是我在把Windows上VS中的代码粘贴在Linux服务器的Vim中时,代码格式惨不忍睹,我就搞不明白为什么它每一行都要向后缩进,搞得我的代码最后像倒立的楼梯似的,就像这样:
int main(int argc, char *argv[])
{
int i=0,j=0;
if (i != 0) {i++; }
else {i--; }
for(i=0;i<5;i++)j++;
printf("i=%d,j=%d\n",i,j);
return 0;
}
往常我一般就是切换到插入模式,然后使用删除键删除掉前面多余的空格,可是这一次我决定不再忍受了,我要找到快速格式化的方法,还别说,方法其实很简单,各种格式化方法的核心就是符号=
。
何谓“简单”
其实一开始我想标题的时候并没有加上“简单”二字,直到我发现了一个求知者看似“无理”的要求,他要求在Vim中把上面格式的代码格式化成下面这样:
int main(int argc, char *argv[])
{
int i=0,j=0;
if (i != 0)
{
i++;
}
else
{
i--;
}
for(i=0;i<5;i++)
j++;
printf("i=%d,j=%d\n",i,j);
return 0;
}
如果你也是这样想的,很抱歉,你可以关掉这个页面了,本文提供的方法无法满足你的要求,这就是我的标题中为什么加上了“简单”二字,而Vim中的简单格式化只能是格式化成下面这样,以行为单位,保证每行的缩进都是正确的:
int main(int argc, char *argv[])
{
int i=0,j=0;
if (i != 0) {i++; }
else {i--; }
for(i=0;i<5;i++)j++;
printf("i=%d,j=%d\n",i,j);
return 0;
}
如果你确实要把大括号的换行也显示正确,那么只能通过安装插件、编写脚本、或者把源代码中对应的位置敲如回车,变成下面这样格式的代码,然后再使用本文后面叙述的方法来格式化就可以了。
int main(int argc, char *argv[])
{
int i=0,j=0;
if (i != 0)
{
i++;
}
else
{
i--;
}
for(i=0;i<5;i++)
j++;
printf("i=%d,j=%d\n",i,j);
return 0;
}
神奇的‘=’
其实格式化的核心内容就是这个 =
,其中绝大部分的方法都是 =
的变种,只是让人不容易发觉,甚至有些方法例如 gg=G
包装的让人都无法注意到真正起作用的就是那个 =
,格式化的前提是处于命令模式,也就是按完 ESC
时的模式,而格式化时 =
真正起作用的只有两种情况:
-
先按
=
,再选区域先说应用最广泛的全文格式化的方法
gg=G
,就是这种情况的变种,分析一下命令的含义,先是gg
表示回到文档最开始,=
表示要格式化,G
表示到文档末尾,也就是说gg=G
的含义就是:跳到文档开头->开始格式化->一直格式化到文档末尾
既然明白了原理,假如此时光标就在文档开始处,那么使用命令
=G
也是可以格式化全文的,同理命令G=gg
也可以达到格式化全文的效果,而命令=100j
就是从文档当前位置向下格式化100行。 -
先选区域,再按
=
这种方式我反正用不习惯,不过也说一下,就是先按
v
(可视化编辑)或shift+v
(可视化编辑行模式)或ctrl+v
(可视化编辑块模式),然后利用方向键h,j,k,l
选择区域,最后按=
完成格式化,简单操作例如vjjj=
就是从当前位置向下格式化3行代码。 -
直接输入
==
不是说两种情况吗,为什么会有第3条呢?其实在命令模式下输入
==
,也就是连着输入两个等号,就是格式化当前行的方法,我感觉它和上两种情况一样,可能是又不知道归入哪一种情况比较好,所以就单列出来咯。
总结
- 本文中所提到的格式化代码只是很简单的格式化,以行为单位保证缩进正常,无法处理大括号换行等情况。
- 如果要挑起“大括号换行”的战争,麻烦装一个格式化插件吧,Vim只和Emacs打架,不想参与“大括号换行”战争。
- 如果要部分格式化,首先保证要格式化的代码之前的内容是格式化好的,否则格式化无效,请选择全文格式化吧!