平常习惯了linux的zsh+tmux+vim组合,开发体验非常完美,最近应该工作需求不得不
在 Windows上做大量的开发,简直就是煎熬。花了一点时间折腾,最终用
nvim+powershell 的方式勉强支撑起Windows下的开发。这篇文章总结了我尝试过的各
种方式,谈谈我对这几种方式的优缺点的看法。
visual studio + vim 插件
个人的构建工具,很久以前就从automake切到了cmake,所以切到Windows系统下做开发
,第一种尝试就是直接用cmake生成sln项目,然后用visual studio做编译和调试。我
最终弃用它作为首选方式的原因主要有下面两个:
割裂
这种方式给人一种强烈割裂感:我需要在cmd种去执行cmake生成项目,然后
切换到 visual studio上做编辑。visual studio 2017实际上集成了cmake支持,但
是还是会有需要从cmake模式切换到解决方案模式的情况(比如设置一些调试参数之类的
),依旧没有办法找到一种很舒适的集成环境。
文件编码
visual studio是一个很奇怪的IDE,无比臃肿,但却没有提供设置文件默认编码格式的功
能(至少没有较简单的方式),这对于跨平台的开发来说简直就是噩梦,我不得不手动的把
每一个源文件转换成统一的UTF8格式,防止在Linux平台打开的时候出现乱码(写个脚本也
许可以稍微减轻这种痛苦)。
WSL
WSL刚出来那会儿,个人还是有点小激动,有些人甚至开始调侃说Windows会成为最好的
Linux发行版本。我尝试着用了一段时间,最后还是弃了,原因主要有下面几个:
IO太慢
这点在操作GIT的时候尤其明显,经常卡到飞起。
终端太难用
WSL默认的终端太丑,连主题配置都不支持。我试过很多其他的终端,包括wsl-terminal
,hyper,对于主题和字体的支持都不尽如人意。算起来hyper其实是一个不错的选择,
只是没有办法很好的支持nerd fonts。
系统上下文的切换很繁琐
WSL像是一个内置到windows中的小虚拟机,所以这种方式和使用虚拟机一样,需要在两个
系统中不停的切换。进程的上下文切换有开销,系统切换同样也有。
比如,WSL中有python、cmake、git,原生系统中也有python、cmake、git。但是两套
工具在行为上并没有办法完全做到一致。
最明显的例子就是cmake,它在Linux上是接受 cmake_build_type这个参数的,但是
在windows上会直接忽略掉,因为Linux上,会为 release和debug生成不同的
makefile,而visual studio只生成同一个sln并在构建的时候动态指定 release和
debug。我没有办法完全在WSL中工作,所以需要不断在两种系统上下文中切换。这种感
觉这就像是你为同一个功能写了两份代码,你不得不维护两份。为了避免这种不一致性,你
最好只装一套原生的工具集,如果你不得不安装两套,那就只能自求多福了(比如wsl,自
动Python,而你用到了一些只有在原生系统中才能用的Python脚本)
还有一个比较尴尬的地方就是两者对于HOME目录的定义不同,我要在原生系统中找到
WSL中的文件夹很难,这进一步加重了切换系统的成本。
nvim + powershell
这种方式是我目前比较习惯的一种方式,nvim基本兼容vim,而且内置了对于terminal的支 持,当然nvim默认的终端是cmd,你可以把它改成Powershell。
我之所以使用这种方式主要是应为下面这几个原因:
快
天下武功唯快不破,nvim的轻巧可以碾压visual studio好几条街,编辑的体验也比
visual studio好太多。
美
我得承认我是一个颜控,我没有办法忍受难看的字体,更受不了无法配置主题的终端。
nvim+powershell这种方式,可以支持nerd fonts,可以支持主题的配置,powershell
的主题和字体设置默认随nvim的相关设置,集成度非常的高。
原滋原味
这种方式不需要使用WSL,没有切换系统的烦恼,也不存在两套工具之间的差异的苦恼。
模拟Linux的开发体验
Linux给开发带来的感觉如丝般顺滑,而nvim+powershell的组合可以尽可能的模拟这种体
验。这主要归功于powershell的插件支持,下面是我用到的一些插件。
psreadline
这个插件可以给你linux的终端命令输入体验,你可以通过ctrl-w删除一个单词,可以用
ctrl-a跳到行首,这些操作的便捷性远远高于原生的输入方式。psreadline甚至支持
vi-mode,简直完美。
psfzf
fzf,我通常只用于查找历史命令,但是这对于一个终端控来说,就这一个功能带来的效率 提升就已经无与伦比了
posh-git
让 git 的命令可以自动提示,分支可以自动显示。可惜这个插件有点慢。