今天繼續介紹我的終端環境,tmux。
why tmux?
用一個工具的第一問自然還是為什么要用。其實當時使用tmux的原因很簡單。工作中經常需要長時間的編譯。總想要下班后要關機的情況下,(肯定有人問我為什么關機,我覺得環保:)而且很多時候是筆記本工作,下班還帶回去。),讓遠超服務器繼續進行編譯。簡單的尋覓一番之后,就發現了tmux。而且遠超預期,就一直用了下來。
其他讓我非常喜歡的功能有:
- window,pane的概念可以很好地進行多窗口切換,窗口分割。
- 狀態行配置很容易。
- vi 模式
- 復制粘貼緩沖區
- 腳本化.通過腳本可以自動化窗口布局。
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 |
|
輸入?
顯示所有的bind-key,如圖
如果設置了setw -g mode-keys vi
,可以使用vi 的 j
k
風格快捷鍵上下瀏覽。這些bind-key顯示了所有的tmux操作。按q退出。
下面就介紹一些常用的操作,為了方便大家查看,所有的bind-key都是系統默認的,而不是我自己配置的。省略了前綴鍵。
復制粘貼
[
進入復制模式。]
粘貼
進入復制模式后,可以用vi風格的快捷鍵進行移動(按上文的設置)。按下sapce
就可以選擇文本。回車鍵進行復制。然后再通過]
進行粘貼。
這里我將復制粘貼設為類似vi的模式,使用esc
進入復制模式,v
進入粘貼模式,選擇后y
進行復制。<Prefix-p>
進行粘貼.
# 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用戶:
第一步:
brew install reattach-to-user-namespace
而后增加配置:
# 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,配置如下:
bind y run-shell "tmux show-buffer | xclip -sel clip -i" \; display-message "Copied tmux buffer to system clipboard"
同樣鍵入y
復制buffer中最新的內容到系統剪貼板。
session操作
d
deattch當前session。輸入tmux attach [-t sessionname]
重新進入該session。tmux ls
列出所有session。如圖:輸入,退出當前session后,
tmux attach -t 1
即可切換到名字為1的session。$
重命名當前session<c-z>
掛起當前session
window操作
c
創建一個新的windowb
重命名當前window&
關閉當前windown
移動到下一個窗口p
移動到前一個窗口l
切換到上一個窗口w
列出所有窗口編號,並進行選擇切換編號
移動到指定編號的窗口。.
修改窗口編號,相當於排序。f
搜索所有的窗口。非常方便的功能。如圖
pane操作
"
橫向分割%
縱向分割方向鍵
在pane直接移動o
到下一個paneopt+方向鍵
調整pane大小{ / }
左右pane交換空格
橫豎切換q
顯示pane的編號x
關閉當前pane
我的配置將分割操作改為vi風格的v
和s
,而pane之間的跳轉也改為vi風格,調整pane的大小也是一樣。配置如下:
# 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
bind q killp
使用q
來關閉pane,免去了關閉確認.但是會覆蓋掉原有的p
操作,顯示pane編號。我不需要這個,覆蓋就覆蓋了。
腳本化tmux
tmux可以進入命令行模式,快捷鍵為:
。而且運行的命令在不同的session中都會生效。我綁定了一個命令:
bind r source-file ~/.tmux.conf \; display "Configuration Reloaded!"
這樣只要輸入r
,就可以重新加載tmux.conf配置文件。
還可以用來進行自動化布局,例如:
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就…… 比如我的配置中:
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目錄下找到。
歡迎留言交流。也可以關注我的微博foocoder。