当前位置: 首页 > news >正文

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. 先选区域,再按=

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

  3. 直接输入==

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

总结

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

相关文章:

  • Vim、Xshell、远程终端莫名卡死的原因
  • 关于游戏中仓库类的设计
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • 神秘莫测的时间复杂度
  • 排序算法系列之(三)——略显神秘的快速排序
  • .bat批处理(六):替换字符串中匹配的子串
  • 操作指向类成员的指针需要了解的两个操作符-*和.*
  • VS2015调试dump文件时提示未找到xxx.exe或xxx.dll
  • 结构体sockaddr、sockaddr_in、sockaddr_in6之间的区别和联系
  • 简述TCP三次握手和四次挥手流程
  • 智能指针(零):分类及简单特性
  • 智能指针(一):auto_ptr浅析
  • 智能指针(二):shared_ptr浅析
  • 智能指针(四):unique_ptr浅析
  • Lua中关于table对象引用传递的注意事项
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript 一些 DOM 的知识点
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JAVA多线程机制解析-volatilesynchronized
  • 百度地图API标注+时间轴组件
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 将回调地狱按在地上摩擦的Promise
  • 浅谈web中前端模板引擎的使用
  • 区块链分支循环
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 探索 JS 中的模块化
  • 网页视频流m3u8/ts视频下载
  • 温故知新之javascript面向对象
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一个SAP顾问在美国的这些年
  • 怎么把视频里的音乐提取出来
  • 智能合约Solidity教程-事件和日志(一)
  • Mac 上flink的安装与启动
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)(4.6) Triducer
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Scala的“=”符号简介
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bashrc在哪里,alias妙用
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net中的设计模式——Factory Method模式
  • [100天算法】-目标和(day 79)
  • [Android学习笔记]ScrollView的使用
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [C# 基础知识系列]专题十六:Linq介绍