摘要:關(guān)于我的博客掘金專欄路易斯專欄原文鏈接使用手冊(cè)鏈接程序員使用手冊(cè)極客頭條全文共字,閱讀需分鐘。使用快捷鍵組合,三次按鍵就可以斷開當(dāng)前會(huì)話。新增面板中,使用最多的功能之一就是新增一個(gè)面板。
本文首發(fā)于CSDN網(wǎng)站,下面的版本又經(jīng)過進(jìn)一步的修訂。
關(guān)于我的博客:louis blog
掘金專欄:路易斯專欄
原文鏈接:Tmux使用手冊(cè)
CSDN鏈接:程序員Tmux使用手冊(cè) - 極客頭條
全文共12k字,閱讀需20分鐘。
導(dǎo)讀我一直信奉簡(jiǎn)潔至上的原則,桌面窗口的數(shù)量越少,我的心情就越愉悅,開發(fā)的效率也就越高。反之,雜亂的桌面,暴漲的Chrome tab數(shù)量,或是無數(shù)的終端窗口,它們會(huì)逐步侵占我的注意力,分散我的思維,最終令我難以專注。因此桌面上我很少放文件,使用Chrome時(shí)常點(diǎn) OneTab 回收標(biāo)簽頁(yè),切進(jìn)終端時(shí)使用tmux管理窗口。
我很懶,懶到期望開機(jī)后不需要任何操作,本地的十幾種web開發(fā)服務(wù)器就自動(dòng)運(yùn)行,當(dāng)然我不希望連續(xù)彈出十幾個(gè)窗口或是tab,我需要的是靜默無感知的啟用服務(wù),然后還能快速地進(jìn)入到現(xiàn)場(chǎng)進(jìn)行操作,web服務(wù)器運(yùn)行時(shí)不占據(jù)終端窗口,關(guān)閉iTem2后操作現(xiàn)場(chǎng)不會(huì)被銷毀。我的這些期望,tmux都能幫我實(shí)現(xiàn),實(shí)際上,除了這些,tmux還能做得更多更好。
到目前為止,tmux幫助我兩年有余,它帶給我許多驚喜。獨(dú)樂不如眾樂,愿你也能一同享受tmux帶來的快樂。
簡(jiǎn)介tmux是一款優(yōu)秀的終端復(fù)用軟件,它比Screen更加強(qiáng)大,至于如何強(qiáng)大,網(wǎng)上有大量的文章討論了這點(diǎn),本文不再重復(fù)。tmux之所以受人們喜愛,主要得益于以下三處功能:
絲滑分屏(split),雖然iTem2也提供了橫向和豎向分屏功能,但這種分屏功能非常拙劣,完全等同于屏幕新開一個(gè)窗口,新開的pane不會(huì)自動(dòng)進(jìn)入到當(dāng)前目錄,也沒有記住當(dāng)前登錄狀態(tài)。這意味著如果我ssh進(jìn)入到遠(yuǎn)程服務(wù)器時(shí),iTem2新開的pane中,我依然要重新走一遍ssh登錄的老路(omg)。tmux就不會(huì)這樣,tmux窗口中,新開的pane,默認(rèn)進(jìn)入到之前的路徑,如果是ssh連接,登錄狀態(tài)也依舊保持著,如此一來,我就可以隨意的增刪pane,這種靈活性,好處不言而喻。
保護(hù)現(xiàn)場(chǎng)(attach),即使命令行的工作只進(jìn)行到一半,關(guān)閉終端后還可以重新進(jìn)入到操作現(xiàn)場(chǎng),繼續(xù)工作。對(duì)于ssh遠(yuǎn)程連接而言,即使網(wǎng)絡(luò)不穩(wěn)定也沒有關(guān)系,掉線后重新連接,可以直奔現(xiàn)場(chǎng),之前運(yùn)行中的任務(wù),依舊在跑,就好像從來沒有離開過一樣;特別是在遠(yuǎn)程服務(wù)器上運(yùn)行耗時(shí)的任務(wù),tmux可以幫你一直保持住會(huì)話。如此一來,你就可以隨時(shí)隨地放心地進(jìn)行移動(dòng)辦公,只要你附近的計(jì)算機(jī)裝有tmux(沒有你也可以花幾分鐘裝一個(gè)),你就能繼續(xù)剛才的工作。
會(huì)話共享(適用于結(jié)對(duì)編程或遠(yuǎn)程教學(xué)),將 tmux 會(huì)話的地址分享給他人,這樣他們就可以通過 SSH 接入該會(huì)話。如果你要給同事演示遠(yuǎn)程服務(wù)器的操作,他不必直勾勾地盯著你的屏幕,借助tmux,他完全可以進(jìn)入到你的會(huì)話,然后靜靜地看著他桌面上你風(fēng)騷的鍵盤走位,只要他愿意,甚至還可以錄個(gè)屏。
以上,只是主要功能,更多功能還在后頭,接下來我將詳細(xì)地介紹tmux的使用技巧。
安裝首先安裝之。
在Mac中安裝:
# 先安裝Homebrew,有則跳過 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # 安裝tmux brew install tmux
在Linux中安裝:
sudo apt-get install tmux基本概念
開始之前,我們先了解下基本概念:
tmux采用C/S模型構(gòu)建,輸入tmux命令就相當(dāng)于開啟了一個(gè)服務(wù)器,此時(shí)默認(rèn)將新建一個(gè)會(huì)話,然后會(huì)話中默認(rèn)新建一個(gè)窗口,窗口中默認(rèn)新建一個(gè)面板。會(huì)話、窗口、面板之間的聯(lián)系如下:
一個(gè)tmux session(會(huì)話)可以包含多個(gè)window(窗口),窗口默認(rèn)充滿會(huì)話界面,因此這些窗口中可以運(yùn)行相關(guān)性不大的任務(wù)。
一個(gè)window又可以包含多個(gè)pane(面板),窗口下的面板,都處于同一界面下,這些面板適合運(yùn)行相關(guān)性高的任務(wù),以便同時(shí)觀察到它們的運(yùn)行情況。
會(huì)話 新建會(huì)話新建一個(gè)tmux session非常簡(jiǎn)單,語(yǔ)法為tmux new -s session-name,也可以簡(jiǎn)寫為tmux,為了方便管理,建議指定會(huì)話名稱,如下。
tmux # 新建一個(gè)無名稱的會(huì)話 tmux new -s demo # 新建一個(gè)名稱為demo的會(huì)話斷開當(dāng)前會(huì)話
會(huì)話中操作了一段時(shí)間,我希望斷開會(huì)話同時(shí)下次還能接著用,怎么做?此時(shí)可以使用detach命令。
tmux detach # 斷開當(dāng)前會(huì)話,會(huì)話在后臺(tái)運(yùn)行
也許你覺得這個(gè)太麻煩了,是的,tmux的會(huì)話中,我們已經(jīng)可以使用tmux快捷鍵了。使用快捷鍵組合Ctrl+b + d,三次按鍵就可以斷開當(dāng)前會(huì)話。
進(jìn)入之前的會(huì)話斷開會(huì)話后,想要接著上次留下的現(xiàn)場(chǎng)繼續(xù)工作,就要使用到tmux的attach命令了,語(yǔ)法為tmux attach-session -t session-name,可簡(jiǎn)寫為tmux a -t session-name 或 tmux a。通常我們使用如下兩種方式之一即可:
tmux a # 默認(rèn)進(jìn)入第一個(gè)會(huì)話 tmux a -t demo # 進(jìn)入到名稱為demo的會(huì)話關(guān)閉會(huì)話
會(huì)話的使命完成后,一定是要關(guān)閉的。我們可以使用tmux的kill命令,kill命令有kill-pane、kill-server、kill-session 和 kill-window共四種,其中kill-session的語(yǔ)法為tmux kill-session -t session-name。如下:
tmux kill-session -t demo # 關(guān)閉demo會(huì)話 tmux kill-server # 關(guān)閉服務(wù)器,所有的會(huì)話都將關(guān)閉查看所有的會(huì)話
管理會(huì)話的第一步就是要查看所有的會(huì)話,我們可以使用如下命令:
tmux list-session # 查看所有會(huì)話 tmux ls # 查看所有會(huì)話,提倡使用簡(jiǎn)寫形式
如果剛好處于會(huì)話中怎么辦?別擔(dān)心,我們可以使用對(duì)應(yīng)的tmux快捷鍵Ctrl+b + s,此時(shí)tmux將打開一個(gè)會(huì)話列表,按上下鍵(????)或者鼠標(biāo)滾輪,可選中目標(biāo)會(huì)話,按左右鍵(???)可收起或展開會(huì)話的窗口,選中目標(biāo)會(huì)話或窗口后,按回車鍵即可完成切換。
Tmux快捷指令關(guān)于快捷指令,首先要認(rèn)識(shí)到的是:tmux的所有指令,都包含同一個(gè)前綴,默認(rèn)為Ctrl+b,輸入完前綴過后,控制臺(tái)激活,命令按鍵才能生效。前面tmux會(huì)話相關(guān)的操作中,我們共用到了兩個(gè)快捷鍵Ctrl+b + d、Ctrl+b + s,但這僅僅是冰山一角,欲窺tmux龐大的快捷鍵體系,請(qǐng)看下表。
表一:系統(tǒng)指令。
前綴 | 指令 | 描述 |
---|---|---|
Ctrl+b | ? | 顯示快捷鍵幫助文檔 |
Ctrl+b | d | 斷開當(dāng)前會(huì)話 |
Ctrl+b | D | 選擇要斷開的會(huì)話 |
Ctrl+b | Ctrl+z | 掛起當(dāng)前會(huì)話 |
Ctrl+b | r | 強(qiáng)制重載當(dāng)前會(huì)話 |
Ctrl+b | s | 顯示會(huì)話列表用于選擇并切換 |
Ctrl+b | : | 進(jìn)入命令行模式,此時(shí)可直接輸入ls等命令 |
Ctrl+b | [ | 進(jìn)入復(fù)制模式,按q退出 |
Ctrl+b | ] | 粘貼復(fù)制模式中復(fù)制的文本 |
Ctrl+b | ~ | 列出提示信息緩存 |
表二:窗口(window)指令。
前綴 | 指令 | 描述 |
---|---|---|
Ctrl+b | c | 新建窗口 |
Ctrl+b | & | 關(guān)閉當(dāng)前窗口(關(guān)閉前需輸入y or n確認(rèn)) |
Ctrl+b | 0~9 | 切換到指定窗口 |
Ctrl+b | p | 切換到上一窗口 |
Ctrl+b | n | 切換到下一窗口 |
Ctrl+b | w | 打開窗口列表,用于且切換窗口 |
Ctrl+b | , | 重命名當(dāng)前窗口 |
Ctrl+b | . | 修改當(dāng)前窗口編號(hào)(適用于窗口重新排序) |
Ctrl+b | f | 快速定位到窗口(輸入關(guān)鍵字匹配窗口名稱) |
表三:面板(pane)指令。
前綴 | 指令 | 描述 |
---|---|---|
Ctrl+b | " | 當(dāng)前面板上下一分為二,下側(cè)新建面板 |
Ctrl+b | % | 當(dāng)前面板左右一分為二,右側(cè)新建面板 |
Ctrl+b | x | 關(guān)閉當(dāng)前面板(關(guān)閉前需輸入y or n確認(rèn)) |
Ctrl+b | z | 最大化當(dāng)前面板,再重復(fù)一次按鍵后恢復(fù)正常(v1.8版本新增) |
Ctrl+b | ! | 將當(dāng)前面板移動(dòng)到新的窗口打開(原窗口中存在兩個(gè)及以上面板有效) |
Ctrl+b | ; | 切換到最后一次使用的面板 |
Ctrl+b | q | 顯示面板編號(hào),在編號(hào)消失前輸入對(duì)應(yīng)的數(shù)字可切換到相應(yīng)的面板 |
Ctrl+b | { | 向前置換當(dāng)前面板 |
Ctrl+b | } | 向后置換當(dāng)前面板 |
Ctrl+b | Ctrl+o | 順時(shí)針旋轉(zhuǎn)當(dāng)前窗口中的所有面板 |
Ctrl+b | 方向鍵 | 移動(dòng)光標(biāo)切換面板 |
Ctrl+b | o | 選擇下一面板 |
Ctrl+b | 空格鍵 | 在自帶的面板布局中循環(huán)切換 |
Ctrl+b | Alt+方向鍵 | 以5個(gè)單元格為單位調(diào)整當(dāng)前面板邊緣 |
Ctrl+b | Ctrl+方向鍵 | 以1個(gè)單元格為單位調(diào)整當(dāng)前面板邊緣(Mac下被系統(tǒng)快捷鍵覆蓋) |
Ctrl+b | t | 顯示時(shí)鐘 |
tmux的絲滑分屏功能正是得益于以上系統(tǒng)、窗口、面板的快捷指令,只要你愿意,你就可以解除任意的快捷指令,然后綁上你喜歡的指令,當(dāng)然這就涉及到它的可配置性了,請(qǐng)繼續(xù)往下讀。
靈活的配置性除了快捷指令外,tmux還提供了類似vim的配置性功能??膳渲眯允擒浖囊豁?xiàng)進(jìn)階級(jí)功能,只有具備了可配置性,軟件才有了鮮活的個(gè)性,用戶才能體會(huì)到操作的快感。
修改指令前綴相信只要你用過幾次tmux,就會(huì)發(fā)現(xiàn)Ctrl+b指令前綴,著實(shí)不太方便。這兩個(gè)鍵相距太遠(yuǎn),按鍵成本太高了。因此我們首先需要將它更換為距離更近的Ctrl+a組合鍵,或者不常用的 ` 鍵(當(dāng)然其他鍵也是可以的)。
tmux的用戶級(jí)配置文件為~/.tmux.conf(沒有的話就創(chuàng)建一個(gè)),修改快捷指令,只需要增加如下三行即可。
set -g prefix C-a # unbind C-b # C-b即Ctrl+b鍵,unbind意味著解除綁定 bind C-a send-prefix # 綁定Ctrl+a為新的指令前綴 # 從tmux v1.6版起,支持設(shè)置第二個(gè)指令前綴 set-option -g prefix2 ` # 設(shè)置一個(gè)不常用的`鍵作為指令前綴,按鍵更快些
修改的~/.tmux.conf配置文件有如下兩種方式可以令其生效:
restart tmux。
在tmux窗口中,先按下Ctrl+b指令前綴,然后按下系統(tǒng)指令:,進(jìn)入到命令模式后輸入source-file ~/.tmux.conf,回車后生效。
既然快捷指令如此方便,更為優(yōu)雅的做法是新增一個(gè)加載配置文件的快捷指令 ,這樣就可以隨時(shí)隨地load新的配置了,如下所示。
# 綁定快捷鍵為r bind r source-file ~/.tmux.conf ; display-message "Config reloaded.."
請(qǐng)?zhí)貏e注意,在已經(jīng)創(chuàng)建的窗口中,即使加載了新的配置,舊的配置依然有效(只要你新加的功能沒有覆蓋舊的配置,因此如果你第一次綁定快捷指令為x鍵,然后又改為綁定y鍵,那么x和y都將有效),新建會(huì)話不受此影響,將直接采用新的配置。
既然我們已經(jīng)邁出配置化的第一步,那么接下來我們可以做得更多。
新增面板tmux中,使用最多的功能之一就是新增一個(gè)面板。水平方向新增面板的指令是 prefix + " ,垂直方向是 prefix + %," 和 %需要兩個(gè)鍵同時(shí)按下才能完成,加上指令前綴至少需要3~4次按鍵才能組成一個(gè)完整的指令,同時(shí)這個(gè)兩個(gè)鍵也不夠醒目和方便,因此我們可以綁定兩個(gè)更常用的指令 -、|,如下所示:
unbind """ bind - splitw -v -c "#{pane_current_path}" # 垂直方向新增面板,默認(rèn)進(jìn)入當(dāng)前目錄 unbind % bind | splitw -h -c "#{pane_current_path}" # 水平方向新增面板,默認(rèn)進(jìn)入當(dāng)前目錄開啟鼠標(biāo)支持
默認(rèn)情況下,tmux的多窗口之間的切換以及面板大小調(diào)整,需要輸入指令才能完成,這一過程,涉及到的指令較多,而且操作麻煩,特別是面板大小調(diào)整,指令難以一步到位,這個(gè)時(shí)候開啟鼠標(biāo)支持就完美了。
對(duì)于tmux v2.1(2015.10.28)之前的版本,需加入如下配置:
setw -g mode-mouse on # 支持鼠標(biāo)選取文本等 setw -g mouse-resize-pane on # 支持鼠標(biāo)拖動(dòng)調(diào)整面板的大小(通過拖動(dòng)面板間的分割線) setw -g mouse-select-pane on # 支持鼠標(biāo)選中并切換面板 setw -g mouse-select-window on # 支持鼠標(biāo)選中并切換窗口(通過點(diǎn)擊狀態(tài)欄窗口名稱)
有的地方可能會(huì)出現(xiàn)set-window-option的寫法,setw就是它的別名。
對(duì)于tmux v2.1及以上的版本,僅需加入如下配置:
set-option -g mouse on # 等同于以上4個(gè)指令的效果
需要注意的是,開啟鼠標(biāo)支持后,iTem2默認(rèn)的鼠標(biāo)選中即復(fù)制功能需要同時(shí)按下 Alt 鍵,才會(huì)生效。
快速面板切換鼠標(biāo)支持確實(shí)能帶來很大的便捷性,特別是對(duì)于習(xí)慣了鼠標(biāo)操作的tmux新手,但對(duì)于鍵盤愛好者而言,這不是什么好消息,對(duì)他們而言,雙手不離鍵盤是基本素質(zhì)。
雖然指令前綴加方向鍵可以切換面板,但方向鍵太遠(yuǎn),不夠快,不夠Geek。沒關(guān)系,我們可以將面板切換升級(jí)為熟悉的h、j、k、l鍵位。
# 綁定hjkl鍵為面板切換的上下左右鍵 bind -r k select-pane -U # 綁定k為↑ bind -r j select-pane -D # 綁定j為↓ bind -r h select-pane -L # 綁定h為← bind -r l select-pane -R # 綁定l為→
-r表示可重復(fù)按鍵,大概500ms之內(nèi),重復(fù)的h、j、k、l按鍵都將有效,完美支持了快速切換的Geek需求。
除了上下左右外, 還有幾個(gè)快捷指令可以設(shè)置。
bind -r e lastp # 選擇最后一個(gè)面板 bind -r ^e last # 選擇最后一個(gè)窗口 bind -r ^u swapp -U # 與前一個(gè)面板交換位置 bind -r ^d swapp -D # 與后一個(gè)面板交換位置面板大小調(diào)整
習(xí)慣了全鍵盤操作后,命令的便捷性不言而喻。既然面板切換的指令都可以升級(jí),面板大小調(diào)整的指令自然也不能落后。如下配置就可以升級(jí)你的操作:
# 綁定Ctrl+hjkl鍵為面板上下左右調(diào)整邊緣的快捷指令 bind -r ^k resizep -U 10 # 綁定Ctrl+k為往↑調(diào)整面板邊緣10個(gè)單元格 bind -r ^j resizep -D 10 # 綁定Ctrl+j為往↓調(diào)整面板邊緣10個(gè)單元格 bind -r ^h resizep -L 10 # 綁定Ctrl+h為往←調(diào)整面板邊緣10個(gè)單元格 bind -r ^l resizep -R 10 # 綁定Ctrl+l為往→調(diào)整面板邊緣10個(gè)單元格
以上,resizep即resize-pane的別名。
面板最大化當(dāng)窗口中面板的數(shù)量逐漸增多時(shí),每個(gè)面板的空間就會(huì)逐漸減少。為了保證有足夠的空間顯示內(nèi)容,tmux從v1.8版本起,提供了面板的最大化功能,輸入tmux-prefix+z,就可以最大化當(dāng)前面板至窗口大小,只要再重復(fù)輸入一次,便恢復(fù)正常。那么tmux v1.8以下的版本,怎么辦呢?別急,有大神提供了如下的解決方案。
首先編寫一個(gè)zoom腳本,該腳本通過新建一個(gè)窗口,交換當(dāng)前面板與新的窗口默認(rèn)面板位置,來模擬最大的功能;通過重復(fù)一次按鍵,還原面板位置,并關(guān)閉新建的窗口,來模擬還原功能,如下所示:
#!/bin/bash -f currentwindow=`tmux list-window | tr " " " " | sed -n -e "/(active)/s/^[^:]*: *([^ ]*) .*/1/gp"`; currentpane=`tmux list-panes | sed -n -e "/(active)/s/^([^:]*):.*/1/gp"`; panecount=`tmux list-panes | wc | sed -e "s/^ *//g" -e "s/ .*$//g"`; inzoom=`echo $currentwindow | sed -n -e "/^zoom/p"`; if [ $panecount -ne 1 ]; then inzoom=""; fi if [ $inzoom ]; then lastpane=`echo $currentwindow | rev | cut -f 1 -d "@" | rev`; lastwindow=`echo $currentwindow | cut -f 2- -d "@" | rev | cut -f 2- -d "@" | rev`; tmux select-window -t $lastwindow; tmux select-pane -t $lastpane; tmux swap-pane -s $currentwindow; tmux kill-window -t $currentwindow; else newwindowname=zoom@$currentwindow@$currentpane; tmux new-window -d -n $newwindowname; tmux swap-pane -s $newwindowname; tmux select-window -t $newwindowname; fi
不妨將該腳本存放在~/.tmux目錄中(沒有則新建目錄),接下來只需要綁定一個(gè)快捷指令就行,如下。
unbind z bind z run ". ~/.tmux/zoom"窗口變?yōu)槊姘?/b>
通過上面的zoom腳本,面板可以輕松地最大化為一個(gè)新的窗口。那么反過來,窗口是不是可以最小化為一個(gè)面板呢?
試想這樣一個(gè)場(chǎng)景:當(dāng)你打開多個(gè)窗口后,然后想將其中幾個(gè)窗口合并到當(dāng)前窗口中,以便對(duì)比觀察輸出。
實(shí)際上,你的要求就是將其它窗口變成面板,然后合并到當(dāng)前窗口中。對(duì)于這種操作,我們可以在當(dāng)前窗口,按下prefix + :,打開命令行,然后輸入如下命令:
join-pane -s window01 # 合并名稱為window01的窗口的默認(rèn)(第一個(gè))面板到當(dāng)前窗口中 join-pane -s window01.1 # .1顯式指定了第一個(gè)面板,.2就是第二個(gè)面板(我本地將面板編號(hào)起始值設(shè)置為1,默認(rèn)是0)
每次執(zhí)行join-pane命令都會(huì)合并一個(gè)面板,并且指定的窗口會(huì)減少一個(gè)面板,直到面板數(shù)量為0,窗口關(guān)閉。
除了在當(dāng)前會(huì)話中操作外,join-pane命令甚至可以從其它指定會(huì)話中合并面板,格式為join-pane -s [session_name]:[window].[pane],如join-pane -s 2:1.1 即合并第二個(gè)會(huì)話的第一個(gè)窗口的第一個(gè)面板到當(dāng)前窗口,當(dāng)目標(biāo)會(huì)話的窗口和面板數(shù)量為0時(shí),會(huì)話便會(huì)關(guān)閉。
注:上一節(jié)中的swap-pane命令與join-pane語(yǔ)法基本一致。
其他配置bind m command-prompt "splitw -h "exec man %%"" # 綁定m鍵為在新的panel打開man # 綁定P鍵為開啟日志功能,如下,面板的輸出日志將存儲(chǔ)到桌面 bind P pipe-pane -o "cat >>~/Desktop/#W.log" ; display "Toggled logging to ~/Desktop/#W.log"恢復(fù)用戶空間
tmux會(huì)話中,Mac的部分命令如 osascript、open、pbcopy 或 pbpaste等可能會(huì)失效(失效命令未列全)。
部分bug列表如下:
applescript - Unable to run "display notification" using osascript in a tmux session
osx - "open" command doesn"t work properly inside tmux
clipboard - Can"t paste into MacVim
對(duì)此,我們可以通過安裝reattach-to-user-namespace包裝程序來解決這個(gè)問題。
brew install reattach-to-user-namespace
在~/.tmux.conf中添加配置:
set -g default-command "reattach-to-user-namespace -l $SHELL"
這樣你的交互式shell最終能夠重新連接到用戶級(jí)的命名空間。由于連接狀態(tài)能夠被子進(jìn)程繼承,故以上配置保證了所有從 shell 啟動(dòng)的命令能夠被正確地連接。
有些時(shí)候,我們可能會(huì)在不同的操作系統(tǒng)中共享配置文件,如果你的tmux版本大于1.9,我們還可以使用if-shell來判斷是否Mac系統(tǒng),然后再指定default-command。
if-shell "test "$(uname -s)" = Darwin" "set-option -g default-command "exec reattach-to-user-namespace -l $SHELL""
對(duì)于tmux v1.8及更早的版本,可以使用如下包裝后的配置:
set-option -g default-command "command -v reattach-to-user-namespace >/dev/null && exec reattach-to-user-namespace -l "$SHELL" || exec "$SHELL""
以上,$SHELL對(duì)應(yīng)于你的默認(rèn)Shell,通常是/usr/bin/bash 或 /usr/local/bin/zsh。
復(fù)制模式tmux中操作文本,自然離不開復(fù)制模式,通常使用復(fù)制模式的步驟如下:
輸入 `+[ 進(jìn)入復(fù)制模式
按下 空格鍵 開始復(fù)制,移動(dòng)光標(biāo)選擇復(fù)制區(qū)域
按下 回車鍵 復(fù)制選中文本并退出復(fù)制模式
按下 `+] 粘貼文本
查看復(fù)制模式默認(rèn)的快捷鍵風(fēng)格:
tmux show-window-options -g mode-keys # mode-keys emacs
默認(rèn)情況下,快捷鍵為emacs風(fēng)格。
為了讓復(fù)制模式更加方便,我們可以將快捷鍵設(shè)置為熟悉的vi風(fēng)格,如下:
setw -g mode-keys vi # 開啟vi風(fēng)格后,支持vi的C-d、C-u、hjkl等快捷鍵自定義復(fù)制和選擇快捷鍵
除了快捷鍵外,復(fù)制模式的啟用、選擇、復(fù)制、粘貼等按鍵也可以向vi風(fēng)格靠攏。
bind Escape copy-mode # 綁定esc鍵為進(jìn)入復(fù)制模式 bind -t vi-copy v begin-selection # 綁定v鍵為開始選擇文本 bind -t vi-copy y copy-selection # 綁定y鍵為復(fù)制選中文本 bind p pasteb # 綁定p鍵為粘貼文本(p鍵默認(rèn)用于進(jìn)入上一個(gè)窗口,不建議覆蓋)
以上,綁定 v、y兩鍵的設(shè)置只在tmux v2.4版本以下才有效,對(duì)于v2.4及以上的版本,綁定快捷鍵需要使用 -T 選項(xiàng),發(fā)送指令需要使用 -X 選項(xiàng),請(qǐng)參考如下設(shè)置:
bind -T copy-mode-vi v send-keys -X begin-selection bind -T copy-mode-vi y send-keys -X copy-selection-and-cancelBuffer緩存
tmux復(fù)制操作的內(nèi)容默認(rèn)會(huì)存進(jìn)buffer里,buffer是一個(gè)粘貼緩存區(qū),新的緩存總是位于棧頂,它的操作命令如下:
tmux list-buffers # 展示所有的 buffers tmux show-buffer [-b buffer-name] # 顯示指定的 buffer 內(nèi)容 tmux choose-buffer # 進(jìn)入 buffer 選擇頁(yè)面(支持jk上下移動(dòng)選擇,回車選中并粘貼 buffer 內(nèi)容到面板上) tmux set-buffer # 設(shè)置buffer內(nèi)容 tmux load-buffer [-b buffer-name] file-path # 從文件中加載文本到buffer緩存 tmux save-buffer [-a] [-b buffer-name] path # 保存tmux的buffer緩存到本地 tmux paste-buffer # 粘貼buffer內(nèi)容到會(huì)話中 tmux delete-buffer [-b buffer-name] # 刪除指定名稱的buffer
以上buffer操作在不指定buffer-name時(shí),默認(rèn)處理是棧頂?shù)腷uffer緩存。
在tmux會(huì)話的命令行輸入時(shí),可以省略上述tmux前綴,其中l(wèi)ist-buffers的操作如下所示:
choose-buffer的操作如下所示:
默認(rèn)情況下,buffers內(nèi)容是獨(dú)立于系統(tǒng)粘貼板的,它存在于tmux進(jìn)程中,且可以在會(huì)話間共享。
使用系統(tǒng)粘貼板存在于tmux進(jìn)程中的buffer緩存,雖然可以在會(huì)話間共享,但不能直接與系統(tǒng)粘貼板共享,不免有些遺憾。幸運(yùn)的是,現(xiàn)在我們有成熟的方案來實(shí)現(xiàn)這個(gè)功能。
在Linux上使用粘貼板
通常,Linux中可以使用xclip工具來接入系統(tǒng)粘貼板。
首先,需要安裝xclip。
sudo apt-get install xclip
然后,.tmux.conf的配置如下。
# buffer緩存復(fù)制到Linux系統(tǒng)粘貼板 bind C-c run " tmux save-buffer - | xclip -i -sel clipboard" # Linux系統(tǒng)粘貼板內(nèi)容復(fù)制到會(huì)話 bind C-v run " tmux set-buffer "$(xclip -o -sel clipboard)"; tmux paste-buffer"
按下prefix + Ctrl + c 鍵,buffer緩存的內(nèi)容將通過xlip程序復(fù)制到粘貼板,按下prefix + Ctrl + v鍵,tmux將通過xclip訪問粘貼板,然后由set-buffer命令設(shè)置給buffer緩存,最后由paste-buffer粘貼到tmux會(huì)話中。
在Mac上使用粘貼板
我們都知道,Mac自帶 pbcopy 和 pbpaste 命令,分別用于復(fù)制和粘貼,但在tmux命令中它們卻不能正常運(yùn)行。這里我將詳細(xì)介紹下原因:
Mac的粘貼板服務(wù)是在引導(dǎo)命名空間注冊(cè)的。命名空間存在層次之分,更高級(jí)別的命名空間擁有訪問低級(jí)別命名空間(如root引導(dǎo)命名空間)的權(quán)限,反之卻不行。流程創(chuàng)建的屬于Mac登錄會(huì)話的一部分,它會(huì)被自動(dòng)包含在用戶級(jí)的引導(dǎo)命名空間中,因此只有用戶級(jí)的命名空間才能訪問粘貼板服務(wù)。tmux使用守護(hù)進(jìn)程(3)庫(kù)函數(shù)創(chuàng)建其服務(wù)器進(jìn)程,在Mac OS X 10.5中,蘋果改變了守護(hù)進(jìn)程(3)的策略,將生成的過程從最初的引導(dǎo)命名空間移到了根引導(dǎo)命名空間。而根引導(dǎo)命名空間訪問權(quán)限較低,這意味著tmux服務(wù)器,和它的子進(jìn)程,一同失去了原引導(dǎo)命名空間的訪問權(quán)限(即無權(quán)限訪問粘貼板服務(wù))。
如此,我們可以使用一個(gè)小小的包裝程序來重新連接到合適的命名空間,然后執(zhí)行訪問用戶級(jí)命名空間的粘貼板服務(wù),這個(gè)包裝程序就是reattach-to-user-namespace。
那么,Mac下.tmux.conf的配置如下:
# buffer緩存復(fù)制到Mac系統(tǒng)粘貼板 bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy" # Mac系統(tǒng)粘貼板內(nèi)容復(fù)制到會(huì)話 bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - ; paste-buffer -d"
reattach-to-user-namespace 作為包裝程序來訪問Mac粘貼板,按下prefix + Ctrl + c 鍵,buffer緩存的內(nèi)容將復(fù)制到粘貼板,按下prefix + Ctrl + v鍵,粘貼板的內(nèi)容將通過 load-buffer 加載,然后由 paste-buffer 粘貼到tmux會(huì)話中。
為了在復(fù)制模式中使用Mac系統(tǒng)的粘貼板,可做如下配置:
# 綁定y鍵為復(fù)制選中文本到Mac系統(tǒng)粘貼板 bind-key -T copy-mode-vi "y" send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy" # 鼠標(biāo)拖動(dòng)選中文本,并復(fù)制到Mac系統(tǒng)粘貼板 bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "pbcopy"
完成以上配置后記得重啟tmux服務(wù)器。至此,復(fù)制模式中,按y鍵將保存選中的文本到Mac系統(tǒng)粘貼板,隨后按Command + v鍵便可粘貼。
保存Tmux會(huì)話信息時(shí)代,數(shù)據(jù)尤為重要。tmux保護(hù)現(xiàn)場(chǎng)的能力依賴于tmux進(jìn)程,如果進(jìn)程退出,則意味著會(huì)話數(shù)據(jù)的丟失,因此關(guān)機(jī)重啟后,tmux中的會(huì)話將被清空,這不是我們想要見到的。幸運(yùn)的是,目前有這樣兩款插件:Tmux Resurrect 和 Tmux Continuum,可以永久保存tmux會(huì)話(它們均適用于tmux v1.9及以上版本)。
Tmux ResurrectTmux Resurrect無須任何配置,就能夠備份tmux會(huì)話中的各種細(xì)節(jié),包括窗口、面板的順序、布局、工作目錄,運(yùn)行程序等等數(shù)據(jù)。因此它能在系統(tǒng)重啟后完全地恢復(fù)會(huì)話。由于其冪等的恢復(fù)機(jī)制,它不會(huì)試圖去恢復(fù)一個(gè)已經(jīng)存在的窗口或者面板,所以,即使你不小心多恢復(fù)了幾次會(huì)話,它也不會(huì)出現(xiàn)問題,這樣主動(dòng)恢復(fù)時(shí)我們就不必?fù)?dān)心手抖多按了一次。另外,如果你是tmuxinator用戶,我也建議你遷移到 tmux-resurrect插件上來,具體請(qǐng)參考Migrating from tmuxinator。
Tmux Resurrec安裝過程如下所示:
cd ~/.tmux mkdir plugins git clone https://github.com/tmux-plugins/tmux-resurrect.git
安裝后需在~/.tmux.conf中增加一行配置:
run-shell ~/.tmux/plugins/tmux-resurrect/resurrect.tmux
至此安裝成功,按下prefix + r重載tmux配置。
Tmux Resurrec提供如下兩個(gè)操作:
保存,快捷指令是prefix + Ctrl + s,tmux狀態(tài)欄在保存開始,保存后分別提示"Saving...","Tmux environment saved !"。
恢復(fù),快捷指令是prefix + Ctrl + r,tmux狀態(tài)欄在恢復(fù)開始,恢復(fù)后分別提示"Restoring...","Tmux restore complete !"。
保存時(shí),tmux會(huì)話的詳細(xì)信息會(huì)以文本文件的格式保存到~/.tmux/resurrect目錄,恢復(fù)時(shí)則從此處讀取,由于數(shù)據(jù)文件是明文的,因此你完全可以自由管理或者編輯這些會(huì)話狀態(tài)文件(如果備份頻繁,記得定期清除歷史備份)。
可選的配置
Tmux Resurrec本身是免配置開箱即用的,但同時(shí)也提供了如下選項(xiàng)以便修改其默認(rèn)設(shè)置。
set -g @resurrect-save "S" # 修改保存指令為S set -g @resurrect-restore "R" 修改恢復(fù)指令為R # 修改會(huì)話數(shù)據(jù)的保持路徑,此處不能使用除了$HOME, $HOSTNAME, ~之外的環(huán)境變量 set -g @resurrect-dir "/some/path"
默認(rèn)情況下只有一個(gè)保守的列表項(xiàng)(即vi vim nvim emacs man less more tail top htop irssi mutt)可以恢復(fù),對(duì)此 Restoring programs doc 解釋了怎么去恢復(fù)額外的項(xiàng)目。
進(jìn)階的備份
除了基礎(chǔ)備份外,Tmux Resurrec還提供進(jìn)階的備份功能,如下所示:
恢復(fù)vim 和 neovim 會(huì)話
恢復(fù)面板內(nèi)容
恢復(fù)shell的歷史記錄(實(shí)驗(yàn)性功能)
進(jìn)階的備份功能默認(rèn)不開啟,需要特別配置。
1)恢復(fù)vim 和 neovim 會(huì)話,需要完成如下兩步:
通過vim的vim-obsession插件保存vim/neovim會(huì)話。
cd ~/.vim/bundle git clone git://github.com/tpope/vim-obsession.git vim -u NONE -c "helptags vim-obsession/doc" -c q
在~/.tmux.conf中增加兩行配置:
set -g @resurrect-strategy-vim "session" # for vim set -g @resurrect-strategy-nvim "session" # for neovim
2)恢復(fù)面板內(nèi)容,需在~/.tmux.conf中增加一行配置:
set -g @resurrect-capture-pane-contents "on" # 開啟恢復(fù)面板內(nèi)容功能
目前使用該功能時(shí),請(qǐng)確保tmux的default-command沒有包含&& 或者||操作符,否則將導(dǎo)致bug。(查看default-command的值,請(qǐng)使用命令tmux show -g default-command。)
3)恢復(fù)shell的歷史記錄,需在~/.tmux.conf中增加一行配置:
set -g @resurrect-save-shell-history "on"
由于技術(shù)的限制,保存時(shí),只有無前臺(tái)任務(wù)運(yùn)行的面板,它的shell歷史記錄才能被保存。
Tmux Continuum可能你嫌手動(dòng)保存和恢復(fù)太過麻煩,別擔(dān)心,這不是問題。Tmux Continuum 在 Tmux Resurrec的基礎(chǔ)上更進(jìn)一步,現(xiàn)在保存和恢復(fù)全部自動(dòng)化了,如你所愿,可以無感使用tmux,不用再擔(dān)心備份問題。
Tmux Continuum安裝過程如下所示(它依賴Tmux Resurrect,請(qǐng)保證已安裝Tmux Resurrect插件):
cd ~/.tmux/plugins git clone https://github.com/tmux-plugins/tmux-continuum.git
安裝后需在~/.tmux.conf中增加一行配置:
run-shell ~/.tmux/plugins/tmux-continuum/continuum.tmux
Tmux Continuum默認(rèn)每隔15mins備份一次,我設(shè)置的是一天一次:
set -g @continuum-save-interval "1440"
關(guān)閉自動(dòng)備份,只需設(shè)置時(shí)間間隔為 0 即可:
set -g @continuum-save-interval "0"
想要在tmux啟動(dòng)時(shí)就恢復(fù)最后一次保存的會(huì)話環(huán)境,需增加如下配置:
set -g @continuum-restore "on" # 啟用自動(dòng)恢復(fù)
如果不想要啟動(dòng)時(shí)自動(dòng)恢復(fù)的功能了,直接移除上面這行就行。想要絕對(duì)確定自動(dòng)恢復(fù)不會(huì)發(fā)生,就在用戶根目錄下創(chuàng)建一個(gè)tmux_no_auto_restore空文件(創(chuàng)建命令:touch ~/tmux_no_auto_restore),該文件存在時(shí),自動(dòng)恢復(fù)將不觸發(fā)。
對(duì)于tmux高級(jí)用戶(可能就是你)而言,同時(shí)運(yùn)行多個(gè)tmux服務(wù)器也是有可能的。你可能并不希望后面啟用的幾個(gè)tmux服務(wù)器自動(dòng)恢復(fù)或者自動(dòng)保存會(huì)話。因此Tmux Continuum會(huì)優(yōu)先在第一個(gè)啟用的tmux服務(wù)器中生效,隨后啟用的tmux服務(wù)器不再享受自動(dòng)恢復(fù)或自動(dòng)保存會(huì)話的待遇。
實(shí)際上,不管Tmux Continuum功能有沒有啟用,或者多久保存一次,我們都有辦法從狀態(tài)欄知曉。Tmux Continuum提供了一個(gè)查看運(yùn)行狀態(tài)的插值#{continuum_status},它支持status-right 和 status-left兩種狀態(tài)欄設(shè)置,如下所示:
set -g status-right "Continuum status: #{continuum_status}"
tmux運(yùn)行時(shí),#{continuum_status} 將顯示保存的時(shí)間間隔(單位為分鐘),此時(shí)狀態(tài)欄會(huì)顯示:
Continuum status: 1440
如果其自動(dòng)保存功能關(guān)閉了,那么狀態(tài)欄會(huì)顯示:
Continuum status: off
借助Tmux Continuum插件,Mac重啟時(shí),我們甚至可以選擇在Terminal 或者 iTerm2 中自動(dòng)全屏啟用tmux。
為此,需在~/.tmux.conf中增加一行配置:
set -g @continuum-boot "on"
Mac下,自動(dòng)啟用tmux還支持如下選項(xiàng):
set -g @continuum-boot-options "fullscreen" ,Terminal自動(dòng)全屏,tmux命令在Terminal中執(zhí)行。
set -g @continuum-boot-options "iterm" , iTerm2 替換 Terminal 應(yīng)用,tmux命令在iTerm2中執(zhí)行。
set -g @continuum-boot-options "iterm,fullscreen",iTerm2自動(dòng)全屏,tmux命令在iTerm2中執(zhí)行。
Linux中則沒有這些選項(xiàng),它只能設(shè)置為自動(dòng)啟用tmux服務(wù)器。
Tpm以上,我們直接安裝了tmux插件。這沒有問題,可當(dāng)插件越來越多時(shí),我們就會(huì)需要統(tǒng)一的插件管理器。因此官方提供了tpm(支持tmux v1.9及以上版本)。
tpm安裝過程如下所示:
cd ~/.tmux/plugins git clone https://github.com/tmux-plugins/tpm
安裝后需在~/.tmux.conf中增加如下配置:
# 默認(rèn)需要引入的插件 set -g @plugin "tmux-plugins/tpm" set -g @plugin "tmux-plugins/tmux-sensible" # 引入其他插件的示例 # set -g @plugin "github_username/plugin_name" # 格式:github用戶名/插件名 # set -g @plugin "[email protected]/user/plugin" # 格式:git@github插件地址 # 初始化tmux插件管理器(保證這行在~/.tmux.conf的非??亢蟮奈恢? run "~/.tmux/plugins/tpm/tpm"
然后按下prefix + r重載tmux配置,使得tpm生效。
基于tpm插件管理器,安裝插件僅需如下兩步:
在~/.tmux.conf中增加新的插件,如set -g @plugin "..."。
按下prefix + I鍵下載插件,并刷新tmux環(huán)境。
更新插件,請(qǐng)按下prefix + U 鍵,選擇待更新的插件后,回車確認(rèn)并更新。
卸載插件,需如下兩步:
在~/.tmux.conf中移除插件所在行。
按下prefix + alt + u 移除插件。
會(huì)話共享 結(jié)對(duì)編程tmux多會(huì)話連接實(shí)時(shí)同步的功能,使得結(jié)對(duì)編程成為了可能,這也是開發(fā)者最喜歡的功能之一?,F(xiàn)在就差一步了,就是借助tmate把tmux會(huì)話分享出去。
tmate是tmux的管理工具,它可以輕松的創(chuàng)建tmux會(huì)話,并且自動(dòng)生成ssh鏈接。
安裝tmate
brew install tmate
使用tmate新建一個(gè)tmux會(huì)話
tmate
此時(shí)屏幕下方會(huì)顯示ssh url,如下所示:
查看tmate生成的ssh鏈接
tmate show-messages
生成的ssh url如下所示,其中一個(gè)為只讀,另一個(gè)可編輯。
共享賬號(hào)&組會(huì)話使用tmate遠(yuǎn)程共享tmux會(huì)話,受制于多方的網(wǎng)絡(luò)質(zhì)量,必然會(huì)存在些許延遲。如果共享會(huì)話的多方擁有同一個(gè)遠(yuǎn)程服務(wù)器的賬號(hào),那么我們可以使用組會(huì)話解決這個(gè)問題。
先在遠(yuǎn)程服務(wù)器上新建一個(gè)公共會(huì)話,命名為groupSession。
tmux new -s groupSession
其他用戶不去直接連接這個(gè)會(huì)話,而是通過創(chuàng)建一個(gè)新的會(huì)話來加入上面的公共會(huì)話groupSession。
tmux new -t groupSession -s otherSession
此時(shí)兩個(gè)用戶都可以在同一個(gè)會(huì)話里操作,就會(huì)好像第二個(gè)用戶連接到了groupSession的會(huì)話一樣。此時(shí)兩個(gè)用戶都可以創(chuàng)建新建的窗口,新窗口的內(nèi)容依然會(huì)實(shí)時(shí)同步,但是其中一個(gè)用戶切換到其它窗口,對(duì)另外一個(gè)用戶沒有任何影響,因此在這個(gè)共享的組會(huì)話中,用戶各自的操作可以通過新建窗口來執(zhí)行。即使第二個(gè)用戶關(guān)閉otherSession會(huì)話,共享會(huì)話groupSession依然存在。
組會(huì)話在共享的同時(shí),又保留了相對(duì)的獨(dú)立,非常適合結(jié)對(duì)編程場(chǎng)景,它是結(jié)對(duì)編程最簡(jiǎn)單的方式,如果賬號(hào)不能共享,我們就要使用下面的方案了。
獨(dú)立賬號(hào)&Socket共享會(huì)話開始之前我們需要確保用戶對(duì)遠(yuǎn)程服務(wù)器上同一個(gè)目錄擁有相同的讀寫權(quán)限,假設(shè)這個(gè)目錄為/var/tmux/。
使用new-session(簡(jiǎn)寫new)創(chuàng)建會(huì)話時(shí),使用的是默認(rèn)的socket位置,默認(rèn)socket無法操作,所以我們需要?jiǎng)?chuàng)建一個(gè)指定socket文件的會(huì)話。
tmux -S /var/tmux/sharefile
另一個(gè)用戶進(jìn)入時(shí),需要指定socket文件加入會(huì)話。
tmux -S /var/tmux/sharefile attach
這樣,兩個(gè)不同的用戶就可以共享同一個(gè)會(huì)話了。
通常情況下,不同的用戶使用不同的配置文件來創(chuàng)建會(huì)話,但是,使用指定socket文件創(chuàng)建的tmux會(huì)話,會(huì)話加載的是第一個(gè)創(chuàng)建會(huì)話的用戶的~/.tmux.conf配置文件,隨后加入會(huì)話的其他用戶,依然使用同一份配置文件。
Tmux優(yōu)化要想tmux更加人性化、性能更佳,不妨參考下如下配置。
設(shè)置窗口面板起始序號(hào)set -g base-index 1 # 設(shè)置窗口的起始下標(biāo)為1 set -g pane-base-index 1 # 設(shè)置面板的起始下標(biāo)為1自定義狀態(tài)欄
set -g status-utf8 on # 狀態(tài)欄支持utf8 set -g status-interval 1 # 狀態(tài)欄刷新時(shí)間 set -g status-justify left # 狀態(tài)欄列表左對(duì)齊 setw -g monitor-activity on # 非當(dāng)前窗口有內(nèi)容更新時(shí)在狀態(tài)欄通知 set -g status-bg black # 設(shè)置狀態(tài)欄背景黑色 set -g status-fg yellow # 設(shè)置狀態(tài)欄前景黃色 set -g status-style "bg=black, fg=yellow" # 狀態(tài)欄前景背景色 set -g status-left "#[bg=#FF661D] ? #S " # 狀態(tài)欄左側(cè)內(nèi)容 set -g status-right "Continuum status: #{continuum_status}" # 狀態(tài)欄右側(cè)內(nèi)容 set -g status-left-length 300 # 狀態(tài)欄左邊長(zhǎng)度300 set -g status-right-length 500 # 狀態(tài)欄左邊長(zhǎng)度500 set -wg window-status-format " #I #W " # 狀態(tài)欄窗口名稱格式 set -wg window-status-current-format " #I:#W#F " # 狀態(tài)欄當(dāng)前窗口名稱格式(#I:序號(hào),#w:窗口名稱,#F:間隔符) set -wg window-status-separator "" # 狀態(tài)欄窗口名稱之間的間隔 set -wg window-status-current-style "bg=red" # 狀態(tài)欄當(dāng)前窗口名稱的樣式 set -wg window-status-last-style "fg=red" # 狀態(tài)欄最后一個(gè)窗口名稱的樣式 set -g message-style "bg=#202529, fg=#91A8BA" # 指定消息通知的前景、后景色開啟256 colors支持
默認(rèn)情況下,tmux中使用vim編輯器,文本內(nèi)容的配色和直接使用vim時(shí)有些差距,此時(shí)需要開啟256 colors的支持,配置如下。
set -g default-terminal "screen-256color"
或者:
set -g default-terminal "tmux-256color"
或者啟動(dòng)tmux時(shí)增加參數(shù)-2:
alias tmux="tmux -2" # Force tmux to assume the terminal supports 256 colours關(guān)閉默認(rèn)的rename機(jī)制
tmux默認(rèn)會(huì)自動(dòng)重命名窗口,頻繁的命令行操作,將頻繁觸發(fā)重命名,比較浪費(fèi)CPU性能,性能差的計(jì)算機(jī)上,問題可能更為明顯。建議添加如下配置關(guān)閉rename機(jī)制。
setw -g automatic-rename off setw -g allow-rename off去掉小圓點(diǎn)
tmux默認(rèn)會(huì)同步同一個(gè)會(huì)話的操作到所有會(huì)話連接的終端窗口中,這種同步機(jī)制,限制了窗口的大小為最小的會(huì)話連接。因此當(dāng)你開一個(gè)大窗口去連接會(huì)話時(shí),實(shí)際的窗口將自動(dòng)調(diào)整為最小的那個(gè)會(huì)話連接的窗口,終端剩余的空間將填充排列整齊的小圓點(diǎn),如下所示。
為了避免這種問題,我們可以在連接會(huì)話的時(shí)候,斷開其他的會(huì)話連接。
tmux a -d
如果已經(jīng)進(jìn)入了tmux會(huì)話中,才發(fā)現(xiàn)這種問題,這個(gè)時(shí)候可以輸入命令達(dá)到同樣的效果。
`: a -d腳本化的Tmux
tmux作為終端復(fù)用軟件,支持純命令行操作也是其一大亮點(diǎn)。你既可以啟用可視化界面創(chuàng)建會(huì)話,也可以運(yùn)行腳本生成會(huì)話,對(duì)于tmux依賴者而言,編寫幾個(gè)tmux腳本批量維護(hù)會(huì)話列表,快速重啟、切換、甚至分享部分會(huì)話都是非常方便的。可能會(huì)有人說為什么不用Tmux Resurrect呢?是的,Tmux Resurrect很好,一鍵恢復(fù)也很誘人,但是對(duì)于一個(gè)維護(hù)大量tmux會(huì)話的用戶而言,一鍵恢復(fù)可能不見得好,分批次恢復(fù)可能是他(她)更想要的,腳本化的tmux就很好地滿足了這點(diǎn)。
腳本中創(chuàng)建tmux會(huì)話時(shí),由于不需要開啟可視化界面,需要輸入-d參數(shù)指定會(huì)話后臺(tái)運(yùn)行,如下。
tmux new -s init -d # 后臺(tái)創(chuàng)建一個(gè)名稱為init的會(huì)話
新建的會(huì)話,建議重命令會(huì)話的窗口名稱,以便后續(xù)維護(hù)。
# 重命名init會(huì)話的第一個(gè)窗口名稱為service tmux rename-window -t "init:1" service
現(xiàn)在,可以在剛才的窗口中輸入指令了。
# 切換到指定目錄并運(yùn)行python服務(wù) tmux send -t "init:service" "cd ~/workspace/language/python/;python2.7 server.py" Enter
一個(gè)面板占用一個(gè)窗口可能太浪費(fèi)了,我們來分個(gè)屏吧。
# 默認(rèn)上下分屏 tmux split-window -t "init:service" # 切換到指定目錄并運(yùn)行node服務(wù) tmux send -t "init:service" "cd ~/data/louiszhai/node-webserver/;npm start" Enter
現(xiàn)在一個(gè)窗口擁有上下兩個(gè)面板,是時(shí)候創(chuàng)建一個(gè)新的窗口來運(yùn)行更多的程序了。
# 新建一個(gè)名稱為tool的窗口 tmux neww -a -n tool -t init # neww等同于new window # 運(yùn)行weinre調(diào)試工具 tmux send -t "init:tool" "weinre --httpPort 8881 --boundHost -all-" Enter
另外新建窗口運(yùn)行程序,有更方便的方式,比如使用 processes 選項(xiàng)。
tmux neww-n processes ls # 新建窗口并執(zhí)行命令,命令執(zhí)行結(jié)束后窗口將關(guān)閉 tmux neww-n processes top # 由于top命令持續(xù)在前臺(tái)運(yùn)行,因此窗口將保留,直到top命令退出
新的窗口,我們嘗試下水平分屏。
# 水平分屏 tmux split-window -h -t "init:tool" # 切換到指定目錄并啟用aria2 web管理后臺(tái) tmux send -t "init:tool" "cd ~/data/tools/AriaNg/dist/;python -m SimpleHTTPServer 10108" Enter
類似的腳本,我們可以編寫一打,這樣快速重啟、切換、甚至分享會(huì)話都將更加便捷。
開機(jī)自動(dòng)啟用Web服務(wù)器開機(jī)自動(dòng)準(zhǔn)備工作環(huán)境是一個(gè)很好的idea,但卻不好實(shí)現(xiàn)。對(duì)于程序員而言,一個(gè)開機(jī)即用的計(jì)算機(jī)會(huì)節(jié)省大量的初始化操作,特別是前端工程師,本地常常會(huì)啟用多個(gè)服務(wù)器,每次開機(jī)挨個(gè)啟動(dòng)將耗時(shí)耗力。為此,在遇到tmux之前,我常常拖延重啟計(jì)算機(jī)的時(shí)機(jī),一度連續(xù)運(yùn)行Mac一月之久,直到它不堪重負(fù)。
有了tmux腳本化的基礎(chǔ),開機(jī)自動(dòng)啟用web服務(wù)器就不在話下了,接杯水的時(shí)間,計(jì)算機(jī)就重啟恢復(fù)了滿血。如下是操作步驟:
首先,上面的tmux腳本,可以合并到同一個(gè)文件中,指定文件權(quán)限為可執(zhí)行,并命名為init.sh(名稱可自?。?/p>
chmod u+x ./init.sh
然后,打開 系統(tǒng)偏好設(shè)置 - 用戶與群組 - 登錄項(xiàng),點(diǎn)擊添加按鈕+,選擇剛剛保存的init.sh腳本,最終效果如下:
至此,Mac開機(jī)將自動(dòng)運(yùn)行 init.sh 腳本,自動(dòng)啟用web服務(wù)器。
完成了上面這些配置,就真正實(shí)現(xiàn)了一鍵開機(jī)。
最后,附上我本地的配置文件 .tmux.conf,以及啟動(dòng)腳本 init.sh。
版權(quán)聲明:轉(zhuǎn)載需注明作者和出處。
本文作者: louis
本文鏈接: http://louiszhai.github.io/20...
相關(guān)文章
FAQ · tmux/tmux Wiki
“Maximizing” a pane in tmux
vim - selecting text tmux copy-mode
Getting 256 colors to work in tmux
tmux: Productive Mouse-Free Development 中文版
Notes and workarounds for accessing the Mac OS X pasteboard in tmux sessions
Unable to copy from tmux to the OS X clipboard · Issue #909 · tmux/tmux
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88939.html
摘要:服務(wù)器的任務(wù)不間斷運(yùn)行,就是利用了的特性。超絕常用操作快捷鍵參考。我的配置如下基礎(chǔ)設(shè)置前綴綁定啟用鼠標(biāo)選中窗口將快捷鍵設(shè)置為模式 服務(wù)器的任務(wù)不間斷運(yùn)行,就是利用了tmux的特性。就是說,一般ssh是斷開就會(huì)停止所有之前連接ssh期間運(yùn)行的所有processes,而tmux的核心業(yè)務(wù)不在于把屏幕分成幾塊好看,而是它能保存session!而且還能多端實(shí)時(shí)直播session! 了解tmux...
摘要:本文作者詳細(xì)描述了自己組裝深度學(xué)習(xí)服務(wù)器的過程,從主板電源機(jī)箱等的選取到部件的安裝,再到服務(wù)器的設(shè)置,可謂面面俱到。注本文旨在討論服務(wù)器設(shè)置及多用戶協(xié)作,部件組裝和軟件安裝過程是關(guān)于創(chuàng)建自己的的文章的簡(jiǎn)化版本。本文作者詳細(xì)描述了自己組裝深度學(xué)習(xí)服務(wù)器的過程,從 CPU、GPU、主板、電源、機(jī)箱等的選取到部件的安裝,再到服務(wù)器的設(shè)置,可謂面面俱到。作者指出,組裝者首先要弄清自己的需求,然后根據(jù)...
閱讀 1552·2021-11-04 16:10
閱讀 2814·2021-09-30 09:48
閱讀 2853·2019-08-29 11:31
閱讀 1591·2019-08-28 18:22
閱讀 3240·2019-08-26 13:44
閱讀 1332·2019-08-26 13:42
閱讀 2856·2019-08-26 10:20
閱讀 767·2019-08-23 17:00