轉自:http://harttle.com/2015/11/06/tmux-startup.html
你是否曾經開過一大堆的Terminal?有沒有把它們都保存下來的沖動?Tmux 的Session就是做這件事情的!你可以隨時退出或者進入任何一個Session。每個Session有若干個Window,每個Window又可以分成多個窗格(Pane)。
即使iTerm/Terminal/Konsole意外關閉也沒關系。Session可以完全恢復!但是關機就不可以了,不過你可以寫腳本來恢復!
Tmux是一個終端復用軟件,BSD協議發布。一般用於在一個命令行窗口中訪問多個命令行會話,或者在一個命令行終端中同時使用多個程序。Tmux用起來是怎樣的呢?看圖:
Tmux 最經典的使用場景便是用 Tmux+Vim 來做一個IDE,其中Vim部分的配置過程記錄在了這里,本文介紹Tmux的配置和使用。
iTerm的窗格和Tmux有什么區別?
iTerm是一個GUI軟件,它的窗格只是窗格而已!而Tmux是終端復用,在一個命令行窗口中不僅可以顯示多個Shell的內容,而且可以保持多個會話。 最重要的是:Tmux和Vim一樣,屬於字符終端軟件,不需要任何GUI的支持,在遠程登錄時尤其有用。
Tmux和screen有什么區別?
這兩個都是做終端復用的,我在阿里雲ECS上搭建Node.js API服務器時用過screen,它是GNU軟件,而Tmux是BSD的協議。 它們最主要的區別是Tmux支持Vi/Emacs風格的鍵盤映射,更好的接口和文檔,以及更好的腳本控制。所以建議使用Tmux!
安裝Tmux
OSX
brew install tmux
Linux
pacman -S tmux # archlinux apt-get install tmux # Ubuntu yum install tmux # Centos
基本使用
安裝好后就可以啟用一個Tmux Session了:(通過 tmux new -s myname 可以指定Session名)
tmux
在Tmux Session中,通過<prefix>$可以重命名當前Session。其中<prefix>指的是tmux的前綴鍵,所有tmux快捷鍵都需要先按前綴鍵。它的默認值是Ctrl+b。
<prefix>c可以創建新的窗口(Window),<prefix>%水平分割窗口(形成兩個Pane),<prefix>"垂直分割窗口。退出當前Session的快捷鍵是<prefix>d。然后在Bash中可以查看當前的tmux服務中有哪些Session:
tmux ls
然后根據Session的名字可以再回去:
tmux a -t myname (or at, or attach)
基本配置
默認的<prefix>是Ctrl+b,如果你覺得不好按可以調整為Ctrl+a,只需要在配置文件~/.tmux.conf中加入:
unbind ^b
set -g prefix 'C-a'
為了能讓Tmux動態載入配置而不是重啟,我們設一個快捷鍵<prefix>r來重新載入配置:
bind r source-file ~/.tmux.conf \; display-message "Config reloaded"
注意,通過
<prefix>r重新載入配置並不等同於重啟,只是增量地執行了配置文件中的所有命令而已。如果配置未生效,可以通過tmux kill-server來強行關閉Tmux。
窗格切換
可以把hjkl設置為切換窗格的快捷鍵:
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
再給調整窗格大小設置快捷鍵:
bind L resize-pane -L 10 # 向左擴展
bind R resize-pane -R 10 # 向右擴展
bind K resize-pane -U 5 # 向上擴展
bind J resize-pane -D 5 # 向下擴展
我們發現當打開新窗格時Shell仍然在Home目錄,可以設置為當前目錄:
bind '"' split-window -c '#{pane_current_path}'
bind '%' split-window -h -c '#{pane_current_path}'
拷貝
在Tmux中通過[進入拷貝模式,按下<space>開始拷貝。然后用Vim/Emacs快捷鍵選擇文本,按下<Enter>拷貝所選內容。然后通過]進行粘貼。
上述所有快捷鍵中,只有
[和]需要先按下<prefix>。
我們可以讓上述拷貝快捷鍵符合Vi風格:
bind Escape copy-mode
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
unbind p
bind p pasteb
setw -g mode-keys vi # Vi風格選擇文本
這樣,按下<Escape>進入拷貝模式,v進行選擇,y拷貝所選內容,p進行粘貼。
鼠標切換窗格
Tmux和Vim風格非常像,也可以設置鼠標模式。下面的設置開啟了所有鼠標功能: 通過點擊選擇窗格,通過拖動更改窗格大小,通過鼠標選擇窗口,還可以通過鼠標選擇復制區域。
setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on
恢復用戶空間
Tmux有一個Bug,其中Shell的用戶空間不是當前用戶,結果就是mac下的open, sudo等命令都會失效。錯誤如下:
The window server could not be contacted. open must be run with a user logged in at the console, either as that user or as root.
解決辦法如下:
更新reattach-to-user-namespace:
brew update
brew upgrade reattach-to-user-namespace
在.tmux.conf中添加:
set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"
這里的
/usr/local/bin/zsh要對應於你的默認Shell,如果你沒做過手腳的話,應該在/usr/bin/bash。
快捷鍵
Sessions
:new<CR> new session
s list sessions
$ name session
:new -s <session-name>可以指定新Session的名字。
Windows (tabs)
c create window
w list windows
n next window
p previous window
f find window
, name window
& kill window
Panes (splits)
% vertical split
" horizontal split
o swap panes
q show pane numbers
x kill pane
+ break pane into window (e.g. to select text by mouse to copy)
- restore pane from window
⍽ space - toggle between layouts
<prefix> q (Show pane numbers, when the numbers show up type the key to goto that pane)
<prefix> { (Move the current pane left)
<prefix> } (Move the current pane right)
<prefix> z toggle pane zoom
Misc
d detach
t big clock
? list shortcuts
: prompt

