終端環境之tmux

發表於2013-08-11

【本文來自文章作者@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。大家可以根據自己喜好來配置:

輸入?顯示所有的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>進行貼上.

所有的複製都會被記錄到緩衝區,輸入#或者 tmux list-buffers檢視緩衝區,同時也進入了複製模式。也可以使用”=”來選擇並貼上緩衝區內容。tmux的緩衝區和系統剪貼簿是完全獨立的,為了複製到系統剪貼簿,我做了如下處理,對於mac os X使用者:

第一步:

而後增加配置:

這樣,在tmux中進行復制後。按下字首鍵後鍵入y,就會在狀態列顯示已貼上到剪貼簿,如圖

此時,就可以用cmd-v進行貼上了。系統剪貼簿的也可以鍵入<C-v>貼上。(當然,更方便的還是直接cmd-v,無需字首鍵)。對於linux使用者,可以使用xclip,配置如下:

同樣鍵入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的大小也是一樣。配置如下:

同時還繫結了

使用q來關閉pane,免去了關閉確認.但是會覆蓋掉原有的p操作,顯示pane編號。我不需要這個,覆蓋就覆蓋了。

指令碼化tmux

tmux可以進入命令列模式,快捷鍵為:。而且執行的命令在不同的session中都會生效。我繫結了一個命令:

這樣只要輸入r,就可以重新載入tmux.conf配置檔案。

還可以用來進行自動化佈局,例如:

將其儲存在隨便在一個檔案中,而後使用和上述類似的source-file載入該檔案,就會分隔三個pane,其中一個pane 會輸入node,開啟一個node的js shell。其中的50,40 為佔視窗大小的百分比。

同時,tmux還支援執行shell指令碼。可以寫一個shell指令碼進行各種環境初始化和佈局初始化。這裡就不再介紹了。

狀態列

tmux的狀態列配置非常簡單。相比screen就…… 比如我的配置中:

這一行就將狀態列左側配置為:

綠色,#S,#I,#p分別表示session,window,pane編號。

當然,你可以讓狀態行更強大,可以使用tmux-powerline。 如圖

是一個示例樣式。 不過我還是喜歡簡潔,而且大多數的資訊其實都沒什麼用。自己並沒有使用,不過還是推薦大家試一試,使用也不復雜,按照說明一步步來就可以了。使用powerline需要使用pathc過的字型,在這裡可以找到一些,當然也可以自己patch。

 

最後提供我的整個配置檔案,可以在我的dotfiles的tmux目錄下找到。

 

相關文章