Vim中简单格式化代码

前言

写这个总结的起因是我在把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 时的模式,而格式化时 = 真正起作用的只有两种情况:

  1. 先按=,再选区域

    先说应用最广泛的全文格式化的方法gg=G,就是这种情况的变种,分析一下命令的含义,先是gg表示回到文档最开始,= 表示要格式化,G 表示到文档末尾,也就是说 gg=G 的含义就是:

    跳到文档开头->开始格式化->一直格式化到文档末尾

    既然明白了原理,假如此时光标就在文档开始处,那么使用命令 =G 也是可以格式化全文的,同理命令 G=gg也可以达到格式化全文的效果,而命令 =100j 就是从文档当前位置向下格式化100行。

  2. 先选区域,再按=

    扫描二维码关注公众号,回复: 1753963 查看本文章

    这种方式我反正用不习惯,不过也说一下,就是先按 v (可视化编辑)或 shift+v (可视化编辑行模式)或 ctrl+v (可视化编辑块模式),然后利用方向键 h,j,k,l 选择区域,最后按 = 完成格式化,简单操作例如 vjjj= 就是从当前位置向下格式化3行代码。

  3. 直接输入==

    不是说两种情况吗,为什么会有第3条呢?其实在命令模式下输入 == ,也就是连着输入两个等号,就是格式化当前行的方法,我感觉它和上两种情况一样,可能是又不知道归入哪一种情况比较好,所以就单列出来咯。

总结

  1. 本文中所提到的格式化代码只是很简单的格式化,以行为单位保证缩进正常,无法处理大括号换行等情况。
  2. 如果要挑起“大括号换行”的战争,麻烦装一个格式化插件吧,Vim只和Emacs打架,不想参与“大括号换行”战争。
  3. 如果要部分格式化,首先保证要格式化的代码之前的内容是格式化好的,否则格式化无效,请选择全文格式化吧!

猜你喜欢

转载自blog.csdn.net/shihengzhen101/article/details/79242044