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
2
3
4
5
6
7
8
9
10
11
{
"guid": "{6d953325-a939-475d-a151-940cbd0302fb}",
"name": "Cmder",
"commandline": "cmd.exe /k %CMDER_ROOT%\\vendor\\init.bat",
"startingDirectory": "%USERPROFILE%",
"icon": "%CMDER_ROOT%\\icons\\cmder.ico",
"background": "#2e3436",
"padding": "15",
"fontFace": "Cascadia Code",
"fontSize": 10
}

image-20220123231600976

Windows Terminal 集成cmder光标错位的问题

在Windos Terminal中集成cmder时,可能会发生“光标错位”的问题,具体是如果上翻历史命令,会在命令行中多出一个字符,这个字符并不影响命令执行,但是看上去比较别扭。

之所以会发生这个问题,可能是cmder命令行开头的"λ"字符造成的,由于"λ"并不是常见的命令行提示符,所以Windows Terminal在正则匹配时发生了错误。

image-20220123234045097

修改的方法也比较简单,关键在于将"λ"替换为常见的命令行提示符,例如"$",根据网上的资料,对于我使用的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}替换为$即可,如下图所示:

image-20220124000708122

如此之后,cmder就可以在Windows Terminal中正常使用了。更多的修改参加下文:

  1. Windows Terminal + Cmder = ❤️. With the upcoming release of Windows 10… | by Wolfgang Dielingen | Talpor | Medium

Windows Terminal集成 WSL zsh

之前的时候都是用msys2或者Cygwin在Windows下模拟Linux环境,WSL的出现相当于提供了更加接近原生的仿真。有了WSL以后,就可以在WSL下安装zsh,然后用oh-my-zsh进行美化。具体的步骤如下:

  1. 在Windows功能开启“适用于Linux的Windows子系统”,然后在Microsoft Store安装一个子系统image-20220124093410720

    image-20220124093718075

  2. 在Windows Terminal下“好像”可以自动找到wsl的配置,然后就可以在Windows Terminal中使用wsl的shell了。

    image-20220124104456979

  3. 在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

    image-20220124112150905

  4. 在Windows Terminal中修改字体,使用powerlevel10k推荐的"MesloLGS NF"字体,解决在WIndows Terminal中显示乱码的问题。

    image-20220124113936297

  5. wsl默认将WIndows的磁盘挂载在/mnt下面,为了更加方面,可以设置挂载在根目录/下,具体方法为修改配置文件/etc/wsl.conf(如果没有就手动创建),添加以下内容:

    1
    2
    3
    4
    5
    [automount]
    enabled = true
    root = /
    options = "metadata,umask=22,fmask=11"
    mountFsTab = false

    image-20220124113230660

wsl shell 调用Windows可执行文件的问题

虽然用了wsl的shell,还是经常少不了调用Windows下的程序,wsl也提供了相应的方法,就是使用[程序名].exe。(具体参见:跨文件系统工作 | Microsoft Docs

image-20220124123700949

但是仍然可能会出现问题,例如我在使用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):

  1. msys2下载zsh包:Package: zsh - MSYS2 Packages

  2. 将压缩包(注意是zst格式)解压到git bash的安装目录,通常为C:\Program Files\Git

  3. 打开git-bash.exe,输入zsh,不出意外的话,应该可以正常运行,并且要求完成一系列的配置;

  4. 与wsl中的方法相同,安装oh-my-zsh

    1
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  5. 将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

    关闭重启即可。

  6. 安装powerlevel10k主题,并进行配置

    1
    git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
  7. 在Windows Terminal中配置字体。

经过以上过程,就可以在WIndows Terminal中使用zsh执行Windows的命令,而不用添加.exe了。

但是,使用之后发现还存在两个坑没有填。

WIndows Terminal下zsh的tab补全问题

使用的时候会发现,Git for Windows下的zsh用tab补全会出现问题,具体是无法识别Windows的磁盘分区,例如输入/e进行补全,会提示/etc而非e盘下的目录。解决办法:

~/.zshrc或者/etc/zshrc下添加以下内容:

1
2
local drives=($(mount | command grep --perl-regexp '^\w: on /\w ' | cut --delimiter=' ' --fields=3))
zstyle ':completion:*' fake-files "/:${(j. .)drives//\//}"

WIndows Terminal下zsh的光标错乱问题

一开始我是用的是Prompt Frame的“Right Frame”,结果与cmder的光比类似,也会出现错乱的问题,而且还是错位两个字符。很自然的怀疑,Frame的两个Uncode字符不在WIndows Terminal识别提示符的范围内

image-20220124133715499

对于这个问题,我也没有找到好的办法,能想到的就是使用"No frame"的选项,然后就可以正常使用了。

常用开发软件的终端设置

我比较常用的开发软件涉及到命令行的主要是Visual Studio Code以及JetBrains 的一系列IDE,简单介绍两者的Terminal设置,其实主要就是字体设置。

Visual Studio Code

terminal.integrated.fontFamily修改字体为zsh所使用字体即可(字体已经在前面安装)。

image-20220124181613572

JetBrains系列

以Pycharm为例,WSL、powershell、Git Bash和cmd都会作为Terminal的可选选项,但是这里的"Git Bash"与Windows Terminal的执行参数并不相同,如果直接用不会使用zsh作为shell,为此需要修改,我们可以直接修改默认的Terminal的Shell Path,如下:

但是,遗憾的是,如果不想把自定义的Shell作为默认的Terminal,则要麻烦一些,这是因为,Jetbrains的IDE是通过搜索预定的目录来添加可用的shell,有兴趣的可以自己试一下。

参考:

  1. https://github.com/JetBrains/intellij-community/commit/f0734318c0cb065fd2af9eb00670b2f84015c942#diff-ea6e43155df63f322e2691a771c2aaba84483fb03235d0a32235c0e6fa7f2d3bR104
  2. https://www.jetbrains.com/help/idea/terminal-emulator.html#open-terminal

image-20220124183438411

与Visual Studio Code类似,也存在字体乱码的问题。修改Preference> Editer>Colors&Fonts>Console Font>下的字体为zsh所使用的字体即可。

image-20220124182034028

结论

以上就是我在Windows下使用Terminal的一些经验。结果我有发现有个Rust写的Nushell以及oh-my-posh这个工具,感觉也挺不错的,但是感觉目前的环境已经够用了,打算先观望一下。