【本文來自文章作者@fooCoder 的投稿。如果其他朋友也有不錯的原創或譯文,可以嘗試推薦給伯樂線上。】
tmux 是一個優秀的終端複用軟體,類似 GNU Screen,但來自於OpenBSD,採用BSD授權。使用它最直觀的好處就是,通過一個終端登入遠端主機並執行tmux後,在其中可以開啟多個控制檯而無需再“浪費”多餘的終端來連線這臺遠端主機。
用一個工具的第一問自然還是為什麼要用。其實當時使用tmux的原因很簡單。工作中經常需要長時間的編譯。在想要回家時編譯還沒結束,可以在計算機 休眠的情況下繼續編譯。簡單的尋覓一番之後,就發現了tmux。 而且遠超預期,就一直用了下來。
其他讓我非常喜歡的功能有:
- 1 window,pane的概念可以很好地進行多視窗切換,視窗分割。
- 2 狀態行配置很容易。
- 3 vi 模式
- 4 複製貼上緩衝區
- 5 指令碼化.通過指令碼可以自動化視窗布局。
tmux簡單介紹
簡單來說,tmux是一個multiplexers,他可以讓你同時執行多個終端,在多個終端之間切換。你可以斷開終端的同時讓終端內容繼續執行(例如之前我提到的編譯任務),類似的還有screen。
tmux是典型的c/s架構。有如下幾個概念。
- · session. session是一個特定的終端組合。輸入tmux就可以開啟一個新的session。
- · window。window 為session中的終端。
- · pane 。pane為一個window分隔出來的各個間隔,即window中的終端。
tmux的使用
正如上所述,在終端中輸入tmux就可以開啟一個tmux session。如圖:
底部會出現狀態列。左邊表示當前為session 0, window 1, pane 1,中間會顯示當前視窗編號和路徑,右側會本機資訊和時間。這並不是預設設定,但是配置tmux的狀態行非常容易,在後面我會簡單的介紹如何配置tmux,並提供我的配置檔案。
tmux的所有操作必須先使用一個字首鍵進入命令模式,或者說進入控制檯,就像vi中的esc。預設的字首為<c-b>,比較難按,很多人會改為screen中的<c-a>,來保持一致性。可是這和emacs風格的終端回到行首的快捷鍵衝突,我使用的是c-k。大家可以根據自己喜好來配置:
1 2 |
set -g prefix ^k unbind ^b |
輸入?顯示所有的bind-key,如圖
如果設定了setw -g mode-keys vi,可以使用vi 的 j k風格快捷鍵上下瀏覽。這些bind-key顯示了所有的tmux操作。按q退出。
下面就介紹一些常用的操作,為了方便大家檢視,所有的bind-key都是系統預設的,而不是我自己配置的。省略了字首鍵。
複製貼上
- [ 進入複製模式。
- ] 貼上
進入複製模式後,可以用vi風格的快捷鍵進行移動(按上文的設定)。按下sapce就可以選擇文字。Enter鍵進行復制。然後再通過]進行貼上。
這裡我將複製貼上設為類似vi的模式,使用esc進入複製模式,v進入貼上模式,選擇後y進行復制。<Prefix-p>進行貼上.
1 2 3 4 5 6 7 |
# Copy and paste like in vim unbind [ bind Escape copy-mode unbind p bind p paste-buffer bind -t vi-copy 'v' begin-selection bind -t vi-copy 'y' copy-selection |
所有的複製都會被記錄到緩衝區,輸入#或者 tmux list-buffers檢視緩衝區,同時也進入了複製模式。也可以使用”=”來選擇並貼上緩衝區內容。tmux的緩衝區和系統剪貼簿是完全獨立的,為了複製到系統剪貼簿,我做了如下處理,對於mac os X使用者:
第一步:
1 |
brew install reattach-to-user-namespace |
而後增加配置:
1 2 3 4 |
# getting tmux to copy a buffer to system clipboard set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash... bind y run "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to system clipboard" bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer" |
這樣,在tmux中進行復制後。按下字首鍵後鍵入y,就會在狀態列顯示已貼上到剪貼簿,如圖
此時,就可以用cmd-v進行貼上了。系統剪貼簿的也可以鍵入<C-v>貼上。(當然,更方便的還是直接cmd-v,無需字首鍵)。對於linux使用者,可以使用xclip,配置如下:
1 |
bind y run-shell "tmux show-buffer | xclip -sel clip -i" \; display-message "Copied tmux buffer to system clipboard" |
同樣鍵入y複製buffer中最新的內容到系統剪貼簿。
session操作
· ddeattch當前session。輸入tmux attach [-t sessionname]重新進入該session。
· tmux ls列出所有session。如圖:
輸入,退出當前session後,tmux attach -t 1即可切換到名字為1的session。
· $重新命名當前session
· <c-z>掛起當前session
window操作
- · c建立一個新的window
- · b重新命名當前window
- · &關閉當前window
- · n移動到下一個視窗
- · p移動到前一個視窗
- · l切換到上一個視窗
- · w列出所有視窗編號,並進行選擇切換
- · 編號移動到指定編號的視窗。
- · .修改視窗編號,相當於排序。
- · f搜尋所有的視窗。非常方便的功能。如圖
pane操作
- · “橫向分割
- · %縱向分割
- · 方向鍵在pane直接移動
- · o到下一個pane
- · opt+方向鍵調整pane大小
- · { / }左右pane交換
- · 空格橫豎切換
- · q顯示pane的編號
- · x關閉當前pane
我的配置將分割操作改為vi風格的v和s,而pane之間的跳轉也改為vi風格,調整pane的大小也是一樣。配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# split windows like vim. - Note: vim's definition of a horizontal/vertical split is reversed from tmux's unbind '"' unbind % unbind s bind s split-window -v bind S split-window -v -l 40 bind v split-window -h bind V split-window -h -l 120 # navigate panes with hjkl bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # resize panes like vim bind < resize-pane -L 10 bind L resize-pane -L 100 bind > resize-pane -R 10 bind R resize-pane -R 100 bind - resize-pane -D 5 bind D resize-pane -D 36 bind + resize-pane -U 5 bind U resize-pane -U 35 # swap panes bind ^u swapp -U bind ^d swapp -D |
同時還繫結了
1 |
bind q killp |
使用q來關閉pane,免去了關閉確認.但是會覆蓋掉原有的p操作,顯示pane編號。我不需要這個,覆蓋就覆蓋了。
指令碼化tmux
tmux可以進入命令列模式,快捷鍵為:。而且執行的命令在不同的session中都會生效。我繫結了一個命令:
1 |
bind r source-file ~/.tmux.conf \; display "Configuration Reloaded!" |
這樣只要輸入r,就可以重新載入tmux.conf配置檔案。
還可以用來進行自動化佈局,例如:
1 2 3 4 5 |
selectp -t 0 splitw -h -p 50 selectp -t 1 splitw -v -p 40 'node' selectp -t 2 |
將其儲存在隨便在一個檔案中,而後使用和上述類似的source-file載入該檔案,就會分隔三個pane,其中一個pane 會輸入node,開啟一個node的js shell。其中的50,40 為佔視窗大小的百分比。
同時,tmux還支援執行shell指令碼。可以寫一個shell指令碼進行各種環境初始化和佈局初始化。這裡就不再介紹了。
狀態列
tmux的狀態列配置非常簡單。相比screen就…… 比如我的配置中:
1 |
set -g status-left "#[fg=green]s#S:w#I.p#P#[default]" |
綠色,#S,#I,#p分別表示session,window,pane編號。
當然,你可以讓狀態行更強大,可以使用tmux-powerline。 如圖
是一個示例樣式。 不過我還是喜歡簡潔,而且大多數的資訊其實都沒什麼用。自己並沒有使用,不過還是推薦大家試一試,使用也不復雜,按照說明一步步來就可以了。使用powerline需要使用pathc過的字型,在這裡可以找到一些,當然也可以自己patch。
最後提供我的整個配置檔案,可以在我的dotfiles的tmux目錄下找到。