tmux 默認的快捷鍵對我們來說并不友好。許多重要而且有用的功能都使用了一些很難操作的組合鍵或是冗長的命令字符串。而且 tmux 默認的配色方案眼睛看起來也不舒服。在本章節(jié)中,我們會為 tmux 構建一個基本的配置文件并在本書的剩余章節(jié)一直使用。首先我們會從定制屏幕導航以及創(chuàng)建、調整面板大小開始,然后討論如何處理一些更高級的設置。確保你的終端配置正確,這樣我們設置的一些 tmux 外觀屬性也能在你的屏幕上正常顯示。完成這些之后,你就會對 tmux 的可擴展性有了更深的理解,然后你可以定制一個你獨有的 tmux。下面,我們先從如何配置 tmux 開始。
在默認情況下,tmux 會在兩個位置查找配置文件。首先查找 /etc/tmux.conf
作為系統(tǒng)配置,然后在當前用戶的主目錄下查找 .tmux.conf
文件(~/.tmux.conf 優(yōu)先級更高,譯者注)。如果這兩個文件都不存在,tmux 就會使用默認配置。我們并不需要使用系統(tǒng)配置,所以只需要在主目錄下創(chuàng)建一個新的配置文件即可(即 ~/.tmux.conf
文件)。命令如下:
$ touch ~/.tmux.conf
在這個文件里可以做任何想讓 tmux 做的事情,比如定義新的快捷鍵,配置一個包含多個窗口、面板,運行著程序的 tmux 默認環(huán)境等。我們先從一些基本的選項做起,令 tmux 使用更簡單。
CAPS LOCK
鍵,譯者注)在很多鍵盤上,CAPS LOCK 鍵就在 a 鍵旁邊。如果把這個鍵映射為 CTRL 鍵,你會在使用快捷鍵時更加方便。
在 OS X 系統(tǒng)中,可以在偏好設置的鍵盤選項面板里重新映射 CAPS LOCK 鍵。
你只要按下 Modifier Keys 按鈕然后把 CAPS LOCK 鍵的動作變?yōu)?Control。
在 Linux 系統(tǒng)中,這個過程會因你的操作系統(tǒng)而變得稍有些復雜,不過你可以在 Emacs 的維基百科中找到辦法。
這個小小的改變?yōu)槟愎?jié)省的時間遠超你的想象。
你在之前已經知道 tmux 默認使用 CTRL-b
鍵作為它的命令前綴鍵。許多使用過 GNU-Screen 的 tmux 用戶都是使用 CTRL-a
鍵作為命令前綴鍵,使用 CTRL-a
鍵是個非常不錯的選擇因為它更容易同時按下,尤其是如果你把 CAPS LOCK
鍵重新映射為 CTRL
鍵之后,CTRL-a
就更容易按下了。它能讓你的手常位于鍵盤的主按鍵區(qū)。
在 .tmux.conf
文件里,我們使用 set-option
命令來設置選項,可以縮寫為 set
。下面我們就通過命令重新定義命令前綴鍵:
set -g prefix C-a
在這個例子里,我們使用了 -g
選項,也就是全局配置(global),它能讓設置的選項在所有創(chuàng)建的 tmux 會話里生效。
盡管不是必須的,我們可以通過 unbind-key
命令或 unbind
命令移除之前綁定的組合鍵??梢栽谂渲梦募镙斎胍韵聝热輥磲尫?CTRL-b
組合鍵:
unbind C-b
tmux 并不會實時地自動從配置文件讀取你所做的修改。因此如果你在使用 tmux 的過程中修改了 .tmux.conf
文件,要想讓所做的配置修改生效的話,你需要關閉所有的 tmux 會話,或者在 tmux 命令模式輸入 PREFIX :
命令然后輸入以下內容:
source-file ~/.tmux.conf
現在就可以使用 CTRL-a
鍵作為命令前綴鍵了。在剩余章節(jié)中,我們還是會繼續(xù)把它稱為 PREFIX
鍵。
當我們向 tmux 發(fā)送命令時,tmux 增加了一個小小的延時(也就是在松開 PREFIX
鍵和按下命令鍵之間的時間,譯者注),這個延時是很有可能妨礙其它程序的運行,比如 Vim 編輯器??梢酝ㄟ^設置這個延時而讓 tmux 響應地更快。在配置文件中增加下面的內容,將延時設置為 1ms:
set -sg escape-time 1
當重新載入配置文件后,我們就可以向 tmux 更快地發(fā)送快捷鍵了。
在第一章里,我們討論了窗口以及在一個會話里創(chuàng)建多個窗口時如何通過索引切換當前的窗口。這個索引是從 0 開始的,感覺似乎有點惡心(程序員貌似還比較習慣從 0 開始的索引 =。=,譯者注)。通過在配置文件里添加下面的內容可以讓窗口的索引從 1 開始:
set -g base-index 1
也就是說,我們可以使用 PREFIX 1
快捷鍵來切換到第一個窗口,而不是 PREFIX 0
。
還可以通過 pane-base-index
選項來設置面板的初始索引。我們把下面這行添加到配置文件中,好讓窗口和面板的初始索引保持一致:
setw -g pane-base-index 1
到目前為止,我們已經學會了使用 set
命令來配置 tmux 會話。如果需要配置與窗口進行交互的選項,需要使用 set-window-option
命令,可以簡寫為 setw
。在本書中,為了讓配置的例子能夠在一行內顯示,因此我使用的都是命令的簡寫,你在使用簡寫時要特別小心,因為一不小心,你就有可能把 set
和 setw
搞混了。
現在我們再來創(chuàng)建幾個更有用的快捷鍵來加速你的操作。
tmux 里的許多默認快捷鍵無論是在生理上還是在心理上來說都有些過于延展了。拿 PREFIX %
鍵來說,它不光在鍵盤上不好按,而且如果不看命令參考的話,你幾乎記不住它是用來做什么的。
在本節(jié)中,我們將會定義或者重定義一些最常用的 tmux 命令。我們先從自定義一個重新加載 tmux 配置文件的快捷鍵開始。
每次我們對配置文件做修改之后,要想讓新的配置文件生效,要么關掉所有的 tmux 會話然后重新打開它,要么就要在 tmux 會話里發(fā)送一個命令來重新加載配置文件?,F在我們來自定義一個快捷鍵來讓它重新加載配置文件。
我們使用 bind
命令來定義新的快捷鍵。先指定要按下的鍵,后面跟著它要執(zhí)行的命令。
對于我們的第一個快捷鍵,我們設置為 PREFIX r
,讓它重新加載當前 tmux 會話的 .tmux.conf
配置文件,就像這樣:
bind r source-file ~/.tmux.conf
盡管上面的命令里沒有 PREFIX
,但是在使用 bind
命令定義快捷鍵之后,還是需要在實際中先按下 PREFIX
鍵,然后再按下 r
鍵。雖然我們剛才自定義了重新加載配置文件的快捷鍵,但是在新的配置文件被加載前我們還是不能使用它,因此還需要再使用一次 PREFIX :
快捷鍵進入命令模式,然后輸入以下命令重新加載配置文件:
source-file ~/.tmux.conf
重新加載配置文件后,tmux 并不會提示配置是否有所改變,可以使用 display
命令讓 tmux 在狀態(tài)欄輸出一個消息。我們修改一下剛才定義的快捷鍵,讓它能夠在配置文件加載后顯示一個消息“Reloaded!”:
bind r source-file ~/.tmux.conf \; display "Reloaded!"
通過在多個命令之間添加 \;
符號可以使一個鍵可以綁定執(zhí)行多個命令。
通過剛才定義的快捷鍵,我們就可以在修改配置文件后按下 PREFIX r
鍵讓新的配置快速生效。
當前可以!在 bind 命令后面添加 -n 參數就可以通知 tmux 這個快捷鍵不需要按下前綴鍵。例如:
bind-key -n C-r source-file ~/.tmux.conf
通過上面的配置,你就可以使用 CTRL-r 鍵來重新加載配置文件了。
但是,這么做會讓 tmux 會話里的任何程序或命令都禁用組合鍵,所以使用這種做法時你要特別小心。
我們在前面把命令前綴鍵重新映射到了 CTRL-a
鍵,但是例如 Vim、Emacs 甚至是 Bash 終端也會經常用到這個組合鍵。我們需要配置 tmux,把這個組合鍵發(fā)送給需要的程序中??梢远x一個快捷鍵來發(fā)送 send-prefix
命令,就像這樣:
bind C-a send-prefix
在配置生效后,你只需要按兩次 CTRL-a
鍵就可以把 CTRL-a
命令發(fā)送給 tmux 里的程序了。
tmux 里分割面板的默認鍵比較難記,所以我們來重新定義為易記的快捷鍵。我們把水平分割定義為 PREFIX |
鍵,把垂直分割定義為 PREFIX -
鍵:
bind | split-window -h
bind - split-window -v
乍一看,你可能覺得這兩個鍵搞反了。split-window
命令的 -v
參數和 -h
參數分別代表“垂直(vertical)”分割和“水平(horizontal)”分割,但是對于 tmux 來說,垂直分割表示在當前面板之下創(chuàng)建一個新的面板,所以垂直分割之后的兩個面板會上下疊在一起。而水平分割表示在當前面板旁邊創(chuàng)建一個新的面板,因此兩個面板時左右并排顯示在屏幕上的。因此,要想垂直地分割窗口,就要使用“水平”分割;要想水平地分割窗口,就要使用“垂直”分割。
使用新的快捷鍵會讓我們聯想起來更加符合視覺感受。如果想要分割窗口,只需現在腦袋里想象你要把窗口分割成什么樣子然后按下快捷鍵。
使用 PREFIX o
鍵在面板之間移動有點讓人討厭,但是要是使用箭頭鍵(上下左右鍵,譯者注)就意味著必須把手從鍵盤的主操作區(qū)拿開。如果你使用過 Vim 編輯器,你可能會比較熟悉使用 h
,j
,k
和 l
鍵來回移動??梢园?tmux 里的移動鍵映射為 Vim 的操作方式。
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
另外,還可以定義 PREFIX CTRL-h
鍵和 PREFIX CTRL-l
鍵在窗口之間循環(huán)切換:
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+
如果你已經把 CAPS LOCK
鍵重新映射到 CTRL
鍵,你現在就可以在窗口和面板之間來回切換而不必把手移出鍵盤的主操作區(qū)。
要調整面板大小,可以進入命令模式然后輸入resize-pane -D
命令讓一個面板向下調整一行的距離。我們可以通過在調整方向的后面添加一個數字來指定要調整的大小,比如 resize-pane -D 5
。但是這個命令有些啰嗦,我們來定義幾個快捷鍵使得調整面板大小更方便些。
我們在之前使用了 Vim 的移動鍵來調整窗口大小。現在我們來使用 PREFIX H
,PREFIX J
,PREFIX K
和 PREFIX L
鍵調整面板的尺寸:
bind H resize-pane -L 5
bind J resize-pane -D 5
bind K resize-pane -U 5
bind L resize-pane -R 5
注意,上面的配置使用的是大寫字母。tmux 是對大小寫敏感的,大寫字母和小寫字母分別表示不同的快捷鍵。你需要使用 SHIFT
鍵來觸發(fā)大寫字母的快捷鍵。
使用這樣的移動鍵會幫助我們始終跟隨窗口移動的方向。比如,如果有一個分割為兩個水平面板的窗口,就像這樣:
-------------------
| |
| Pane 1 |
| |
-------------------
| |
| Pane 2 |
| |
-------------------
如果想要增加 Pane 1 的大小,那么就可以把光標移動到 Pane 1 里然后按下 PREFIX J
鍵,那么水平分割線就會向下移動。如果按下 PREFIX K
,就會讓水平分割線向上移動。
我們通過逐漸增加的方式來調整面板大小,也就是說每次想要調整面板大小的時候,就需要先按下前綴鍵。但是如果使用了 -r
參數,那么就可以讓這個快捷鍵變?yōu)椤翱芍貜偷模╮epeatable)”,這意味著只需要按下前綴鍵一次,然后就可以在最大重復限制范圍內持續(xù)地按下定義的命令鍵。修改后的配置如下:
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
默認的最大重復限制為 500 毫秒,可以通過設置 repeat-time
選項把這個時間改為更大的數值。
現在我們把注意力轉移到 tmux 如何與鼠標配合使用。
雖然 tmux 的設計目標是純鍵盤操作,但是你會發(fā)現有時候使用鼠標更加方便。如果你的終端配置支持使用鼠標的向前單擊和滾動切換程序,那么你就可以告訴 tmux 如何處理這些鼠標事件。
有時你可能需要使用鼠標滾輪在終端的緩沖區(qū)里向上滾屏,或者你剛開始使用 tmux 時想用鼠標選擇窗口和面板。要想在 tmux 里使用鼠標,需要打開鼠標模式:
setw -g mode-mouse on
還可以配置 tmux,讓它能夠使用鼠標選擇一個面板、調整面板大小或者讓我們在窗口列表里選擇一個窗口。我們需要配置與剛才類似的配置,就像這樣:
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on
把這些配置添加到配置文件里非常方便,但是你要記住,在 tmux 里使用鼠標會讓你的操作速度變慢。盡管使用滾屏和單擊功能似乎是個好主意,但是你還是應該學會通過相應的鍵盤操作切換面板或是在緩沖區(qū)里向前或向后移動。所以,在我們的配置文件里會把鼠標選項禁用。可以像這樣明確地指明:
setw -g mode-mouse off
set -g mouse-select-pane off
set -g mouse-resize-pane off
set -g mouse-select-window off
或是簡單地禁用全部鼠標選項:
setw -g mode-mouse off
這樣設置可以防止不小心使用鼠標選中了終端窗口而導致的誤操作,而且它會使我們更加專注于鍵盤操作。
tmux 提供的高擴展性配置系統(tǒng)可以高度自定義我們與界面交互的方式,還可以配置它的外觀,讓它看起來更舒適一些,而且在一些情境中,它還能展示給我們更多的信息。
tmux 提供了相當多的方法來定制外觀。在本節(jié)中,我們會討論如何配置這些選項,包括配置狀態(tài)欄和其它面板。我們先配置不同的顏色,然后把乏味的狀態(tài)欄變成能展示重要信息的工具。
為了讓 tmux 具有最佳的視覺體驗,首先要確保終端和 tmux 都運行在 256 色模式里。我們先來配置終端。
可以使用一個簡單的 Perl 腳本來測試終端的色彩模式。命令如下:
$ wget http://www.vim.org/scripts/download_script.php?src_id=4568 -O colortest
$ perl colortest -w
如果你的配置正確的話,你應該看到終端類似于圖5(終端正確顯示 256 色)所示。
圖5 - 終端正確顯示 256 色
如果你使用的是 Linux 系統(tǒng),你可能需要把下面內容添加到你的 ~/.bashrc
文件里才能運行一個 256 色的終端:
[ -z "$TMUX" ] && export TERM=xterm-256color
這個條件語句會確保 TERM
變量只在 tmux 外運行,因為 tmux 會自己設置它所在的終端。
如果你使用的是 Mac ,你應該知道在雪豹系統(tǒng)里終端只會顯示 16 色。你需要另外安裝一個終端,比如 iTerm2 才能得到全色彩支持。
如果無法看見顏色的正確編號,你需要配置你的終端使用 xterm 的 256 色模式。在 iTerm2 終端里,你可以編輯默認的配置文件找到這個選項,然后把終端模式設置為 xterm-256color,就如圖6(為 tmux 配置 iTerm2)所示:
圖6 - 為 tmux 配置 iTerm2
另外,你還要保證你的終端模擬器支持顯示 UTF-8 字符,只有這樣才能讓譬如面板分割線的可視元素顯示為虛線。
為了讓 tmux 以 256 色模式顯示內容,需要把下面內容添加到我們的 .tmux.conf
文件里:
set -g default-terminal "screen-256color"
當色彩配置正確配置后,你會發(fā)現在 tmux 里運行例如 Vim 之類的程序更加方便了,尤其是如果語法高亮使用了更加豐富的配色方案。你可以在圖7(Vim 里 16 色和 256 色對比)里看出差別來?,F在就可以來配置 tmux 組件的外觀了,我們先從配色開始。
圖7 - Vim 里 16 色和 256 色對比
我們可以改變 tmux 交互界面的多個部分的顏色,包括狀態(tài)欄,窗口列表,命令區(qū)域甚至是面板分割線。
tmux 提供了特定顏色的變量,包括 black
(黑,譯者注),red
(紅,譯者注),green
(綠,譯者注),yellow
(黃,譯者注),blue
(藍,譯者注),magenta
(品紅,譯者注),cyan
(藍綠,譯者注),或 white
(白,譯者注)。我們可以使用在 256 色調色板中的 colour0
到 colour255
。如果你再看看 colortest
程序的輸出結果,你會看到這些顏色的編號。你還可以運行這個簡單的 shell 腳本來選擇你需要的顏色:
for i in {0..255} ; do
printf "\x1b[38;5;${i}mcolour${i}\n"
done
tmux 有特定的配置選項可以更改每個組件的前景色和背景色。我們先從定制狀態(tài)欄的顏色開始探索。
狀態(tài)欄的默認配色是在亮綠色的背景上顯示黑色字體。這看起來有些太乏味了。我們讓它變成默認為黑色背景上顯示白色的字體。
使用 status-bg
和 status-fg
選項來設置狀態(tài)欄的背景色和前景色,可以像這樣配置:
set -g status-fg white
set -g status-bg black
在后面我們會定制狀態(tài)欄內條目(items)的顏色?,F在先來配置窗口列表的顏色。
我們想讓當前活動的窗口顯示的更加明顯可以設置當前活動窗口的顏色為紅色,不活動窗口的顏色為藍綠色。使用 set-window-option
選項來配置普通窗口(regular window)的樣式,就像這樣:
setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim
可以使用 default
作為一個默認值那么這個值就會繼承狀態(tài)欄的顏色。
要配置活動窗口(active window)的樣式,可以使用相似的配置:
setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-attr bright
這樣就定制了窗口列表的顏色,還可以定制面板分隔符(pane dividers)的顏色。
可以指定面板分隔符的顏色,更棒的是,還可以通過定義顏色讓當前活動面板變得更顯眼,就像圖8(活動面板)所示。
圖8 - 活動面板
面板也有前景色和背景色之分,所以我們設置相應的變量:
set -g pane-border-fg color
set -g pane-border-bg color
set -g pane-active-border-fg color
set -g pane-active-border-bg color
一個面板的前景色就是組成邊界的虛線顏色。默認的背景色是黑色,如果讓它標記出當前活動面板,就可以讓活動面板顯得相當突出:
set -g pane-border-fg green
set -g pane-border-bg black
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow
在修改狀態(tài)欄前,我們先來潤色一下 tmux 命令行。
在 tmux 的命令模式輸入 tmux 命令也能看到警告信息,當然也可以定制它的配色。配置方法幾乎和配置狀態(tài)欄相同。
我們把背景色改為黑色,文字顏色設置為白色。當有消息提示時設置它的顏色為亮白色。配置如下:
set -g message-fg white
set -g message-bg black
set -g message-attr bright
就是這么簡單。現在我們來為窗口列表兩邊的狀態(tài)欄區(qū)域配色。
tmux 的狀態(tài)欄能顯示非常多的信息。可以通過執(zhí)行 shell 命令使用預定義的組件(components)或者創(chuàng)建我們自己的組件。
默認的狀態(tài)欄顯示的信息,看起來像是這樣:
[development] 0:bash* "example.local" 00:44 02-Nov-1
在左側,先看到 tmux 會話的名稱,然后后面跟著窗口列表。窗口列表先是顯示當前窗口的索引值,然后跟著窗口的名稱。在右側,可以看到服務器的主機名(或者是本機的主機名,譯者注),后面跟著日期和時間。下面我們來自定義狀態(tài)欄的的內容。
狀態(tài)欄包含 3 個組件:一個左面板,窗口列表和一個右面板。我們可以改變狀態(tài)欄里左側或右側面板的內容,這需要使用一個文本和變量的組合。表1(狀態(tài)欄變量)列出了狀態(tài)欄里可能用到的變量。
表1 - 狀態(tài)欄變量
變量 | 描述 |
---|---|
#H |
本地主機的主機名 |
#h |
本地主機的主機名,沒有 domain |
#F |
當前窗口的標簽 |
#I |
當前窗口的索引 |
#P |
當前面板的索引 |
#S |
當前會話的名稱 |
#T |
當前窗口的標題 |
#W |
當前窗口的名稱 |
## |
一個 # 符號 |
#(shell-command) |
shell 命令的第一行輸出 |
#[attributes] |
要改變的顏色或屬性 |
例如,如果想要在左側顯示當前 tmux 會話的名稱,就需要使用 set-option -g status-left
選項,后面跟著 #S
值,就像這樣:
set -g status-left "#S"
還可以通過設置前景色讓它顯示地更明顯,像這樣:
set -g status-left "#[fg=green]#S"
可以向狀態(tài)欄里添加任何想要的屬性和條目。為了便于展示,我們修改了左側的狀態(tài)欄,讓它顯示綠色的會話名稱,黃色的窗口編號,以及藍綠色的當前面板。配置如下:
set -g status-left "#[fg=green]#S #[fg=yellow]#I #[fg=cyan]#P"
也可以向狀態(tài)欄里添加任意文字。我們現在添加一些文字,讓會話、窗口和面板顯示地更突出,像這樣:
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
我們設置了 status-left-length
選項因為指定的輸出對默認長度來說太長了,所以我們讓那個區(qū)域更寬一些。
還可以配置右側的狀態(tài)欄?,F在我們向它添加當前日期和時間:
set -g status-right "#[fg=cyan]%d %b %R"
這樣配置的日期格式是“13-Jan 13:45”,你可以讓它顯示任意你想要的格式,可以使用許多編程語言通用的 strftime()
時間格式化機制。
在狀態(tài)欄里開啟 UTF-8 支持是個不錯的注意,尤其是如果你特別喜歡使用這些字符。
set -g status-utf8 on
還可以更進一步,通過使用 #(shell-command)
變量把 shell 命令加入到狀態(tài)欄中,在狀態(tài)欄顯示該命令的返回結果。在后續(xù)章節(jié)會詳細介紹這個功能。
我們已經把當前時間和一些其它動態(tài)信息添加到了狀態(tài)欄,這時需要告訴 tmux 這些信息的刷新周期。默認配置下,tmux 會每 15 秒刷新一次狀態(tài)欄。可以通過使用 set-option -g status-interval
命令后面加上刷新周期(以秒為單位,譯者注)來指定 tmux 的刷新時間,就像這樣:
set -g status-interval 60
這樣就會讓 tmux 每 60 秒刷新一次狀態(tài)欄。注意,如果你在狀態(tài)欄里添加了 shell 命令,這些命令也會在每次狀態(tài)欄刷新時執(zhí)行一遍,所以要注意不要加載太多資源密集型的腳本。
我們還能控制窗口列表顯示的位置。默認的,窗口列表是靠左對齊的,通過簡單的配置就可以讓窗口列表在左右面板之間居中顯示:
set -g status-justify centre
這樣配置就會讓窗口列表居中顯示。創(chuàng)建新窗口時,窗口列表會相應地變換位置,讓整個窗口列表顯示在狀態(tài)欄正中間。
同樣的,我們希望如果當前會話的其他窗口里有一些事件發(fā)生時我們能夠注意到這些事件,那么我們就可以快速響應那個窗口??梢酝ㄟ^增加一個可視化的通知(visual notification)實現這個功能,像這樣:
setw -g monitor-activity on
set -g visual-activity on
現在呢,如果其它窗口里有一些活動,它就會使用藍綠色的背景色突出顯示,就像這里的 webserver 窗口:
更多建議: