使用 tmux 打造一個高顏值的終端

tmux

tmux is a terminal multiplexerlinux

tmux 是一個終端複用器,這也是它命名的由來 t(terminal) mux(multiplexer),你能夠在一個屏幕上管理多個終端!webpack

mac 上得益於 iterm2,你管理多個終端窗口至關方便。可是在 linux 上,iterm2 就鞭長莫及了,tmux 的優點就顯出來了。git

就我理解,tmux 在 linux 上或者 mac 上有諸多好處github

  1. 分屏web

    誠然,iterm2 也是能夠作到分屏的,可是 iterm2 有一個缺點即是 iterm for Mac。若是結合 iterm2ssh 的話,iterm2 分屏須要不斷地 ssh <server>,致使的後果就是有多個用戶鏈接,使用 who 命令查看登陸用戶數。shell

  2. attachvim

    attach 能夠起到保護現場的做用,不至於因 ssh timeout,而喪失了工做環境。後端

  3. 操做簡單,可配置化centos

    你可使用快捷鍵很快地在多個窗口,面板間切換,粘貼複製,無限滾屏。bash

至於說它好看,體如今可定製化樣式的狀態欄下,能夠設置狀態欄的樣式, 位置,當前window的樣式,狀態欄信息的豐富度。好比 gpakosz/.tmux 的配置

tmux

本章將介紹如下內容

  • contos/mac 上如何安裝 tmux
  • 使用 ansible 自動化批量安裝 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
複製代碼

使用 ansible 自動化安裝

使用源碼編譯安裝過於瑣碎且易錯,又有可能須要在若干臺服務器上安裝 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 相似於 iterm2Tab,包含多個 pane,如下中文會翻譯爲窗口
  • pane 相似於 iterm2Pane,如下中文會翻譯爲面板

啓動

# 新建一個 tmux session
$ tmux
複製代碼

分屏

tmux 環境下使用快捷鍵 prefix %prefix " 完成分屏

查看全部快捷鍵

prefix ?

tmux 高頻操做

向終端發送 prefix key

我習慣 <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
複製代碼

保持 ssh 鏈接

每次新建 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 了。不過鼠標模式我不大喜歡,因此仍是禁了。

況且,開啓鼠標支持後,誰均可以操做個人終端了,一點逼格也沒有了

保留當前路徑

新開 panewindow 時,保持當前路徑。爲之前的命令添加參數 -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&emsp;&emsp; &emsp;# 進入選擇 buffer 界面,更加靈活
複製代碼

另外,也能夠開啓鼠標支持,用鼠標來選擇文字。

查找關鍵字

既然進入 copy-mode,熟悉 vi 的朋友必定知道查找是 /?

快速定位窗口

假設你新建了多個窗口,須要快速定位到某一個窗口,而你雖知道那個窗口中的內容,卻忘了窗口號,這樣如何解決呢?

有一個很好的解決方案的命令即是 find-window,更好用的即是默認的快捷鍵 prefix f。輸入窗口內容的關鍵字,即可以快速定位到窗口,不過有一個小小的缺點,即是不能定位到面板!

Last but not least

man tmux ! **不看文檔不足以熟練,不看源碼不足以精通。**因此,日常須要多看幾眼文檔,多瞧幾個命令。

小結

經過本章你能夠很熟練地在服務器中使用 tmux 同時管理多個窗口,再結合 vim 的使用就可使在服務器裏工做達到爲所欲爲的地步了。關於 vim 的使用,配置以及插件,能夠參考上一章 vim 快速上手,配置以及插件


歡迎關注公衆號**山月行**,我會按期分享一些先後端以及運維的文章,而且會有技術與生活上的每日回顧與總結,歡迎關注交流

歡迎關注公衆號山月行,在這裏記錄個人技術成長,歡迎交流
相關文章
相關標籤/搜索