linux文件明明存在却无法vim打开_可能是最适合新手的(Neo)Vim开箱即用版本

今天跟大家安利下自己一直在维护和使用的(Neo)Vim版本:

linrongbin16/lin.vim​github.com
a99a4a97bd0a69cc51cb8fa24fca248b.png

d99ec1d79e74456c5b7661fcc8506e31.png

(Neo)Vim有很多优点:编辑速度快,扩展性和定制性强,而且自带光环。但对于新手来说,(Neo)Vim绝对算是非常不友好的一个文本编辑器:

  • 操作和键位难记,学习曲线陡峭
  • 需要额外学习VimL才能配置
  • 配置和安装插件费时费力

今天介绍的lin.vim是我在大学时期开始自己使用的配置(第一次把自己配置上传到github大概是2014年左右吧,太久了记不清了),经过长期的维护和开发把它逐步变成了一个开箱即用的(Neo)Vim版本。

lin.vim擅长:

  • 开箱即用,在UNIX/Linux/Mac/Windows下一键安装无需额外配置,所有平台的使用体验一致。
  • 同时支持Vim和Neovim。
  • 集成了大量常用插件,支持主流编程语言c/c++/python/lisp/scheme/haskell/sql/rust/golang/html/css/javascript/typescript等等,包括:自动补全、代码格式化、语法检查、文本查询、文件名模糊匹配查找、丰富的配色方案、图标和状态栏、文件管理器、Git/Svn支持、各种方便的快捷键。
  • 提供常用的命令行工具,帮你加速代码重构、文件(夹)操作、版本控制、压缩解压和ip地址、数字、时间相关的计算等等。
  • 追求性能,使用时几乎不卡顿,保证手速跟得上思路。为了保证编辑速度,我舍弃了一部分非常好看,但是会严重影响Vim性能的插件和配置。
  • 支持用户自定义配置。
  • 友好的说明文档。

lin.vim不擅长:

  • lin.vim不内置对java系语言(包括scala、groovy、clojure,以及hadoop、hive等)的自动补全等类IDE功能。其实从市场角度来说,java系用户数量非常庞大,但相应的java系工具链所涉及的软件繁多,配置也因人和项目而异,一套配置很难满足所有用户的需求,而且安装Jetbrains也更方便。当然如果你愿意在lin.vim上写java,也可以用lin.vim内置的coc.nvim插件平台安装扩展来支持java系语言。
  • lin.vim不提供类似IDE的编译、运行、调试功能。我希望lin.vim专注于编辑,而不是代替IDE,一个软件项目的配置因人和项目而异,固定的编译运行框架反而会把用户赶走。所以这件事留给用户自己做。

说了这么多优点,我们来一条一条的近距离看看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 - 这款字体支持漂亮的图标,效果如下:

513ed4dd8e2fa9de117f1275b1f946c5.png

之后其他依赖都通过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中设置你想用的字体就可以生效。

UI界面

lin.vim的UI界面清晰易懂,并且非常美观,实际开发时lin.vim大概是这样子:

d99ec1d79e74456c5b7661fcc8506e31.png

左边侧栏是文件管理器,配合nerdtree的mc/mm/md等等命令可以创建文件、修改文件名、移动文件、删除文件等等,不同类型的文件还有相应的图标。

为了让开发工作不那么无聊,lin.vim内置了solarized、monokai、dracula、vscode-dark等15种流行配色方案,每次启动时都会随机选择一种,保证你不会腻:

01062e1e71f3a0fd0f6ac3e839b0ce77.png
dracula配色

5161f591a5ed22b5e510acfef32444ea.png
monokai配色

不止如此,lin.vim的顶部和底部通过lightline和statusline来展示丰富的信息:包括文件类型、文件编码、光标位置、最近使用文件等等。

很多其他Vim集成版本都会有一键编译、运行、调试的功能。但我觉得Vim应当专注于编辑,而不是试图把所有功能都塞在里面。本来不同开发语言、甚至不同项目的配置都千差万别,强迫用户使用一套配置只会把用户赶走,所以编译和调试还是交给用户自己来吧。

自动补全、语法检查、代码格式化

Vim用户最头疼的问题就是自动补全了吧。

Vim补全插件的网上资料太少不知道怎么配置?用起来太卡太慢?在Visual Studio或Jetbrains里按一下"."符号,就能猜到你想些什么,花时间配置Vim是不是吃力不讨好?

不存在的。lin.vim的补全基于coc.nvim插件平台,让你写起代码如同丝滑感受,比任何IDE都不逊色:

e1a8f953348f2bd414f5bf7d53f20c03.png
补全const关键字

29a9a17f9a4be85ad822859ed3da9ab9.png
补全Position自定义类

22b150507857c78b6b95c22ca63db783.png
红色是语法检查错误信息

视频:

7737fdcda2f175bd505cbfe06d2ab4d2.png
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,功能基本相同),就会显示所有包含这个单词的文本:

6def61dd921bc5c2156b8cacb414f320.png
415973a0053c193c7dd2280c72bbc07e.png
全局搜索https://www.zhihu.com/video/1252182288689147904

比如说需要快速打开文件"Ir.cpp", 只要在普通模式下按ctrl+p,在浮动弹窗中输入Ir.cpp,再按Enter就可以打开该文件了:

546fcd17ff2a139d90cd9b6dfe0377c2.png
51bfb90894877607279c8b868e887c5e.png
快速打开文件https://www.zhihu.com/video/1252182338194661376

leaderf搜索时,输入小写字母也能匹配大写,而且你不必输入整个单词,只输入部分就可以,因为是fuzzy匹配。

文件管理器

lin.vim的文件管理器使用了nerdtree+airline,可以查看当前目录下所有文件,新建文件(ma),重命名/移动文件(mm),复制文件(mc),删除文件/文件夹(md)。

每打开一个文件,顶部会新增一个标签页,通过bn显示下一个标签,bp显示上一个标签,bd关闭标签。

38c4e086994ef66ba0282099ad374657.png

光标移动

这个段落并不会介绍怎么使用hjkl,我们聊一聊lin.vim中更效率的移动。

比如你需要跳转到某个段落"- gd in normal mode: go to definition.",这时按下s,左下角出现:

d3a678d7ccc78dd1fcc421dc6cf5c500.png

再输入d,整个编辑栏的字符"d"都会变得不一样了,这时输入z就可以让光标移动过去了(不用再hjkl了):

150a18147ebc56c8f23daa2c778bb382.png

要大幅度的上下移动呢?可以用j(向下移动)或k(向上移动),再输入对应行的标记即可。

f5468f5644ad2aebae786f324ac2bd7d.png
730ac969061e07cb149cfc6c046425f9.png
快速移动光标https://www.zhihu.com/video/1252183438016278528

命令行工具

lin.vim提供的一系列命令行工具来辅助Vimer做开发,命名为vcmd。额外的,lin.vim会在UNIX/Linux/Mac上安装zsh和oh-my-zsh作为用户shell。

其实vcmd和lin.vim本身没有什么关系,可以单独作为一套工具。但在我个人平时的工作中,vcmd帮我完成了大量重复的工作,节约了不少时间。vcmd用python3实现,在Windows下也可以正常运行。

  • vcmd - vcmd帮助文档

vcmd只有一个功能就是展示一些帮助文档,告诉用户vcmd有哪些功能。

ea452d9dab0cb6e7a56bf00a11a57981.png

vcmd中包含vrg用于全局搜索,vfile用户文件批处理,vgit是升级版Git命令,vip用于IP进行计算,vpack用户压缩/解压操作,vtime用于日期和时间计算,vgen用于生成一些用户配置。

这些命令具体如何使用,只要输入${vcmd} --help就会显示啦!

ba6ad543910fe5967f345a1546f853c7.png
  • vrg - 全局搜索

它提供了类似于IDE中全局搜索(ctrl+shift+f)的功能,让你在当前目录下递归的搜索任意文本,性能很高。

ad2ba0594bad19e1a83a09403dbb8f91.png
用vrg搜索macoshttps://www.zhihu.com/video/1253062446707089408
  • vfile - 文件批处理。为了说明vfile的强大功能,我们以一个C++项目shepherd为例来进行说明:

1)批量删除某一种后缀的文件

比如我们想递归的删除shepherd目录下所有log文件时,只需要vfile -d log即可:

3cd082c411633094453a42d12adc79c5.png
删除所有log文件https://www.zhihu.com/video/1253063592363761664

2)批量替换某一种后缀的文件内容

在shepherd项目中,所有源码*.cpp文件的开头都有我的email邮箱 linrongbin16@gmail.com,但我有一天突然想把这些邮箱改为 linrongbin16@outlook.com。这时只要用命令 vfile -r cpp gmail.com outlook.com 即可。

5eac0f353a9a22246d29b3aabc9c3311.png

3)修改文件编码(encoding)

跨平台工作时,文本文件的编码经常让人头痛。比如我在Windows下用记事本写了一些txt文件,发到Mac上打开全是乱码,这时如果一个一个去修改文件编码就很浪费时间。

vfile可以很方便的查询某类文件的编码(vfile -se <filetype>),还可以修改某类文件的编码(vfile -e <filetype> <encoding>)。vfile在修改文件编码的时候会自动的查询文件的原始编码(source encoding),然后将其转换为目标编码(target encoding)。

  • vgit - 傻瓜式交互git命令。

不得不说,我工作也三年多了,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。

b68c0ec815e102bf92767e256facf3e9.png
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的细节,然后再执行:

8d1db311f5238b47d67dfed1a772a786.png
https://www.zhihu.com/video/1253067637959614464

vcmd中最常用的命令就是vrg、vfile、vgit这三个了,但其实vtime、vip、vpack、vgen等等命令也十分强大,套用python的一句名言就是:人生苦短,我用vcmd。由于时间关系,这里不再一条一条演示了,相信大家对lin.vim已经有一定的了解,还等什么呢?快安装试试吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值