tmux is a terminal multiplexerlinux
tmux
是一個終端複用器,這也是它命名的由來 t(terminal) mux(multiplexer)
,你能夠在一個屏幕上管理多個終端!webpack
在 mac
上得益於 iterm2,你管理多個終端窗口至關方便。可是在 linux 上,iterm2
就鞭長莫及了,tmux
的優點就顯出來了。git
就我理解,tmux
在 linux 上或者 mac 上有諸多好處github
分屏web
誠然,iterm2
也是能夠作到分屏的,可是 iterm2
有一個缺點即是 iterm for Mac
。若是結合 iterm2
與 ssh
的話,iterm2
分屏須要不斷地 ssh <server>
,致使的後果就是有多個用戶鏈接,使用 who
命令查看登陸用戶數。shell
attachvim
attach
能夠起到保護現場的做用,不至於因 ssh timeout
,而喪失了工做環境。後端
操做簡單,可配置化centos
你可使用快捷鍵很快地在多個窗口,面板間切換,粘貼複製,無限滾屏。bash
至於說它好看,體如今可定製化樣式的狀態欄下,能夠設置狀態欄的樣式, 位置,當前window的樣式,狀態欄信息的豐富度。好比 gpakosz/.tmux 的配置
本章將介紹如下內容
tmux
tmux
tmux
經常使用操做若是你在 mac 上,那麼你可使用 brew install tmux
安裝 tmux,簡單,快捷。
可是你在 centos 上,若是直接使用 yum
來安裝軟件,會安裝特別舊的版本,且不少實用的功能沒法使用。那麼直接經過 tmux源碼 本身編譯安裝則是一個不錯的注意
# 安裝軟件依賴
$ yum install -y gcc automake libevent-devel ncurses-devel glibc-static
# 下載源代碼
$ git clone git@github.com:tmux/tmux.git
# 切換到 2.8 版本
$ git checkout 2.8
$ cd tmux
# 編譯源碼
$ sh autogen.sh && ./configure && make
# 查看版本號
$ ./tmux -V
tmux 2.8
複製代碼
使用源碼編譯安裝過於瑣碎且易錯,又有可能須要在若干臺服務器上安裝 tmux
,此時使用 ansible
進行自動化安裝是一個不錯的選擇。 關於 ansible
可參考本系列文章 使用 ansible 作自動化運維。
$ git clone git@github.com:shfshanyue/ansible-op.git
# 一次性給多服務器上安裝 tmux
$ ansible-playbook -i hosts tmux.yml
複製代碼
tmux
這個 ansible role 的配置在 個人tmux配置 上。配置文件以下
# 安裝依賴軟件
- name: prepare
yum:
name: "{{item}}"
with_items:
- gcc
- automake
- libevent-devel
# 字符終端處理庫
- ncurses-devel
- glibc-static
# 下載 tmux 源文件
- name: install tmux
git:
repo: https://github.com/tmux/tmux.git
dest: ~/Documents/tmux
version: 2.8
- name: make tmux
shell: sh autogen.sh && ./configure && make
args:
chdir: ~/Documents/tmux/
# 使 tmux 全局可執行
- name: copy tmux
copy:
src: ~/Documents/tmux/tmux
dest: /usr/bin/tmux
remote_src: yes
mode: 0755
# 使用個人配置文件
- name: clone config file
when: USE_ME
git:
repo: https://github.com/shfshanyue/tmux-config.git
dest: ~/Documents/tmux-config
- name: copy config file
copy:
src: ~/Documents/tmux-config/.tmux.conf
dest: ~/.tmux.conf
remote_src: yes
- name: delete tmux-config
file:
name: ~/Documents/tmux-config
state: absent
複製代碼
server
包含多個 session
session
包含多個 window
window
相似於 iterm2
的 Tab
,包含多個 pane
,如下中文會翻譯爲窗口pane
相似於 iterm2
的 Pane
,如下中文會翻譯爲面板# 新建一個 tmux session
$ tmux
複製代碼
在 tmux
環境下使用快捷鍵 prefix %
與 prefix "
完成分屏
prefix ?
我習慣 <Crtl-s>
來做爲前綴鍵,默認前綴建爲 <Ctrl-b>
。send-prefix
表明向終端發送前綴鍵,send-prefix -2
表明新增一個快捷鍵表明前綴鍵。
# 如下命令直接在 tmux 命令模式執行,或者加關鍵字 `tmux` 在 shell 中執行,或者寫入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能夠進入 tmux 命令模式
$ set -g prefix2 C-s
$ bind C-s send-prefix -2
複製代碼
每次新建 session
的時候帶上名字,方便下次 attach
。
稍微提一個命令 detach
,默認快捷鍵 <prefix> d
,會先 detach
掉當前 session
。
prefix 默認爲
<Ctrl-b>
$ tmux new -s shanyue
# 或者使用快捷鍵 prefix + d
$ tmux detach
$ tmux attach -t shanyue
複製代碼
移動面板命令爲 select-pane
,可配置爲 vim
式的移動命令。
# 如下命令直接在 tmux 命令模式執行,或者加關鍵字 `tmux` 在 shell 中執行,或者寫入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能夠進入 tmux 命令模式
# bind 綁定快捷鍵
# -r 可重複按鍵
# select-pane 選擇面板
$ bind -r h select-pane -L
$ bind -r l select-pane -R
$ bind -r j select-pane -D
$ bind -r k select-pane -U
複製代碼
其中,參數 -r
表明可重複按鍵,好比 prefix r r
表示 prefix r, prefix r
。其中按鍵時間須要經過 repeat-time
來設置,通常爲500ms。
另外,也能夠開啓鼠標支持,經過鼠標快速移動面板。
rename-window
爲重命名窗口名的命令,默認快捷鍵 prefix ,
可是有一個小問題,每當重命名窗口名後,敲幾個空格又會自動重命名,本身的辛勤工做又被破壞了...
須要配置如下兩個配置把它倆給關了,終於能夠重命名了
# 如下命令直接在 tmux 命令模式執行,或者加關鍵字 `tmux` 在 shell 中執行,或者寫入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能夠進入 tmux 命令模式
set -wg allow-rename off
set -wg automatic-rename off
複製代碼
$ tmux set -g mouse on
複製代碼
鼠標支持默認是關閉的,開啓鼠標後,支持複製,翻屏,切換面板,切換窗口,resize。
鼠標支持的功能很強大,至此已經成功打造了一個 iterm2
了。不過鼠標模式我不大喜歡,因此仍是禁了。
況且,開啓鼠標支持後,誰均可以操做個人終端了,一點逼格也沒有了
新開 pane
和 window
時,保持當前路徑。爲之前的命令添加參數 -c
,代表新建窗口或者面板的路徑。
新開面板的命令爲 split-window
# 如下命令直接在 tmux 命令模式執行,或者加關鍵字 `tmux` 在 shell 中執行,或者寫入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能夠進入 tmux 命令模式
bind c new-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
複製代碼
命令爲 tmux resize-pane -Z
,默認快捷鍵爲 prefix z
。須要查看更加詳細的信息時能夠按 prefix z
進入全屏,完畢以後,再按一次恢復。至關酷的一個功能。
第一次使用 tmux
時, 使用webpack
,輸出信息不少,而有用的錯誤信息被覆蓋。此時,往上翻屏就很重要了。此時要說下 tmux window
下的兩種模式,
default-mode
就是剛進入 tmux
默認的模式。
copy-mode
按 prefix [
鍵進入此模式,相似於 vi(emacs)
的 normal mode
,支持複製,粘貼,查找,以及翻頁。具體是 vi
仍是 emacs
能夠根據如下命令探知,代表查看全局窗口設置 mode-keys
,默認會是 vi
,若是不是,那就請設置爲 vi
吧~
$ tmux show-window-options -g mode-keys
複製代碼
與 vi
命令相同,如上下翻頁(半屏)可以使用 C-d
以及 C-u
,固然你也可使用 hjkl
。
另外,也能夠開啓鼠標支持,使用滾輪來翻屏。
上邊說到 copy-mode
,接下來是複製與粘貼。進入 copy-mode
後,v
開始選中,y
來進行復制並會退出 copy-mode
。使用 prefix ]
來進行粘貼。
在 linux 下複製粘貼是最重要最實用的功能了
v & y
爲自定義配置,配置以下
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
複製代碼
複製操做會把內容存進 buffer
裏,熟悉如下幾個命令可以更熟練地操做 buffer
$ tmux list-buffers # 列出全部 buffer
$ tmux show-buffer -b [name] # 顯示最近 buffer,也可指定 buffer name
$ tmux choose-buffer    # 進入選擇 buffer 界面,更加靈活
複製代碼
另外,也能夠開啓鼠標支持,用鼠標來選擇文字。
既然進入 copy-mode
,熟悉 vi
的朋友必定知道查找是 /
與 ?
。
假設你新建了多個窗口,須要快速定位到某一個窗口,而你雖知道那個窗口中的內容,卻忘了窗口號,這樣如何解決呢?
有一個很好的解決方案的命令即是 find-window
,更好用的即是默認的快捷鍵 prefix f
。輸入窗口內容的關鍵字,即可以快速定位到窗口,不過有一個小小的缺點,即是不能定位到面板!
man tmux ! **不看文檔不足以熟練,不看源碼不足以精通。**因此,日常須要多看幾眼文檔,多瞧幾個命令。
經過本章你能夠很熟練地在服務器中使用 tmux 同時管理多個窗口,再結合 vim 的使用就可使在服務器裏工做達到爲所欲爲的地步了。關於 vim 的使用,配置以及插件,能夠參考上一章 vim 快速上手,配置以及插件。