Windows 终端环境改造计划
最近有个朋友突然问起,想买一台新的个人开发用电脑,偶尔连接公司环境做做远程开发,问我有什么推荐的配置。
于是稍微梳理了一下,2020年的个人开发环境选择。
分析
那就万能的苹果吧。
我首先想到的自然是 MBP,自己平时开发环境就是一台 iMac 和一台 Win10 机器。而从屏幕效果、开发软件源和终端体验来看,苹果家都胜出一筹。
不过随后那朋友补充了自己的预算——3000,嗯,人民币。
好吧,那基本告别苹果了。
那 Linux 怎么样?
不过除了苹果和 Windows 之外,其实还可以使用 Ubuntu 之类的 Linux 桌面环境。预想中,类似 macOS 的高清字体渲染、Unix-like 的命令环境、无缝对接服务端开发……然而理想很美好,现实还是有点骨感。
在外企开发的同学估计没问题,但在国内肯定离不开 QQ、微信、企业微信等各种国内软件。而国情所限,这些国内软件往往只支持 Win 环境、偶尔支持 macOS,基本无视更通用的 Web 端等平台的开发。
如果选择了 Linux,基本只能靠 wine 来跑它们了,而经过实际体验的感觉并不怎么愉快。
看来还是得 Windows 了。
至于 Windows 的命令行环境,有点一言难尽,不过还是有人尝试着概括成了一句话:Linux 是在命令行上做了个图形界面,Windows 是在图形界面里顺便带了个命令行。
嗯,差不多就是这个感觉,Windows 环境的命令行简直就是附带的,功能凑合,勉强能用。
虽然经常被用到,但 cmd 基本是无奈之选,软件生态贫瘠,可定制项目少,提示符展示 git 分支名称都没法做到。命令补全功能也只能做到路径补全,不支持参数补全、引号区分混乱……
PowerShell 似乎有改进,但启动更慢了,软件生态问题也没什么变化,反而干掉 &&
/||
搞了一套与 Linux/Mac 都不兼容的流程控制符,让跨平台的项目配置变得颇为蛋疼。就算后期 Win10 默认推荐使用它,也还是让人没有使用的兴趣。
而且,对于日常使用 git* 工作和做个人笔记同步的我来说,默认也不提供可用的 ssh,就算手动安装软件支持,git bash/openssh/putty 默认使用的密钥还不太一样,就算花时间去配置整合也不一定能完全通用,费时费力也不讨好。
总之,windows 端的终端环境,不做一番改造是没法用的。
改造方案
1. git-bash/cmder
一直以来,两者都是 Windows 端命令环境的不错选择。
不过,前者基于 mintty,官方已经声明了,它并不能完全替代命令行环境。比如不能直接用 Windows 下的 Python、MySQL 等环境,甚至不支持 tree 命令:
后者基于 ConEmu,还搭配了 clink 和 git 环境等便捷配置。如果想直接使用 ConEmu 达到类似的效果,还是需要做不少手动优化的:
可见 cmder 已经提前做好了多少优化配置,让人省心。
cmder 官方提供了 精简版 和 完整版 两个包,区别在于后者内置了一份 git。由于 git 肯定会手动安装最新版,顺便自动配置 PATH 以方便 VSCode 等软件的集成和调用,所以可以考虑直接使用精简版。
对于经常在多台办公电脑、个人电脑、平板之间来回切换的我来说,打包一份做好个人配置的 cmder,就可以轻松在多端获得同样的命令行体验,简直不要太轻松。
1.1 安装
打开 cmder 的 github 仓库或者官网下载即可:
- GitHub 仓库: https://github.com/cmderdev/cmder/releases
- 官网地址1: https://cmder.net/ (220915: 此域名似乎过期了)
- 官网地址2: https://cmder.app/
1.2 提示符配置
修改 %CMDER_ROOT%\config\cmder_prompt_config.lua 中的 prompt_lambSymbol
改为 $
,以免切换历史命令时出现光标位置和字符显示错乱的问题。
1.3 添加右键上下文菜单
方法一:直接命令添加
切换到 cmder 的主目录 右键以管理员权限打开 Cmder.exe,在命令栏输入 Cmder.exe /REGISTER ALL
,回车执行即可添加右键菜单。
方法二:脚本添加
为了方便之后重装系统后重新设置,或者移动使用。
也可以在 cmder.exe 所在目录创建一个 register.bat,内容如下:
1 | %~dp0cmder.exe /REGISTER ALL |
保存关闭,右键点击它选择“管理员身份运行”,执行完毕后,就能在右键菜单中看到 “Cmder Here” 了。
1.4 集成到 IDE 终端
在系统环境变量中,增加一个 CMDER_ROOT
,内容为 cmder 的主目录路径。
然后,将以下内容保存为 ide_shell_entry.bat,放在 cmder 目录下:
1 | @echo off |
最后配置 IDE 启动的终端为 cmd.exe
,启动参数 /k %CMDER_ROOT%/ide_shell_entry.bat
。
这样,就能在 VSCode、IDEA 等 IDE 中进行项目开发的时候,随时在集成终端中使用与 cmder 一致的环境。
2. terminal+wsl2
在 2016 年,Win10 系统十周年之际,微软推出了 “Bash on Ubuntu on Windows”,后来又改名成了 “Windows Subsystem for Linux - WSL”。在 2019 年,又改造升级成了 WSL2。
有兴趣的同学可以继续阅读:《WSL1 与 WSL2 简单对比》
并且还推出了新的终端模拟器 Windows Terminal,界面美观、使用方便、CJK 字体渲染完美、启动快速,搭配 WSL 使用香到不行。
2.1 安装
打开 Win10 的应用商店,搜索 terminal 即可找到 Windows Terminal,点击安装即可。
WSL 的话,则是直接搜索自己想要安装的 Linux 发行版本,比如 Ubuntu 20,在搜索结果中找到它,点击安装即可。
两者都安装完毕后,打开 Terminal 修改配置文件,将默认启动配置 defaultProfile
改为下面 profiles
中 WSL 对应条目的 guid
。
2.2 升级 WSL2
打开 WSL 官方页面 (http://aka.ms/wsl),点击 INSTALL WSL
后,按照指示一步步操作。
2.3 修复代理冲突
如果在本机使用了 Proxifier 可能会遇到 WSL 启动报错无法使用的情况:
1 | 参考的对象类型不支持尝试的操作。 |
可以执行 netsh winsock reset
修复,但这样又会导致 Proxifier 的代理控制失效,只是拆了东墙补西墙。
Proxifier 官方提供了一个工具修复这个问题,下载 www.proxifier.com/tmp/Test20200228/NoLsp.exe 后,使用管理员权限打开 cmd/PowerShell 切换到 NoLsp.exe 所在目录,执行 NoLsp.exe c:\windows\system32\wsl.exe
即可解决问题。
参考:https://github.com/microsoft/WSL/issues/4177#issuecomment-597736482
2.4 添加右键上下文菜单
更新:2021/02
较新版本的 Terminal 已经会自动创建上下文菜单项,无需再手动添加。
先创建个放置小图标的目录:
1 | mkdir "%USERPROFILE%\AppData\Local\terminal" |
然后,在 easyicon.net 搜索 terminal 后,找个自己顺眼的图标,下载放到刚才的目录中(不知道 AppData 目录在哪的同学,直接在资源管理器地址栏里粘贴上面的路径就可以打开了),改名为 terminal.ico。
接着,创建一个 wt.reg
文件,输入以下内容:
1 | Windows Registry Editor Version 5.00 |
记得将上面的{username}
改成自己的用户名。
双击执行后,就可以在右键菜单中看到 Open Terminal Here 的选项了。
不过,点击选项后你会发现打开的 Terminal 是固定目录,如果要设置为当前目录,需要修改 Terminal 的配置文件。
在 profiles.defaults
段落中,在添加 "startingDirectory" : ".",
就可以了。
2.5 集成到 IDE 终端
相比 Cmder 还需要创建脚本配置启动参数,WSL 就比较简单了,直接将 IDE 默认的继承终端启动程序,由 cmd.exe
改为 wsl.exe
就行。
2.6 美化
Terminal 默认的效果还是挺素的,喜欢自定义的同学可以调调配色、换换背景图。
我个人则是倾向于给 Terminal 配置个亚克力背景效果。在配置文件对应的 profiles
段落内,添加 defaults
配置:
1 | { |
补充
日常项目开发,推荐使用 WSL。
毕竟微软自家做的环境,底层与系统的对接较完善,启动速度快。
在 IDE 中启动 cmder 的时候,往往需要六七秒的时间。如果碰上 VSCode 打开了多个项目。重启机器后,VSCode 会瞬间还原上次的多个窗口,并同时开始打开多个集成终端,速度极其缓慢,经常还有部分窗口的终端启动失败,需要手动重启,体验较差。
配置成 WSL 的话,不管几个都是秒开,简直和 Linux 环境的体验差不多。
但是遇到需要使用 Windows 系统真实环境的情况(比如 electron
打包、ffmpeg
视频转换),还是得使用 cmder 或者 cmd。不过除非是专门做 Windows 平台应用开发的同学,否则一般较少遇到这类情况。