終端環境之tmux


今天繼續介紹我的終端環境,tmux。

why 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就可以選擇文本。回車鍵進行復制。然后再通過]進行粘貼。

這里我將復制粘貼設為類似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 創建一個新的window
  • b 重命名當前window
  • & 關閉當前window
  • n 移動到下一個窗口
  • p 移動到前一個窗口
  • l 切換到上一個窗口
  • w 列出所有窗口編號,並進行選擇切換
  • 編號 移動到指定編號的窗口。
  • . 修改窗口編號,相當於排序。
  • f 搜索所有的窗口。非常方便的功能。如圖

pane操作

  • " 橫向分割
  • % 縱向分割
  • 方向鍵 在pane直接移動
  • o 到下一個pane
  • opt+方向鍵 調整pane大小
  • { / }左右pane交換
  • 空格 橫豎切換
  • q 顯示pane的編號
  • x 關閉當前pane

我的配置將分割操作改為vi風格的vs,而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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM