Hyper

没想到,有一天我还会在 Windows 下做开发,更没想到,凭着 Win10 的 Linux 子系统,开发体验还不错。

Hyper

首先,要有一个用着舒服的终端,我选用了 Hyper,这是一款基于 Web 技术、跨平台的终端软件。在 Hyper 的窗口菜单里依次选择 File -> Edit -> Perferences… 会打开一个文本文件,是 Hyper 的配置文件,文件名为 .hyper,实际上这是一个 JS 文件,看内容就知道,开头除注释外的第一行是 module.exports = {。我对这个配置文件做了如下修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
module.exports = {
    // 老年人,喜欢比较大的字体,字小了费眼
    fontSize: 16,
    // 有人是打开终端后输入 `bash` 或者 `ubuntu` 或者 `wsl` 命令进入 Linux 子系统,我个人没有这个需求,所以如此设置,打开终端后直接进 Linux 子系统。
    // 执行 `bash` 和 `wsl` 命令进入 Linux 子系统后,当前的目录跟进入子系统前一样,而执行 `ubuntu` 命令进入子系统后,当前的目录变成了用户的 Home 目录,这样比较符合我的习惯。
    shell: 'C:\\Users\\Username\\AppData\\Local\\Microsoft\\WindowsApps\\ubuntu.exe',
    shellArgs: [],
    // 想通过这个配置去掉在终端下敲命令时出现的 `bell` 声音,然而结果没生效,在按 Tab 补全时,仍然有讨厌的提示音。结果是通过修改 shell 的初始加载文件来达到目的的。下面会提到。
    bell: 'false',
    // 这是给终端配置的主题颜色
    plugins: ['hyper-material-theme'],
}

zsh

这也是个习惯了,在这个子系统里我也装上了 zsh 和 oh-my-zsh 作为日常 shell。为了提升 Win10 下 Linux 子系统的开发体验,我在之前 Ubuntu 环境里的 .zshrc 基础上做了一些修改供这个子系统用。

bell

其中一点就是前面说过的 bell 的问题。我是通过在 .zshrc 里添加下面这句配置来解决的。

1
unsetopt beep

我尝试过在 /etc/profile 或者 ~/.profile 文件里加上这句配置,结果都没其作用,进入系统 zsh 时,zsh 默认并没有加载这两个文件,我想与其修改这两个文件,再修改 .zshrc 或者 /etc/zsh/zprofile 去 source 那两个 profile 文件,不如干脆就把这句配置直接写到 .zshrc 里吧。这样固然对其他 shell 不起作用,但是我也不用其他 shell,没什么负面影响。

umask

.zshrc 做的另一个修改是加了 umask 022 这句配置。进入 Linux 子系统后,默认的 umask000,这样你创建的每个目录的权限都是 777,那还了得。出于跟上面一段同样的原因,我还是把这句配置加到了 .zshrc 里。

z

zsh 有个好用到让人想哭的插件名叫 z,用上它之后,目录切换如行云流水,操作起来飘若浮云,矫若惊龙。再也不用费脑子去记某个文件完整的路径和文件名了,具体细节不在本文讨论范围,请自行体验。

在 Win10 Linux 子系统里,我自然也给 zsh 配上了这个插件,却发现每次启动终端进入 zsh 时,就给我报个错 _z_precmd:1: nice(5) failed: operation not permitted,Google 了一下,在这里找到了一个答案 _z_precmd:1: nice(5) failed: operation not permitted · Issue #230 · rupa/z

默认状态下,zsh 会尝试以低优先级 (给进程 设置高的 nice 值)来运行后台进程,但是 Win10 子系统没让这么做,给进程设置 nice 值时就报了错。Windows 似乎没有修复这个问题,或者可能是他们并没有认为这是一个问题,只好修改 zsh 的行为 —— 不去修改后台进程的 nice 值 —— 来规避这个报错信息了,方法是在 .zshrc 里添加如下内容:

1
2
3
case $(uname -a) in
   *Microsoft*) unsetopt BG_NICE ;;
esac

做了一点微小的工作,差不多能舒服地用了。之后一顿操作,安装 nvmgit clone 过来 vim、tmux 的 dotfiles 配置文件,原来 Ubuntu 系统的 ssh 公钥私钥也搬过来……好了。