今天跟大家安利下自己一直在维护和使用的(Neo)Vim版本:
linrongbin16/lin.vimgithub.com(Neo)Vim有很多优点:编辑速度快,扩展性和定制性强,而且自带光环。但对于新手来说,(Neo)Vim绝对算是非常不友好的一个文本编辑器:
今天介绍的lin.vim是我在大学时期开始自己使用的配置(第一次把自己配置上传到github大概是2014年左右吧,太久了记不清了),经过长期的维护和开发把它逐步变成了一个开箱即用的(Neo)Vim版本。
lin.vim擅长:
lin.vim不擅长:
说了这么多优点,我们来一条一条的近距离看看lin.vim:
在UNIX/Linux/Mac系统中,lin.vim的安装依赖于git,额外的在Mac上需要homebrew:
&&
它会自动将lin.vim配置用git clone到你本地的~/.vim目录下,然后安装Vim以及相关的依赖和配置。
在Windows上,lin.vim需要提前手动安装Visual Studio和Hack Nerd Font Mono - 这款字体支持漂亮的图标,效果如下:
之后其他依赖都通过chocolatey来安装(需要以admin权限运行下面的命令):
$ choco install git python cmake vim llvm nodejs ag ripgrep universal-ctags
$ git clone https://github.com/linrongbin16/lin.vim $env:UserProfile.vim
$ cd $env:UserProfile.vim
$ .install.ps1
lin.vim在Windows上迁移到了PowerShell作为其内置命令环境,放弃了古老的cmd,使用chocolatey维护所有依赖。
目前我还无法PowerShell从github下载安装nerd-font的功能,所以目前字体还需要手动安装,等完成之后连字体也可以自动下载安装了。
当然你也可以选择别的字体,只要在~/.vim/user.vim中设置你想用的字体就可以生效。
lin.vim的UI界面清晰易懂,并且非常美观,实际开发时lin.vim大概是这样子:
左边侧栏是文件管理器,配合nerdtree的mc/mm/md等等命令可以创建文件、修改文件名、移动文件、删除文件等等,不同类型的文件还有相应的图标。
为了让开发工作不那么无聊,lin.vim内置了solarized、monokai、dracula、vscode-dark等15种流行配色方案,每次启动时都会随机选择一种,保证你不会腻:
dracula配色 monokai配色不止如此,lin.vim的顶部和底部通过lightline和statusline来展示丰富的信息:包括文件类型、文件编码、光标位置、最近使用文件等等。
很多其他Vim集成版本都会有一键编译、运行、调试的功能。但我觉得Vim应当专注于编辑,而不是试图把所有功能都塞在里面。本来不同开发语言、甚至不同项目的配置都千差万别,强迫用户使用一套配置只会把用户赶走,所以编译和调试还是交给用户自己来吧。
Vim用户最头疼的问题就是自动补全了吧。
Vim补全插件的网上资料太少不知道怎么配置?用起来太卡太慢?在Visual Studio或Jetbrains里按一下"."符号,就能猜到你想些什么,花时间配置Vim是不是吃力不讨好?
不存在的。lin.vim的补全基于coc.nvim插件平台,让你写起代码如同丝滑感受,比任何IDE都不逊色:
补全const关键字 补全Position自定义类 红色是语法检查错误信息视频:
https://www.zhihu.com/video/1251909913774505984在上面的图和视频展示中可以看出lin.vim的补全速度是不亚于IDE的,非常顺滑。
通过gd(跳转到函数声明), gy(跳转到类型声明), gi(跳转到函数/类型实现), gr(查找所有函数/类型的引用并跳转), ctrl+o(返回之前位置)五个操作,让你在函数声明、定义和引用之间进行跳转/返回。
lin.vim还会在你编辑时默默的运行语法检查,在左侧用红色的>>>标记出有问题的代码。当光标移动到出错的位置,就显示红色的错误信息。
当你保存文件时lin.vim则会自动对当前文件进行代码格式化。默认c/c++使用的是clang-format,python使用的是black(因为black与autopep8和yapf相比速度更快)。
如果你想用lin.vim写java,可以直接用:CocInstall coc-java来安装java补全插件。
全局搜索和快速打开文件,是开发项目时的必备功能,lin.vim通过the_silver_searcher+ripgrep和LeaderF来实现这两个功能。
比如说需要在项目中搜索"AstBinaryExpression",只要在普通模式下键入:Ag AstBinaryExpression(或:Rg,功能基本相同),就会显示所有包含这个单词的文本:
全局搜索https://www.zhihu.com/video/1252182288689147904比如说需要快速打开文件"Ir.cpp", 只要在普通模式下按ctrl+p,在浮动弹窗中输入Ir.cpp,再按Enter就可以打开该文件了:
快速打开文件https://www.zhihu.com/video/1252182338194661376lin.vim的文件管理器使用了nerdtree+airline,可以查看当前目录下所有文件,新建文件(ma),重命名/移动文件(mm),复制文件(mc),删除文件/文件夹(md)。
每打开一个文件,顶部会新增一个标签页,通过bn显示下一个标签,bp显示上一个标签,bd关闭标签。
这个段落并不会介绍怎么使用hjkl,我们聊一聊lin.vim中更效率的移动。
比如你需要跳转到某个段落"- gd in normal mode: go to definition.",这时按下s,左下角出现:
再输入d,整个编辑栏的字符"d"都会变得不一样了,这时输入z就可以让光标移动过去了(不用再hjkl了):
要大幅度的上下移动呢?可以用j(向下移动)或k(向上移动),再输入对应行的标记即可。
快速移动光标https://www.zhihu.com/video/1252183438016278528lin.vim提供的一系列命令行工具来辅助Vimer做开发,命名为vcmd。额外的,lin.vim会在UNIX/Linux/Mac上安装zsh和oh-my-zsh作为用户shell。
其实vcmd和lin.vim本身没有什么关系,可以单独作为一套工具。但在我个人平时的工作中,vcmd帮我完成了大量重复的工作,节约了不少时间。vcmd用python3实现,在Windows下也可以正常运行。
vcmd只有一个功能就是展示一些帮助文档,告诉用户vcmd有哪些功能。
vcmd中包含vrg用于全局搜索,vfile用户文件批处理,vgit是升级版Git命令,vip用于IP进行计算,vpack用户压缩/解压操作,vtime用于日期和时间计算,vgen用于生成一些用户配置。
这些命令具体如何使用,只要输入${vcmd} --help就会显示啦!
它提供了类似于IDE中全局搜索(ctrl+shift+f)的功能,让你在当前目录下递归的搜索任意文本,性能很高。
用vrg搜索macoshttps://www.zhihu.com/video/12530624467070894081)批量删除某一种后缀的文件
比如我们想递归的删除shepherd目录下所有log文件时,只需要vfile -d log即可:
删除所有log文件https://www.zhihu.com/video/12530635923637616642)批量替换某一种后缀的文件内容
在shepherd项目中,所有源码*.cpp文件的开头都有我的email邮箱 [email protected],但我有一天突然想把这些邮箱改为 [email protected]。这时只要用命令 vfile -r cpp gmail.com outlook.com 即可。
3)修改文件编码(encoding)
跨平台工作时,文本文件的编码经常让人头痛。比如我在Windows下用记事本写了一些txt文件,发到Mac上打开全是乱码,这时如果一个一个去修改文件编码就很浪费时间。
vfile可以很方便的查询某类文件的编码(vfile -se
不得不说,我工作也三年多了,git命令却一直记不住。reset和revert参数怎么写?有多个remote repository时push/pull错repo怎么办?push/pull错branch怎么办?速度太慢怎么给git设置proxy?vgit可以帮所有同样有这些困扰的人解决这些问题。
1)vgit -pl是git pull的升级版命令。
我们开发时会遇到这种情况:remote有多个repository,在pull的时候选择错了remote repo,比如本来想从upstream repo pull,结果从origin repo pull了。
vgit -pl会自动检测是否有多个remote repo,并让你选择。
还有一种情况是你本地的分支是dev,但在pull的时候错误的选择了remote的master。
vgit -pl会检测本地所在的分支名,默认情况下它也会从remote repo中选择相同的分支去pull。当然也会跟你确认一下。
当vgit -pl确认了你的所有需求,才会真正执行git pull。
https://www.zhihu.com/video/1253066466062303232这里因为时间原因,这里只演示一下最简单情况下的vgit -pl交互方式。
2)vgit -ps是git push的升级版命令。
平时我们完成代码之后,一般要用git add、git commit和git push才能完成一次提交。vgit -ps会自动检测项目根目录,将整个项目中的所有改动都自动add到这次commit中,相当于执行了cd ${projectRoot}和git add -A .和git push。
和vgit -pl的设计思路类似,它也会交互式的询问你每一次push的细节,然后再执行:
https://www.zhihu.com/video/1253067637959614464vcmd中最常用的命令就是vrg、vfile、vgit这三个了,但其实vtime、vip、vpack、vgen等等命令也十分强大,套用python的一句名言就是:人生苦短,我用vcmd。由于时间关系,这里不再一条一条演示了,相信大家对lin.vim已经有一定的了解,还等什么呢?快安装试试吧!