Windows Terminal配置方案(cmder+wsl+zsh+oh-my-zsh)
前言
最近一直在Windows下做开发,之前在Mac和Linux下使用zsh和oh-my-zsh觉得又好看又美观,而之前Windows下一直在用cmder,现在有了Windows Terminal,所以也想尝尝鲜,搞一个更好的配置方案。
Windows Terminal 集成cmder
在Windows Terminal横空出世之前,我感觉cmder应该算是Windows系统下比较不错的终端软件,但是Windows Terminal发布以后,感觉完全就可以取代cmder。
当然,由于Windows Terminal本身可以集成多种shell,所以我们完全也可以把cmder放在里面。具体的方法很简单,假设我们已经安装好 cmder和Windows Terminal,只要在Windows Terminal中添加cmder的配置文件即可。
打开Windows Terminal的settings.json
文件,在profiles>kust
下添加配置示例如下,其中最为重要的就是commanline
,也就是图形界面下的命令行
一项,环境变量CMDER_ROOT
是cmder安装的目录:
1 | { |
Windows Terminal 集成cmder光标错位的问题
在Windos Terminal中集成cmder时,可能会发生“光标错位”的问题,具体是如果上翻历史命令,会在命令行中多出一个字符,这个字符并不影响命令执行,但是看上去比较别扭。
之所以会发生这个问题,可能是cmder命令行开头的"λ"字符造成的,由于"λ"并不是常见的命令行提示符,所以Windows Terminal在正则匹配时发生了错误。
修改的方法也比较简单,关键在于将"λ"替换为常见的命令行提示符,例如"$",根据网上的资料,对于我使用的cmder(版本为v1.3.19),修改如下:
在 %CMDER_ROOT%/vendor/clink.lua
文件中找到set_prompt_filter()
函数,在函数的结尾附近找到prompt = "{uah}{cwd}" .. version_control .. get_lamb_color() .. cr .. "{env}{lamb} \x1b[0m"
的语句,将其中的{lamb}
替换为$
即可,如下图所示:
如此之后,cmder就可以在Windows Terminal中正常使用了。更多的修改参加下文:
Windows Terminal集成 WSL zsh
之前的时候都是用msys2或者Cygwin在Windows下模拟Linux环境,WSL的出现相当于提供了更加接近原生的仿真。有了WSL以后,就可以在WSL下安装zsh,然后用oh-my-zsh进行美化。具体的步骤如下:
-
在Windows功能开启“适用于Linux的Windows子系统”,然后在Microsoft Store安装一个子系统
-
在Windows Terminal下“好像”可以自动找到wsl的配置,然后就可以在Windows Terminal中使用wsl的shell了。
-
在wsl中安装zsh,设为默认shell,并安装oh-my-zsh进行美化,我使用的是romkatv/powerlevel10k: A Zsh theme (github.com)主题,命令为
1
2
3
4
5
6
7
8# 安装zsh
apt install zsh -y
# 设为默认shell
chsh -s /bin/zsh
# 安装oh-my=-zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# 安装Powerleve10k主题
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k -
在Windows Terminal中修改字体,使用powerlevel10k推荐的"MesloLGS NF"字体,解决在WIndows Terminal中显示乱码的问题。
-
wsl默认将WIndows的磁盘挂载在
/mnt
下面,为了更加方面,可以设置挂载在根目录/
下,具体方法为修改配置文件/etc/wsl.conf
(如果没有就手动创建),添加以下内容:1
2
3
4
5[automount]
enabled = true
root = /
options = "metadata,umask=22,fmask=11"
mountFsTab = false
wsl shell 调用Windows可执行文件的问题
虽然用了wsl的shell,还是经常少不了调用Windows下的程序,wsl也提供了相应的方法,就是使用[程序名].exe
。(具体参见:跨文件系统工作 | Microsoft Docs)
但是仍然可能会出现问题,例如我在使用hexo
写博客的时候,实际还会用到node,这时候我期望的是调用Windows的node,所以需要用node.exe
,但是实际的调用命令是node
,就会在linux下寻找弄得,也就会出现错误。
针对这个问题,我没有想出什么太好的办法,要么就是所有的开发运行环境都放在wsl下,要么就是避免在wsl中使用类似的调用。
Windows Terminal集成 zsh
针对上面那个问题,心里总是觉得还不算圆满,所以又想别的解决办法,又找到了在Windows下直接安装zsh
的方法。说是“直接”,其实还是需要一个linux的模拟环境,只不过前面我们用的是wsl,这里我用的是Git for Windows的bash。参考网上的讨论Zsh / Oh-my-zsh on Windows Git Bash (github.com),总结方法步骤如下(假设已经安装好Git for Windows):
-
从
msys2
下载zsh
包:Package: zsh - MSYS2 Packages; -
将压缩包(注意是zst格式)解压到git bash的安装目录,通常为
C:\Program Files\Git
; -
打开git-bash.exe,输入
zsh
,不出意外的话,应该可以正常运行,并且要求完成一系列的配置; -
与wsl中的方法相同,安装oh-my-zsh
1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
-
将zsh配置为git-bash的默认shell,注意:与wsl中使用chsh不同,git 佛for windows需要通过配置文件完成,修改Windows系统下的
~/.bash_profile
或~/.bashrc
文件(二者如果都不存在就创建一个),在文件末尾增加以下内容:1
2
3
4# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi关闭重启即可。
-
安装powerlevel10k主题,并进行配置
1
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
-
在Windows Terminal中配置字体。
经过以上过程,就可以在WIndows Terminal中使用zsh执行Windows的命令,而不用添加.exe
了。
但是,使用之后发现还存在两个坑没有填。
WIndows Terminal下zsh
的tab补全问题
使用的时候会发现,Git for Windows下的zsh用tab补全会出现问题,具体是无法识别Windows的磁盘分区,例如输入/e
进行补全,会提示/etc
而非e盘下的目录。解决办法:
在~/.zshrc
或者/etc/zshrc
下添加以下内容:
1 | local drives=($(mount | command grep --perl-regexp '^\w: on /\w ' | cut --delimiter=' ' --fields=3)) |
WIndows Terminal下zsh
的光标错乱问题
一开始我是用的是Prompt Frame的“Right Frame”,结果与cmder的光比类似,也会出现错乱的问题,而且还是错位两个字符。很自然的怀疑,Frame的两个Uncode字符不在WIndows Terminal识别提示符的范围内。
对于这个问题,我也没有找到好的办法,能想到的就是使用"No frame"的选项,然后就可以正常使用了。
常用开发软件的终端设置
我比较常用的开发软件涉及到命令行的主要是Visual Studio Code以及JetBrains 的一系列IDE,简单介绍两者的Terminal设置,其实主要就是字体设置。
Visual Studio Code
在terminal.integrated.fontFamily
修改字体为zsh所使用字体即可(字体已经在前面安装)。
JetBrains系列
以Pycharm为例,WSL、powershell、Git Bash和cmd都会作为Terminal的可选选项,但是这里的"Git Bash"与Windows Terminal的执行参数并不相同,如果直接用不会使用zsh作为shell,为此需要修改,我们可以直接修改默认的Terminal的Shell Path,如下:
但是,遗憾的是,如果不想把自定义的Shell作为默认的Terminal,则要麻烦一些,这是因为,Jetbrains的IDE是通过搜索预定的目录来添加可用的shell,有兴趣的可以自己试一下。
参考:
- https://github.com/JetBrains/intellij-community/commit/f0734318c0cb065fd2af9eb00670b2f84015c942#diff-ea6e43155df63f322e2691a771c2aaba84483fb03235d0a32235c0e6fa7f2d3bR104
- https://www.jetbrains.com/help/idea/terminal-emulator.html#open-terminal
与Visual Studio Code类似,也存在字体乱码的问题。修改Preference> Editer>Colors&Fonts>Console Font>
下的字体为zsh所使用的字体即可。
结论
以上就是我在Windows下使用Terminal的一些经验。结果我有发现有个Rust写的Nushell以及oh-my-posh这个工具,感觉也挺不错的,但是感觉目前的环境已经够用了,打算先观望一下。