Linux开发者的Windows生存指南

平常习惯了linuxzsh+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-terminalhyper,对于主题和字体的支持都不尽如人意。算起来hyper其实是一个不错的选择, 只是没有办法很好的支持nerd fonts

系统上下文的切换很繁琐

WSL像是一个内置到windows中的小虚拟机,所以这种方式和使用虚拟机一样,需要在两个 系统中不停的切换。进程的上下文切换有开销,系统切换同样也有。

比如,WSL中有python、cmake、git,原生系统中也有python、cmake、git。但是两套 工具在行为上并没有办法完全做到一致。

最明显的例子就是cmake,它在Linux上是接受 cmake_build_type这个参数的,但是 在windows上会直接忽略掉,因为Linux上,会为 releasedebug生成不同的 makefile,而visual studio只生成同一个sln并在构建的时候动态指定 releasedebug。我没有办法完全在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 的命令可以自动提示,分支可以自动显示。可惜这个插件有点慢。