在 Windows 10 上面使用 WSL 已經一個月了1。小狀況也就罷了,但 Cmder 不夠穩定的顯示邏輯卻最讓我頭痛,在視窗尺寸變化時,無法正確處理字元位置。更令人費解的是,即使是其他狀似更華麗(也更耗資源)的替代方案,也仍然有這些問題2

既然酷炫的終端機競品問題多多,乾脆回歸極簡的 WSLtty3,並混搭 tmux4 來彌補。可惜,畢竟是組合技,無法完全複製 Mac 的 iTerm2 使用經驗。

此事古難全。

WSLtty 剪貼簿

在 X Window 或 Mac 的終端機,只要按下滑鼠右鍵就能夠 paste 文字。如果在 WSLtty 上也想這麼玩,請在 %APPDATA%\wsltty\config 設定檔加上這一行:

RightClickAction=paste

Tmux 與 zsh

啟動 tmux 時,似乎並不會根據 /etc/passwd 的資訊來喚起自訂的 shell,而是一律喚起 bash。

解決方法是,在 ~/.tmux.conf 加上這一行:

set-option -g default-shell /bin/zsh

Tmux 的 pane

用慣 iTerm2 的我,對 tmux 的 pane 功能不太習慣。

譬如說,在 tmux 新增 pane 或 window 時,不會自動帶入目前的目錄 $PWD,而是一律帶入 $HOME,很不方便。Tmux 預設的組合鍵 <prefix> %<prefix> " 難記又難按,也很令人頭痛。

因此,我綜合多人的做法5,解決目錄問題,換成好記好按的組合鍵,更可用方向鍵來切換 pane:

# Create new window (tab) with current path
unbind c
bind -n M-t new-window -c '#{pane_current_path}'  # mimic for iTerm2 habit

# Split panes with current path
# @see https://unix.stackexchange.com/a/247449
unbind '"'
unbind '%'
bind -n M-d split-window -h -c '#{pane_current_path}'  # Split panes horizontal
bind -n M-D split-window -v -c '#{pane_current_path}'  # Split panes vertically

# Switch panes using Alt-arrow without prefix
bind -n M-Left  select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up    select-pane -U
bind -n M-Down  select-pane -D

Tmux Plugin Manager

Tmux 設定太多了,就有人寫了外掛管理系統 Tmux Plugin Manager。雖然目前我還用不到,但還是先安裝,以備不時之需。

首先,下載 TPM:

% git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

將以下幾行加到 .tmux.conf 最後面:

# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Initialize TMUX plugin manager
# (keep this line at the very bottom of tmux.conf)
run -b '~/.tmux/plugins/tpm/tpm'

Tmux 還有很多高段的功能,以後有需要再研究吧。

如此這般拼湊起來,雖然還不能完全複刻 Mac 的 iTerm2 使用經驗,但也已經算是可以接受了。當然啦,私心還是希望 Cmder 或 Hyper 能夠好好解決顯示問題,就不必動用 tmux 了。


  1. 這段故事,詳見〈在 Windows 上復刻 Mac 使用習慣〉一文。 ↩︎

  2. 關於其他更華麗,卻也更耗資源的 Windows 終端機方案,可參考這幾篇介紹文章:〈在 Windows 上面用 WSL 优雅开发〉、“ConEmu vs Hyper vs Terminus vs MobaXTerm Terminator vs Ubuntu WSL”。 ↩︎

  3. 關於 WSLtty,可參考保哥的〈介紹好用工具:WSLtty (Mintty as a terminal for WSL)〉一文。 ↩︎

  4. 關於 tmux,可參考這幾篇介紹文章:〈tmux ,不只是 terminal multiplexer〉、〈tmux 快速入門筆記〉、〈終端機 session 管理神器 — tmux〉。 ↩︎

  5. Shubham 提供的做法,可讓新開的 pane 及 window 保持在目前所在的目錄。Ham Vocke 的文章也介紹幾種有趣的 tmux 設定。 ↩︎