VS to Vim

我居然四年没写博客了,突然有兴致,写一点吧。

VS to VS code

平时在公司写代码,永远都是开Visual studio。然后,一段时间之后接触了VS code,最初是用来改改配置文件,或者写写Powershell,做点轻量级的开发。发现是是真的好用,主要打开速度快。我的开发体验的一大特点是需要同时在5-10个git仓库之间反复切换。用Visual Stdio的话,即使是公司配的64GB内存的workstation也扛不住,老是开关又是真的烦,等载入等到烦躁。VS code虽然功能上弱很多,但是快真的是抓住了我的心,而且功能少的恰到好处。

VS code to Vim

不过好景不长,最近VS code的更新,开始迈向VS的老路。加上了很多看似必要,实则不会用到的功能。比如之前的远程开发功能,出来的时候很惊艳呀。而且我的工作是事实上必须远程开发,项目依赖太多,本地是跑不起来的。日常是活在一套共有+私有的工具链里的,其实也蛮痛苦的。想想能不能用上,事实上是各种限制,存在一些根本性的困难。感觉远程开发只能用在一些容器化本身做的比较好的项目。但是这些项目本身在本地开发也没有那么困难(当然我仍然是基于64GB workstation说这话的,貌似有点站着说话不腰疼)。再比如不知什么时候开始,VS code加强了对载入项目安全性的要求,打开项目还要设置是否信任之类。凡此种种,用VS code一年多以来,其实我的实际使用体验没啥变化,但是硬盘和内存里的体积确实打了不少,加载时间也在迅速增加。从原来的1秒一下,到好几秒,用户体验上是一眼显著的差异。

直到有一天,可以说突发恶疾想说,既然如此,为什么还要用VS code,Vim不香嘛?背景是我虽然现在做.net开发,但是在学校期间有10年+的linux使用经历,Vim也算是我的老朋友了。曾几何时插件搞了一堆,一样是启动慢,用到的功能没几个。但是在VS code不好用这个时间点,Vim就突然成了一个选择。其实这个想法一开始我就自己否定了他好几回,理由也简单,windows下Vim本身就没那么好使,然后.net开发可能更不好使,结果可能是无穷的折腾然后应为麻烦弃坑。但是最后为啥决定做了呢?我也不知道,就是做了,而且自己很满意。可能是所谓“自主可控”的感觉良好吧。

踩过的坑

语法高亮

出乎意料第一个大坑是C#的语法高亮。Vim啥都不装的话,C#是几乎没高亮的,其实也可以理解啦。Vim几几年的,C#几几年的。而且Vim用户本来用Windows就少。不过插件总是能解决的,我用的omnisharp-vim。不过我其实只想要个语法高亮,但是似乎没有单纯高亮的,omnisharp是有language server的。有language server的主要问题是,如果项目比较大,加载还是比较慢的,不完美,但OK。

说到这个就必然涉及到补全了。我自己对补全依赖不高,所以在Vim上放弃了这一项,只依赖Vim自带的,提供一些文本层面的补全,大概也够用了。其实我在VS时期是非常依赖补全的,主要就是函数接口记不住,万事F12进去看一眼,找找我要用的是哪个函数。其实还是挺舒适的,但是Vim这主要是配置太麻烦,而且公司用的开发环境设置,要Vim能识别挺麻烦的,感觉没必要。而且毕竟没了图形界面嘛,很多东西也不直观,键我也记不住。

这里说个开源软件常见的弱点,是对对新手不友好。不过对程序员来说,可能永远是新人。我这么说的意思是,我写了4-5年.net了,其实框架里的绝大部分内容,我都是不知道,没用过的。很多东西对我还是“新”的。所以补全,跳转之类的功能,其实是提供了探索阶段的向导功能。这个事在我现在配置的这个Vim这就是,我熟悉用到很好,不熟悉,就老老实实查文档去,没有一个过渡。 再比如,Windows传统的长长的右键菜单,其实也是一个向导,告诉你,可以做哪些事。这事在Vim这,至少是没有很好的组织起来。

项目切换

项目切换对我来说是核心议题,毕竟就是嫌弃VS切换慢嘛。但是令我震惊的是,居然这方面的项目极少。最终找到的一个项目,还是在细节上和我的理想有不小的差距,好在这个功能简单,我就在现有项目上fork一把,做了一个纯自用。fzf-sessiona

搜索

良好的全局搜索支持,也是我非常喜欢VS code的一个功能,到了Vim自然不能落下。Vim这方面的插件很多,我用了Rg,绑定用的是fzf。

跳转

说白了就是Ctrl-P,我对Sublime主要的印象就是这种全局跳转非常好用。VS code也采用了类似的模式。Vim下我依赖两个插件fzfctrlp,两个功能其实有一点重合,但是都和我的理想有小幅的差距。其实我想要的是ctrlp,但是ctrlp在实际使用中还是是不是会出现找不到的现象,我感觉是bug,但没太多时间去研究。ctrlp找不到,我就靠fzf凑合下,毕竟要搜索还是要装fzf的。

终端

终端这个事,现在一看,哇Vim8原生支持了诶,开心!实际用着也很不错,但是总觉得terminal模式下,快捷键是完全不同的,使用感有点割裂。虽然也是没办法的事,terminal模式下,致力于占用最少的额外快捷键。Vim下终端的功能,基本都绑定在Ctrl-w上。这点上,tmux也是一样的困难。本来可以通过绑定解决,但是我意识到我终端下会用到的快捷键也很多。比如Ctrl-r,在插入模式是粘贴,在终端里是搜索,我都是大量使用,就不得不割爱了。 Windows下对终端的支持也蛮不错的,唯一如默认用Powershell的话,可能要注意,所有插件的命令都会在powershell里,而不是作者当时认为的在cmd里执行,会有一些引号的小坑。

快捷键

快捷键方面,我没有载入任何推荐的快捷键,感觉一进入Vim,我就真的不会用那些Windows下传统的快捷键了,唯一的例外就是Ctrl-v=”+p,这个主要是用的真的多,而且有时候习惯了就顺手一贴,这个就妥协一下下。大部分我每天都会用到的功能,我就绑定到了leader的直接后缀上,leader我用的空格,这么大一个键,不用上是在浪费。

感想

KISS (Keep It Simple Stupid). 功能膨胀这个问题,其实不管是VS,VScode,还是Vim,不管是官方,第三方,还是自制,都是一个无法避免的问题。所以首先是加插件的时候要克制,考虑自己是不是真的需要,不要为一点简单的需求,引入过高的负载。当然Vim这种定制好处还是很大,至少可以选砸喝多功能不要,不会遭遇我之前遇到那种,更新的福利我没享受到,速度倒是慢下来的窘境。

顺便共享下我现在在用的配置吧。