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 命令:

来源:《git 入门教程之 git bash 竟然不支持 tree 命令》

后者基于 ConEmu,还搭配了 clink 和 git 环境等便捷配置。如果想直接使用 ConEmu 达到类似的效果,还是需要做不少手动优化的:

来源: 《ConEmu 配置 (让 ConEmu 和 Cmder 一样好用)》

可见 cmder 已经提前做好了多少优化配置,让人省心。

cmder 官方提供了 精简版完整版 两个包,区别在于后者内置了一份 git。由于 git 肯定会手动安装最新版,顺便自动配置 PATH 以方便 VSCode 等软件的集成和调用,所以可以考虑直接使用精简版。

对于经常在多台办公电脑、个人电脑、平板之间来回切换的我来说,打包一份做好个人配置的 cmder,就可以轻松在多端获得同样的命令行体验,简直不要太轻松。

1.1 安装

打开 cmder 的 github 仓库或者官网下载即可:

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
2
%~dp0cmder.exe /REGISTER ALL
pause

保存关闭,右键点击它选择“管理员身份运行”,执行完毕后,就能在右键菜单中看到 “Cmder Here” 了。

1.4 集成到 IDE 终端

在系统环境变量中,增加一个 CMDER_ROOT,内容为 cmder 的主目录路径。

然后,将以下内容保存为 ide_shell_entry.bat,放在 cmder 目录下:

1
2
3
4
@echo off
SET CurrentWorkingDirectory=%CD%
CALL "%CMDER_ROOT%\vendor\init.bat"
CD /D %CurrentWorkingDirectory%

最后配置 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
2
3
4
5
6
7
8
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt]
@="Open Terminal Here"
"Icon"="%USERPROFILE%\\AppData\\Local\\Terminal\\terminal.ico"

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt\command]
@="C:\\Users\\{username}\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe"

记得将上面的 {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
2
3
4
5
6
7
8
9
10
{
"profiles": {
"defaults": {
"background": "#013456",
"useAcrylic": true,
"acrylicOpacity": 0.7
},
"list": [ ... ]
},
}

补充

日常项目开发,推荐使用 WSL。

毕竟微软自家做的环境,底层与系统的对接较完善,启动速度快。

在 IDE 中启动 cmder 的时候,往往需要六七秒的时间。如果碰上 VSCode 打开了多个项目。重启机器后,VSCode 会瞬间还原上次的多个窗口,并同时开始打开多个集成终端,速度极其缓慢,经常还有部分窗口的终端启动失败,需要手动重启,体验较差。

配置成 WSL 的话,不管几个都是秒开,简直和 Linux 环境的体验差不多。

但是遇到需要使用 Windows 系统真实环境的情况(比如 electron 打包、ffmpeg 视频转换),还是得使用 cmder 或者 cmd。不过除非是专门做 Windows 平台应用开发的同学,否则一般较少遇到这类情况。