天天看點

終端環境之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。如圖:

終端環境之tmux

底部會出現狀态欄。左邊表示目前為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,如圖

終端環境之tmux

如果設定了

setw -g mode-keys vi

,可以使用vi 的 

j

k

風格快捷鍵上下浏覽。這些bind-key顯示了所有的tmux操作。按q退出。

下面就介紹一些常用的操作,為了友善大家檢視,所有的bind-key都是系統預設的,而不是我自己配置的。省略了字首鍵。

複制粘貼

  • [

     進入複制模式。
  • ]

     粘貼

進入複制模式後,可以用vi風格的快捷鍵進行移動(按上文的設定)。按下

sapce

就可以選擇文本。Enter鍵進行複制。然後再通過

]

進行粘貼。

這裡我将複制粘貼設為類似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

,就會在狀态欄顯示已粘貼到剪貼闆,如圖

終端環境之tmux

此時,就可以用

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。如圖:
    終端環境之tmux
    輸入,退出目前session後,

    tmux attach -t 1

    即可切換到名字為1的session。
  • $

     重命名目前session
  • <c-z>

     挂起目前session

window操作

  • c

     建立一個新的window
  • b

     重命名目前window
  • &

     關閉目前window
  • n

     移動到下一個視窗
  • p

     移動到前一個視窗
  • l

     切換到上一個視窗
  • w

     列出所有視窗編号,并進行選擇切換
  • 編号

     移動到指定編号的視窗。
  • .

     修改視窗編号,相當于排序。
  • f

     搜尋所有的視窗。非常友善的功能。如圖
    終端環境之tmux

pane操作

  • "

     橫向分割
  • %

     縱向分割
  • 方向鍵

     在pane直接移動
  • o

     到下一個pane
  • opt+方向鍵

     調整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]"      

這一行就将狀态欄左側配置為:

終端環境之tmux

綠色,#S,#I,#p分别表示session,window,pane編号。

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

終端環境之tmux

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

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

歡迎留言交流。也可以關注我的微網誌foocoder。

轉載于:https://www.cnblogs.com/noTice520/p/tmux.html

繼續閱讀