tmux 工具集合?
GitHub - rothgar/awesome-tmux: A list of awesome resources for tmux??
要點:
- 習慣性思維的變換
- 與宿主機之間的雙向復制、粘貼
- 手動備份全部窗口,以及還原
- 自定義窗格提示信息
- TPM 插件的安裝思想
- 別名
???
- 在有些場景里,可能無法取代通用終端?為止?
tmux 目前在各大 linux 發行版中,都默認安裝了。這也許是目前最好用的終端了?
但是,由于它默認是為鍵盤用戶設計的;因此,如果要使用鼠標,還需要做進一步的配置。
- 官方提供了鼠標的基本配置命令,但是,需要用戶自己在 .tmux.conf 配置文件中開啟。
- 使用第三方插件,需要安裝插件官方的說明來安裝和配置。
- tmux 官方提供了許多的用于功能擴展的基礎配置接口語句,類似于 API 接口函數,比如鼠標開啟設置,默認沒有開啟鼠標。這些可以由用戶自己,或者第三方插件開發者進行功能擴展的主要參考依據。
思維變換:
- prefix 前綴(默認 Ctrl+b,也可自定義):相當于 Shift,Ctrl,Alt 之類的功能鍵。使用命令前綴來取代通常的功能按鍵的好處:避免與系統、或其他 app 發生快捷鍵沖突。
- 還原窗口的操作:
原生方法:
第三方方法:## tmux attach(或簡寫為 tmux a)用于重新連接到通過關閉終端、 # 或者,之前通過 tmux detach(快捷鍵 Ctrl+b d)分離的會話,恢復其運行狀態。 tmux a # SSH 斷連后恢復工作環境7 恢復斷開會話? tmux a -t session_name # 同時處理多個任務8 ?多會話管理?
tmux-plugins / tmux-resurrect ,可以將當前 tmux 的所有場景進行備份和還原。prefix +Ctrl+s / prefix +Ctrl+r 備份/還原。這個插件可以持久化直到窗格所使用的歷史命令,雖然 tmux 官方也有相關的命令,只不過有些簡陋而已。
注意區別:
1. tmux a :直接進入上一次 tmux退出時自動默認保存的場景。
2. tmux a -t session_name :指定進入的 sesssion。
3. tmux-resurrect :Ctrl+r 恢復上一次用戶手動保存時的場景。
4. tmux :創建新會話 session,并進入該session默認的 0號窗口。 -
tmux-plugins 有許多的插件,使用 TPM 的好處是不需要一個一個地下載和配置。只要在 ~/.tmux.conf 中設置好了;然后,在 tmux 終端里操作prefix --> Shift+i(大寫 I),下載和安裝就可以自動完成了(安裝過程需要連接到 github)。
-
復制與粘貼的思維:tmux 自有剪切板,只能在 tmux 的各個會話,窗口,窗格之間進行使用。如果 tmux 要與宿主機之間進行雙向的復制與粘貼,還需要自行解決。
在 tmux 終端里,prefix+Ctrl+c 指將 tmux 剪切板的內容拷貝到系統剪切板。在宿主機里,還需要 Ctrl+v才能完成粘貼的操作。
prefix +Ctrl+v 指將系統剪切板的內容,拷貝到 tmux 當前有效的光標處(如果當前在 tmux 中的光標不在有效位置,在粘貼不成功)。 -
鼠標復制操作:鼠標選擇文本,放開左鍵后,直接就已經完成的文本的復制了。點擊滾輪鍵,即粘貼。
## 鼠標操作。tmux 官方本身就具有的功能,但是,需要用戶自己開啟了,才能使用。 # 啟用鼠標和 vi 鍵位(可選) set -g mouse on set-window-option -g mode-keys vi
-
手動復制粘貼操作:Tmux 的兩種鍵位操作模式為 ?vi 模式? 和 ?emacs 模式?,用于控制文本編輯、復制粘貼等操作。
復制文本 Ctrl+b ---松開,再按---> [(開口向右)--- vi 模式下按空格 ---> 然后,開始用方向鍵選擇需要復制的文本 ---> 敲 enter 結束復制。
粘貼:在有效光標處按 Ctrl+b ---松開,再按---> ](開口向左)。
?vi 模式需要用戶自己在 .tmux.conf 里開啟。默認是? ?emacs 模式。## ~/.tmux.conf 中設置默認模式。全部注釋掉,就是默認的 emasc 模式。 # 設為 vi 模式 set-window-option -g mode-keys vi # 設為 emacs 模式 set-window-option -g mode-keys emacs
?
需要關注:
- 可選:tmux-continuum 自動備份、恢復插件,可能是版本不兼容,OS 定時服務,或是其他問題,沒有安裝成功。無關緊要的,因為可以使用手動的方式進行動備份、恢復。
-
?tmux-yank 插件:Tmux plugin for copying to system clipboard. Works on OSX, Linux and Cygwin. 好像只是單向的。最后是直接采用 sh 腳本來實現。
-
雖然可以自定義 prefix,將 Ctrl+b 改為其他的。但是,好像沒有必要吧?
如果想追求快捷,就使用別名好了。只需要創建幾個別名就可以了,其他的都可以使用鼠標來操作。 -
tmux 這個工具火,所以有許多人為它提供了第三方插件擴展。但未必就是自己所需要的。工具而已,在漂亮它還是工具。
理解 Session、Window、Pane 關鍵區別
概念 | 作用 | 類比 |
---|---|---|
會話(Session) | 管理多個窗口的集合 | 瀏覽器“用戶配置文件” |
窗口(Window) | 同一會話中的不同任務標簽頁 | 瀏覽器“標簽頁” |
窗格(Pane) | 同一窗口中的分屏終端 | 終端“分屏” |
掌握這三者的關系,可以高效利用 Tmux 管理復雜的終端工作流!
備注:
說實話,英文有幾十萬、上百萬的詞匯,中文字少,翻譯過來的概念就變成了4不象,難以理解。“會話”這個概念就是一個怪胎,不容易理解。
說白了,Session、Window、Pane 的本質,就是一種窗口的管理模式、或方式而已。
- 為什么需要會話?本質上,相當于軟件開發工具 IDE 中的項目管理,暫且叫會話項目吧?它的好處就是在管理多個項目時,可以讓其中一個項目處在激活狀態,其他項目處在非激活狀態。在同一個會話中的各個窗口都是有一定關系的,或者人為地認為它們有關系。
特點:每一個會話項目都是獨立的,關閉或打開不會影響其他的會話項目,就像在 IDE 中的項目管理那樣。每個項目,每個會話,都是一個獨立的被管理對象。- 為什么需要窗口?就像在同一個項目中,可以有多個源文件,每打開一個源文件,這個源文件就獨占了當前的窗口。也可以通過標簽圖標來切換不同的源文件顯示到當前的窗口。
- 為什么需要窗格?在打開一個源文件之后,可能還需要打開其他的子窗口,如變量顯示窗口,信息輸出端口等等。窗格的效果也是如此。
與 IDE 不同,Session、Window、Pane 的具體用途,完全是由用戶自己來定義。
從窗口管理的角度來說,Session、Window、Pane 就是一種窗口的組織和管理方式而已。從使用的角度來說,任何一個窗口或窗格的用途,可以是一樣的。只不過將窗格定義為完全一樣的用途,有時是沒有什么意義的?
tmux 有一種模式,可以讓 N個窗口實現完全一樣的操作(需要開啟),好處是所有的終端端口,分別連接到不同的服務器,在一個窗格里執行 apt update,那么,所有窗格都在執行相同的命令。
- 會話?相同與 VSCode 中的不同文件夾,每個文件夾最好就是被解釋、被作為是一個獨立的項目。
- 窗口?同欄瀏覽。在同一個標簽菜單欄中進行瀏覽。通過在 tmux 的底部標簽菜單,可以同時瀏覽到不同的窗口名稱標簽。每個窗口,相當于在 IDE 中的不同源文件標簽菜單。
類似于 firefox 瀏覽器中的網頁標簽,每一個標簽對應于一個完整的網頁,只不過 firefox網頁標簽默認在頂部,而 tmux 窗口標簽默認在底部。- 窗格?同窗瀏覽。一個窗口被分割成幾個子窗口。比如:docker build ,docker run ,docker log 等等,分別單獨占用一個窗口;這樣做的好處:與通常用途的終端窗口來比較吧,普通終端運行完了docker build ,docker run ,docker log之后,要想再次進行 docker build ,那么,就要按3次?向上箭頭,或者需要輸入命令,太麻煩了;打開多個終端,或多個標簽,相比之下也麻煩。如果在輸入了一堆命令之后,再想回到之前輸入過的某個命令,就更麻煩了。多窗口終端解決了這個痛點。
其他說明
- 使用設置到 ~/.bashrc 中的自定義別名,高效輸入命令。當然,最好采用專門的別名文件。
## ~/.bashrc ## 加載目錄下所有別名文件 for file in ~/aaa-my-all/my-alias/*; doif [ -f "$file" ]; then. "$file"fi done
- 其他更多的功能,在一般使用場景里,應該不需要吧?
- 其他命令格式,以后再補充。反正網絡上很容易就找到;
在不同窗格中的標識問題
? Easy Bash Prompt Generator??
用途:手動自定義 tmux 各個窗格的不同提示符
簡單用途沒有必要使用 如?Starship 工具吧?
## ~/.bashrc## 手動設置。其他工具設置,由于版本等問題,安裝配置,麻煩?
custom_terminal?_prompt() {# "$1" 這里使用自定義內容local container_name="$1"# echo "custom_shell_prompt"export PS1="\[\e[33m\]"$1"\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n \$ " # 可替換為下面“可選設置”中的某條語句
}
alias ctp='custom_terminal?_prompt'## 注意,上面的函數,到此結束。不要復制下面的代碼。
##===========================
## 可選設置
# 色號178(比172稍亮)
export PS1="\[\e[38;5;178;1m\]$1\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n \$ "
# 色號172
export PS1="\[\e[38;5;172;1m\]$1\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n>\$ "
# 色號166(更飽和的橙)
export PS1="\[\e[38;5;166;1m\]$1\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n \$ "
用法:
# 在終端里輸入
ctp 這里使用自定義內容 ctp dev
ctp log
??
將當前 tmux 所有的會話、窗口、窗格等等進行備份和恢復:還是使用插件方便
安裝插件 tmux-plugins /tpm :Tmux Plugin Manager
?
GitHub - tmux-plugins/tmux-resurrect: Persists tmux environment across system restarts.???
1. 下載到指定的目錄下
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
2. Reload TMUX environment so TPM is sourced: 刷新環境變量,類似于 source ~/.bashrc
# type this in terminal if tmux is already running
tmux source ~/.tmux.conf
3. Installing plugins? 安裝插件
上面提到的下載插件,只是下載了相當于是綠色軟件而已。
- 已經相當于是綠色軟件了,為什么還需要安裝:因為該 app 的成功運行,還需要創建有關的文件夾、文件,以及環境變量設置等等,
- Add new plugin to
~/.tmux.conf
withset -g @plugin '...'
- Press
prefix
+ I (capital i, as in Install) to fetch the plugin. (此步驟,需要在 tmux 終端里運行)
You're good to go! The plugin was cloned to ~/.tmux/plugins/
dir and sourced.
4. 在?.tmux.conf 的末尾,需要加入
# 官方:Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
與宿主機之間的 復制、粘貼 功能:自己搞一個更方便。
## 例子## ~/.tmux.conf
# V0.21
## # type this in terminal if tmux is already running
# tmux source ~/.tmux.conf# 啟用鼠標和 vi 鍵位(可選)
set -g mouse on
set-window-option -g mode-keys vi## ubuntu 只需要安裝 sudo apt install xsel
## 雖然也可以使用 wl-copy ,但需要安裝,沒有必要安裝那么多不同的剪切板。除非 xsel 不能用了?
# 綁定 Ctrl+B Ctrl+c 復制到系統剪貼板
bind C-c run-shell "\if tmux show-buffer > /dev/null 2>&1; then \if [ \"$XDG_SESSION_TYPE\" = wayland ] && command -v wl-copy >/dev/null; then \tmux save-buffer - | wl-copy; \else \tmux save-buffer - | xsel -i -b; \fi; \else \tmux display-message 'No content in tmux buffer!'; \fi"# 可選:綁定 Ctrl+B Ctrl+v 從剪貼板粘貼(反向操作)
bind C-v run-shell "\tmux set-buffer \"$(if [ \"$XDG_SESSION_TYPE\" = wayland ] && command -v wl-paste >/dev/null; then \wl-paste; \else \xsel -o -b; \fi)\"; \tmux paste-buffer"#### 啟用插件 TPM
# ------------------------
## 啟用插件管理器
set -g @plugin 'tmux-plugins/tpm'
# 添加自動備份插件:確保 tmux-resurrect 在 tmux-continuum 之前加載:
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
## 啟用自動恢復
## set -g @continuum-boot 'on' # 設置了,不成功 https://github.com/tmux-plugins/tmux-continuum/blob/master/docs/automatic_start.md
set -g @continuum-restore 'on'## 修改備份路徑?
# set -g @resurrect-dir '~/.tmux_backups'#### 最后:運行 TPM
run '~/.tmux/plugins/tpm/tpm'
resurrect 插件備份與恢復
路徑搜索優先順序:
這個目錄需要用戶自己創建,優先級高。當這個目錄存在時,就不會再使用?~/.local/share/tmux/resurrect/ ,這個 linux app 的慣用伎倆。
~/.tmux/resurrect/
默認安裝時,使用這個目錄,優先級低。
~/.local/share/tmux/resurrect/
如果需要備份,就打包?resurrect 這個目錄好了。
last 這個鏈接文件,總是指向最新生成的 .txt 文件。修改這個鏈接文件的指向,可以恢復到指定的備份文件。一般沒有必要吧?
一般 linux 發行版默認已經安裝了 tmux。
可以
sudo apt install tmux
?如果必須的功能沒有的話,也可以編譯安裝最新版的。
$ sudo make uninstall
[sudo] password for test: ( cd '/usr/local/bin' && rm -f tmux ) # 手動刪除
## 安裝 失敗git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make
# ---------------sudo make install
make[1]: Entering directory '/home/test/aa/aa/tmux'/usr/bin/mkdir -p '/usr/local/bin'/usr/bin/install -c tmux '/usr/local/bin'
make install-exec-hook
make[2]: Entering directory '/home/test/aa/aa/tmux'
if test xmdoc = xmdoc; then \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \>./tmux.1.mdoc; \
else \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \gawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /usr/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \/usr/local/share/man/man1/tmux.1
make[2]: Leaving directory '/home/test/aa/aa/tmux'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/test/aa/aa/tmux'
tmux-3.5a
## 安裝 ok# tmux-3.5a
#-----------------------sudo make install
[sudo] password for test:
make[1]: Entering directory '/home/test/Downloads/aazzz/tmux-3.5a'/usr/bin/mkdir -p '/usr/local/bin'/usr/bin/install -c tmux '/usr/local/bin'
make install-exec-hook
make[2]: Entering directory '/home/test/Downloads/aazzz/tmux-3.5a'
if test xmdoc = xmdoc; then \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \>./tmux.1.mdoc; \
else \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \gawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /usr/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \/usr/local/share/man/man1/tmux.1
make[2]: Leaving directory '/home/test/Downloads/aazzz/tmux-3.5a'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/test/Downloads/aazzz/tmux-3.5a'