国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Tmux使用手冊

Half / 3918人閱讀

摘要:關于我的博客掘金專欄路易斯專欄原文鏈接使用手冊鏈接程序員使用手冊極客頭條全文共字,閱讀需分鐘。使用快捷鍵組合,三次按鍵就可以斷開當前會話。新增面板中,使用最多的功能之一就是新增一個面板。

本文首發于CSDN網站,下面的版本又經過進一步的修訂。

關于

我的博客:louis blog

掘金專欄:路易斯專欄

原文鏈接:Tmux使用手冊

CSDN鏈接:程序員Tmux使用手冊 - 極客頭條

全文共12k字,閱讀需20分鐘。

導讀

我一直信奉簡潔至上的原則,桌面窗口的數量越少,我的心情就越愉悅,開發的效率也就越高。反之,雜亂的桌面,暴漲的Chrome tab數量,或是無數的終端窗口,它們會逐步侵占我的注意力,分散我的思維,最終令我難以專注。因此桌面上我很少放文件,使用Chrome時常點 OneTab 回收標簽頁,切進終端時使用tmux管理窗口。

我很懶,懶到期望開機后不需要任何操作,本地的十幾種web開發服務器就自動運行,當然我不希望連續彈出十幾個窗口或是tab,我需要的是靜默無感知的啟用服務,然后還能快速地進入到現場進行操作,web服務器運行時不占據終端窗口,關閉iTem2后操作現場不會被銷毀。我的這些期望,tmux都能幫我實現,實際上,除了這些,tmux還能做得更多更好。

到目前為止,tmux幫助我兩年有余,它帶給我許多驚喜。獨樂不如眾樂,愿你也能一同享受tmux帶來的快樂。

簡介

tmux是一款優秀的終端復用軟件,它比Screen更加強大,至于如何強大,網上有大量的文章討論了這點,本文不再重復。tmux之所以受人們喜愛,主要得益于以下三處功能:

絲滑分屏(split),雖然iTem2也提供了橫向和豎向分屏功能,但這種分屏功能非常拙劣,完全等同于屏幕新開一個窗口,新開的pane不會自動進入到當前目錄,也沒有記住當前登錄狀態。這意味著如果我ssh進入到遠程服務器時,iTem2新開的pane中,我依然要重新走一遍ssh登錄的老路(omg)。tmux就不會這樣,tmux窗口中,新開的pane,默認進入到之前的路徑,如果是ssh連接,登錄狀態也依舊保持著,如此一來,我就可以隨意的增刪pane,這種靈活性,好處不言而喻。

保護現場(attach),即使命令行的工作只進行到一半,關閉終端后還可以重新進入到操作現場,繼續工作。對于ssh遠程連接而言,即使網絡不穩定也沒有關系,掉線后重新連接,可以直奔現場,之前運行中的任務,依舊在跑,就好像從來沒有離開過一樣;特別是在遠程服務器上運行耗時的任務,tmux可以幫你一直保持住會話。如此一來,你就可以隨時隨地放心地進行移動辦公,只要你附近的計算機裝有tmux(沒有你也可以花幾分鐘裝一個),你就能繼續剛才的工作。

會話共享(適用于結對編程或遠程教學),將 tmux 會話的地址分享給他人,這樣他們就可以通過 SSH 接入該會話。如果你要給同事演示遠程服務器的操作,他不必直勾勾地盯著你的屏幕,借助tmux,他完全可以進入到你的會話,然后靜靜地看著他桌面上你風騷的鍵盤走位,只要他愿意,甚至還可以錄個屏。

以上,只是主要功能,更多功能還在后頭,接下來我將詳細地介紹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模型構建,輸入tmux命令就相當于開啟了一個服務器,此時默認將新建一個會話,然后會話中默認新建一個窗口,窗口中默認新建一個面板。會話、窗口、面板之間的聯系如下:

一個tmux session(會話)可以包含多個window(窗口),窗口默認充滿會話界面,因此這些窗口中可以運行相關性不大的任務。

一個window又可以包含多個pane(面板),窗口下的面板,都處于同一界面下,這些面板適合運行相關性高的任務,以便同時觀察到它們的運行情況。

會話 新建會話

新建一個tmux session非常簡單,語法為tmux new -s session-name,也可以簡寫為tmux,為了方便管理,建議指定會話名稱,如下。

tmux # 新建一個無名稱的會話
tmux new -s demo # 新建一個名稱為demo的會話
斷開當前會話

會話中操作了一段時間,我希望斷開會話同時下次還能接著用,怎么做?此時可以使用detach命令。

tmux detach # 斷開當前會話,會話在后臺運行

也許你覺得這個太麻煩了,是的,tmux的會話中,我們已經可以使用tmux快捷鍵了。使用快捷鍵組合Ctrl+b + d,三次按鍵就可以斷開當前會話。

進入之前的會話

斷開會話后,想要接著上次留下的現場繼續工作,就要使用到tmux的attach命令了,語法為tmux attach-session -t session-name,可簡寫為tmux a -t session-nametmux a。通常我們使用如下兩種方式之一即可:

tmux a # 默認進入第一個會話
tmux a -t demo # 進入到名稱為demo的會話
關閉會話

會話的使命完成后,一定是要關閉的。我們可以使用tmux的kill命令,kill命令有kill-panekill-serverkill-sessionkill-window共四種,其中kill-session的語法為tmux kill-session -t session-name。如下:

tmux kill-session -t demo # 關閉demo會話
tmux kill-server # 關閉服務器,所有的會話都將關閉
查看所有的會話

管理會話的第一步就是要查看所有的會話,我們可以使用如下命令:

tmux list-session # 查看所有會話
tmux ls # 查看所有會話,提倡使用簡寫形式

如果剛好處于會話中怎么辦?別擔心,我們可以使用對應的tmux快捷鍵Ctrl+b + s,此時tmux將打開一個會話列表,按上下鍵(????)或者鼠標滾輪,可選中目標會話,按左右鍵(???)可收起或展開會話的窗口,選中目標會話或窗口后,按回車鍵即可完成切換。

Tmux快捷指令

關于快捷指令,首先要認識到的是:tmux的所有指令,都包含同一個前綴,默認為Ctrl+b,輸入完前綴過后,控制臺激活,命令按鍵才能生效。前面tmux會話相關的操作中,我們共用到了兩個快捷鍵Ctrl+b + dCtrl+b + s,但這僅僅是冰山一角,欲窺tmux龐大的快捷鍵體系,請看下表。

表一:系統指令。

前綴 指令 描述
Ctrl+b ? 顯示快捷鍵幫助文檔
Ctrl+b d 斷開當前會話
Ctrl+b D 選擇要斷開的會話
Ctrl+b Ctrl+z 掛起當前會話
Ctrl+b r 強制重載當前會話
Ctrl+b s 顯示會話列表用于選擇并切換
Ctrl+b : 進入命令行模式,此時可直接輸入ls等命令
Ctrl+b [ 進入復制模式,按q退出
Ctrl+b ] 粘貼復制模式中復制的文本
Ctrl+b ~ 列出提示信息緩存

表二:窗口(window)指令。

前綴 指令 描述
Ctrl+b c 新建窗口
Ctrl+b & 關閉當前窗口(關閉前需輸入y or n確認)
Ctrl+b 0~9 切換到指定窗口
Ctrl+b p 切換到上一窗口
Ctrl+b n 切換到下一窗口
Ctrl+b w 打開窗口列表,用于且切換窗口
Ctrl+b , 重命名當前窗口
Ctrl+b . 修改當前窗口編號(適用于窗口重新排序)
Ctrl+b f 快速定位到窗口(輸入關鍵字匹配窗口名稱)

表三:面板(pane)指令。

前綴 指令 描述
Ctrl+b " 當前面板上下一分為二,下側新建面板
Ctrl+b % 當前面板左右一分為二,右側新建面板
Ctrl+b x 關閉當前面板(關閉前需輸入y or n確認)
Ctrl+b z 最大化當前面板,再重復一次按鍵后恢復正常(v1.8版本新增)
Ctrl+b ! 將當前面板移動到新的窗口打開(原窗口中存在兩個及以上面板有效)
Ctrl+b ; 切換到最后一次使用的面板
Ctrl+b q 顯示面板編號,在編號消失前輸入對應的數字可切換到相應的面板
Ctrl+b { 向前置換當前面板
Ctrl+b } 向后置換當前面板
Ctrl+b Ctrl+o 順時針旋轉當前窗口中的所有面板
Ctrl+b 方向鍵 移動光標切換面板
Ctrl+b o 選擇下一面板
Ctrl+b 空格鍵 在自帶的面板布局中循環切換
Ctrl+b Alt+方向鍵 以5個單元格為單位調整當前面板邊緣
Ctrl+b Ctrl+方向鍵 以1個單元格為單位調整當前面板邊緣(Mac下被系統快捷鍵覆蓋)
Ctrl+b t 顯示時鐘

tmux的絲滑分屏功能正是得益于以上系統、窗口、面板的快捷指令,只要你愿意,你就可以解除任意的快捷指令,然后綁上你喜歡的指令,當然這就涉及到它的可配置性了,請繼續往下讀。

靈活的配置性

除了快捷指令外,tmux還提供了類似vim的配置性功能。可配置性是軟件的一項進階級功能,只有具備了可配置性,軟件才有了鮮活的個性,用戶才能體會到操作的快感。

修改指令前綴

相信只要你用過幾次tmux,就會發現Ctrl+b指令前綴,著實不太方便。這兩個鍵相距太遠,按鍵成本太高了。因此我們首先需要將它更換為距離更近的Ctrl+a組合鍵,或者不常用的 ` 鍵(當然其他鍵也是可以的)。

tmux的用戶級配置文件為~/.tmux.conf(沒有的話就創建一個),修改快捷指令,只需要增加如下三行即可。

set -g prefix C-a #
unbind C-b # C-b即Ctrl+b鍵,unbind意味著解除綁定
bind C-a send-prefix # 綁定Ctrl+a為新的指令前綴

# 從tmux v1.6版起,支持設置第二個指令前綴
set-option -g prefix2 ` # 設置一個不常用的`鍵作為指令前綴,按鍵更快些

修改的~/.tmux.conf配置文件有如下兩種方式可以令其生效:

restart tmux。

在tmux窗口中,先按下Ctrl+b指令前綴,然后按下系統指令:,進入到命令模式后輸入source-file ~/.tmux.conf,回車后生效。

既然快捷指令如此方便,更為優雅的做法是新增一個加載配置文件的快捷指令 ,這樣就可以隨時隨地load新的配置了,如下所示。

# 綁定快捷鍵為r
bind r source-file ~/.tmux.conf ; display-message "Config reloaded.."

請特別注意,在已經創建的窗口中,即使加載了新的配置,舊的配置依然有效(只要你新加的功能沒有覆蓋舊的配置,因此如果你第一次綁定快捷指令為x鍵,然后又改為綁定y鍵,那么xy都將有效),新建會話不受此影響,將直接采用新的配置。

既然我們已經邁出配置化的第一步,那么接下來我們可以做得更多。

新增面板

tmux中,使用最多的功能之一就是新增一個面板。水平方向新增面板的指令是 prefix + " ,垂直方向是 prefix + %"%需要兩個鍵同時按下才能完成,加上指令前綴至少需要3~4次按鍵才能組成一個完整的指令,同時這個兩個鍵也不夠醒目和方便,因此我們可以綁定兩個更常用的指令 -|,如下所示:

unbind """
bind - splitw -v -c "#{pane_current_path}" # 垂直方向新增面板,默認進入當前目錄
unbind %
bind | splitw -h -c "#{pane_current_path}" # 水平方向新增面板,默認進入當前目錄
開啟鼠標支持

默認情況下,tmux的多窗口之間的切換以及面板大小調整,需要輸入指令才能完成,這一過程,涉及到的指令較多,而且操作麻煩,特別是面板大小調整,指令難以一步到位,這個時候開啟鼠標支持就完美了。

對于tmux v2.1(2015.10.28)之前的版本,需加入如下配置:

setw -g mode-mouse on # 支持鼠標選取文本等
setw -g mouse-resize-pane on # 支持鼠標拖動調整面板的大小(通過拖動面板間的分割線)
setw -g mouse-select-pane on # 支持鼠標選中并切換面板
setw -g mouse-select-window on # 支持鼠標選中并切換窗口(通過點擊狀態欄窗口名稱)

有的地方可能會出現set-window-option的寫法,setw就是它的別名。

對于tmux v2.1及以上的版本,僅需加入如下配置:

set-option -g mouse on # 等同于以上4個指令的效果

需要注意的是,開啟鼠標支持后,iTem2默認的鼠標選中即復制功能需要同時按下 Alt 鍵,才會生效。

快速面板切換

鼠標支持確實能帶來很大的便捷性,特別是對于習慣了鼠標操作的tmux新手,但對于鍵盤愛好者而言,這不是什么好消息,對他們而言,雙手不離鍵盤是基本素質。

雖然指令前綴加方向鍵可以切換面板,但方向鍵太遠,不夠快,不夠Geek。沒關系,我們可以將面板切換升級為熟悉的hjkl鍵位。

# 綁定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表示可重復按鍵,大概500ms之內,重復的hjkl按鍵都將有效,完美支持了快速切換的Geek需求。

除了上下左右外, 還有幾個快捷指令可以設置。

bind -r e lastp # 選擇最后一個面板
bind -r ^e last # 選擇最后一個窗口

bind -r ^u swapp -U # 與前一個面板交換位置
bind -r ^d swapp -D # 與后一個面板交換位置
面板大小調整

習慣了全鍵盤操作后,命令的便捷性不言而喻。既然面板切換的指令都可以升級,面板大小調整的指令自然也不能落后。如下配置就可以升級你的操作:

# 綁定Ctrl+hjkl鍵為面板上下左右調整邊緣的快捷指令
bind -r ^k resizep -U 10 # 綁定Ctrl+k為往↑調整面板邊緣10個單元格
bind -r ^j resizep -D 10 # 綁定Ctrl+j為往↓調整面板邊緣10個單元格
bind -r ^h resizep -L 10 # 綁定Ctrl+h為往←調整面板邊緣10個單元格
bind -r ^l resizep -R 10 # 綁定Ctrl+l為往→調整面板邊緣10個單元格

以上,resizepresize-pane的別名。

面板最大化

當窗口中面板的數量逐漸增多時,每個面板的空間就會逐漸減少。為了保證有足夠的空間顯示內容,tmux從v1.8版本起,提供了面板的最大化功能,輸入tmux-prefix+z,就可以最大化當前面板至窗口大小,只要再重復輸入一次,便恢復正常。那么tmux v1.8以下的版本,怎么辦呢?別急,有大神提供了如下的解決方案。

首先編寫一個zoom腳本,該腳本通過新建一個窗口,交換當前面板與新的窗口默認面板位置,來模擬最大的功能;通過重復一次按鍵,還原面板位置,并關閉新建的窗口,來模擬還原功能,如下所示:

#!/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目錄中(沒有則新建目錄),接下來只需要綁定一個快捷指令就行,如下。

unbind z
bind z run ". ~/.tmux/zoom"
窗口變為面板

通過上面的zoom腳本,面板可以輕松地最大化為一個新的窗口。那么反過來,窗口是不是可以最小化為一個面板呢?

試想這樣一個場景:當你打開多個窗口后,然后想將其中幾個窗口合并到當前窗口中,以便對比觀察輸出。

實際上,你的要求就是將其它窗口變成面板,然后合并到當前窗口中。對于這種操作,我們可以在當前窗口,按下prefix + :,打開命令行,然后輸入如下命令:

join-pane -s window01 # 合并名稱為window01的窗口的默認(第一個)面板到當前窗口中
join-pane -s window01.1 # .1顯式指定了第一個面板,.2就是第二個面板(我本地將面板編號起始值設置為1,默認是0)

每次執行join-pane命令都會合并一個面板,并且指定的窗口會減少一個面板,直到面板數量為0,窗口關閉。

除了在當前會話中操作外,join-pane命令甚至可以從其它指定會話中合并面板,格式為join-pane -s [session_name]:[window].[pane],如join-pane -s 2:1.1 即合并第二個會話的第一個窗口的第一個面板到當前窗口,當目標會話的窗口和面板數量為0時,會話便會關閉。

注:上一節中的swap-pane命令與join-pane語法基本一致。

其他配置
bind m command-prompt "splitw -h "exec man %%""   # 綁定m鍵為在新的panel打開man
# 綁定P鍵為開啟日志功能,如下,面板的輸出日志將存儲到桌面
bind P pipe-pane -o "cat >>~/Desktop/#W.log" ; display "Toggled logging to ~/Desktop/#W.log"
恢復用戶空間

tmux會話中,Mac的部分命令如 osascriptopenpbcopypbpaste等可能會失效(失效命令未列全)。

部分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

對此,我們可以通過安裝reattach-to-user-namespace包裝程序來解決這個問題。

brew install reattach-to-user-namespace

~/.tmux.conf中添加配置:

set -g default-command "reattach-to-user-namespace -l $SHELL"

這樣你的交互式shell最終能夠重新連接到用戶級的命名空間。由于連接狀態能夠被子進程繼承,故以上配置保證了所有從 shell 啟動的命令能夠被正確地連接。

有些時候,我們可能會在不同的操作系統中共享配置文件,如果你的tmux版本大于1.9,我們還可以使用if-shell來判斷是否Mac系統,然后再指定default-command

if-shell "test "$(uname -s)" = Darwin" "set-option -g default-command "exec reattach-to-user-namespace -l $SHELL""

對于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對應于你的默認Shell,通常是/usr/bin/bash/usr/local/bin/zsh

復制模式

tmux中操作文本,自然離不開復制模式,通常使用復制模式的步驟如下:

輸入 `+[ 進入復制模式

按下 空格鍵 開始復制,移動光標選擇復制區域

按下 回車鍵 復制選中文本并退出復制模式

按下 `+] 粘貼文本

查看復制模式默認的快捷鍵風格:

tmux show-window-options -g mode-keys # mode-keys emacs

默認情況下,快捷鍵為emacs風格。

為了讓復制模式更加方便,我們可以將快捷鍵設置為熟悉的vi風格,如下:

setw -g mode-keys vi # 開啟vi風格后,支持vi的C-d、C-u、hjkl等快捷鍵
自定義復制和選擇快捷鍵

除了快捷鍵外,復制模式的啟用、選擇、復制、粘貼等按鍵也可以向vi風格靠攏。

bind Escape copy-mode # 綁定esc鍵為進入復制模式
bind -t vi-copy v begin-selection # 綁定v鍵為開始選擇文本
bind -t vi-copy y copy-selection # 綁定y鍵為復制選中文本
bind p pasteb # 綁定p鍵為粘貼文本(p鍵默認用于進入上一個窗口,不建議覆蓋)

以上,綁定 vy兩鍵的設置只在tmux v2.4版本以下才有效,對于v2.4及以上的版本,綁定快捷鍵需要使用 -T 選項,發送指令需要使用 -X 選項,請參考如下設置:

bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
Buffer緩存

tmux復制操作的內容默認會存進buffer里,buffer是一個粘貼緩存區,新的緩存總是位于棧頂,它的操作命令如下:

tmux list-buffers # 展示所有的 buffers
tmux show-buffer [-b buffer-name] # 顯示指定的 buffer 內容
tmux choose-buffer # 進入 buffer 選擇頁面(支持jk上下移動選擇,回車選中并粘貼 buffer 內容到面板上)
tmux set-buffer # 設置buffer內容
tmux load-buffer [-b buffer-name] file-path # 從文件中加載文本到buffer緩存
tmux save-buffer [-a] [-b buffer-name] path # 保存tmux的buffer緩存到本地
tmux paste-buffer # 粘貼buffer內容到會話中
tmux delete-buffer [-b buffer-name] # 刪除指定名稱的buffer

以上buffer操作在不指定buffer-name時,默認處理是棧頂的buffer緩存。

在tmux會話的命令行輸入時,可以省略上述tmux前綴,其中list-buffers的操作如下所示:

choose-buffer的操作如下所示:

默認情況下,buffers內容是獨立于系統粘貼板的,它存在于tmux進程中,且可以在會話間共享。

使用系統粘貼板

存在于tmux進程中的buffer緩存,雖然可以在會話間共享,但不能直接與系統粘貼板共享,不免有些遺憾。幸運的是,現在我們有成熟的方案來實現這個功能。

在Linux上使用粘貼板

通常,Linux中可以使用xclip工具來接入系統粘貼板。

首先,需要安裝xclip

sudo apt-get install xclip

然后,.tmux.conf的配置如下。

# buffer緩存復制到Linux系統粘貼板
bind C-c run " tmux save-buffer - | xclip -i -sel clipboard"
# Linux系統粘貼板內容復制到會話
bind C-v run " tmux set-buffer "$(xclip -o -sel clipboard)"; tmux paste-buffer"

按下prefix + Ctrl + c 鍵,buffer緩存的內容將通過xlip程序復制到粘貼板,按下prefix + Ctrl + v鍵,tmux將通過xclip訪問粘貼板,然后由set-buffer命令設置給buffer緩存,最后由paste-buffer粘貼到tmux會話中。

在Mac上使用粘貼板

我們都知道,Mac自帶 pbcopypbpaste 命令,分別用于復制和粘貼,但在tmux命令中它們卻不能正常運行。這里我將詳細介紹下原因:

Mac的粘貼板服務是在引導命名空間注冊的。命名空間存在層次之分,更高級別的命名空間擁有訪問低級別命名空間(如root引導命名空間)的權限,反之卻不行。流程創建的屬于Mac登錄會話的一部分,它會被自動包含在用戶級的引導命名空間中,因此只有用戶級的命名空間才能訪問粘貼板服務。tmux使用守護進程(3)庫函數創建其服務器進程,在Mac OS X 10.5中,蘋果改變了守護進程(3)的策略,將生成的過程從最初的引導命名空間移到了根引導命名空間。而根引導命名空間訪問權限較低,這意味著tmux服務器,和它的子進程,一同失去了原引導命名空間的訪問權限(即無權限訪問粘貼板服務)。

如此,我們可以使用一個小小的包裝程序來重新連接到合適的命名空間,然后執行訪問用戶級命名空間的粘貼板服務,這個包裝程序就是reattach-to-user-namespace

那么,Mac下.tmux.conf的配置如下:

# buffer緩存復制到Mac系統粘貼板
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
# Mac系統粘貼板內容復制到會話
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - ; paste-buffer -d"

reattach-to-user-namespace 作為包裝程序來訪問Mac粘貼板,按下prefix + Ctrl + c 鍵,buffer緩存的內容將復制到粘貼板,按下prefix + Ctrl + v鍵,粘貼板的內容將通過 load-buffer 加載,然后由 paste-buffer 粘貼到tmux會話中。

為了在復制模式中使用Mac系統的粘貼板,可做如下配置:

# 綁定y鍵為復制選中文本到Mac系統粘貼板
bind-key -T copy-mode-vi "y" send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
# 鼠標拖動選中文本,并復制到Mac系統粘貼板
bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "pbcopy"

完成以上配置后記得重啟tmux服務器。至此,復制模式中,按y鍵將保存選中的文本到Mac系統粘貼板,隨后按Command + v鍵便可粘貼。

保存Tmux會話

信息時代,數據尤為重要。tmux保護現場的能力依賴于tmux進程,如果進程退出,則意味著會話數據的丟失,因此關機重啟后,tmux中的會話將被清空,這不是我們想要見到的。幸運的是,目前有這樣兩款插件:Tmux ResurrectTmux Continuum,可以永久保存tmux會話(它們均適用于tmux v1.9及以上版本)。

Tmux Resurrect

Tmux Resurrect無須任何配置,就能夠備份tmux會話中的各種細節,包括窗口、面板的順序、布局、工作目錄,運行程序等等數據。因此它能在系統重啟后完全地恢復會話。由于其冪等的恢復機制,它不會試圖去恢復一個已經存在的窗口或者面板,所以,即使你不小心多恢復了幾次會話,它也不會出現問題,這樣主動恢復時我們就不必擔心手抖多按了一次。另外,如果你是tmuxinator用戶,我也建議你遷移到 tmux-resurrect插件上來,具體請參考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提供如下兩個操作:

保存,快捷指令是prefix + Ctrl + s,tmux狀態欄在保存開始,保存后分別提示"Saving...","Tmux environment saved !"。

恢復,快捷指令是prefix + Ctrl + r,tmux狀態欄在恢復開始,恢復后分別提示"Restoring...","Tmux restore complete !"。

保存時,tmux會話的詳細信息會以文本文件的格式保存到~/.tmux/resurrect目錄,恢復時則從此處讀取,由于數據文件是明文的,因此你完全可以自由管理或者編輯這些會話狀態文件(如果備份頻繁,記得定期清除歷史備份)。

可選的配置

Tmux Resurrec本身是免配置開箱即用的,但同時也提供了如下選項以便修改其默認設置。

set -g @resurrect-save "S" # 修改保存指令為S
set -g @resurrect-restore "R" 修改恢復指令為R
# 修改會話數據的保持路徑,此處不能使用除了$HOME, $HOSTNAME, ~之外的環境變量
set -g @resurrect-dir "/some/path" 

默認情況下只有一個保守的列表項(即vi vim nvim emacs man less more tail top htop irssi mutt)可以恢復,對此 Restoring programs doc 解釋了怎么去恢復額外的項目。

進階的備份

除了基礎備份外,Tmux Resurrec還提供進階的備份功能,如下所示:

恢復vim 和 neovim 會話

恢復面板內容

恢復shell的歷史記錄(實驗性功能)

進階的備份功能默認不開啟,需要特別配置。

1)恢復vim 和 neovim 會話,需要完成如下兩步:

通過vim的vim-obsession插件保存vim/neovim會話。

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)恢復面板內容,需在~/.tmux.conf中增加一行配置:

set -g @resurrect-capture-pane-contents "on" # 開啟恢復面板內容功能

目前使用該功能時,請確保tmux的default-command沒有包含&& 或者||操作符,否則將導致bug。(查看default-command的值,請使用命令tmux show -g default-command。)

3)恢復shell的歷史記錄,需在~/.tmux.conf中增加一行配置:

set -g @resurrect-save-shell-history "on"

由于技術的限制,保存時,只有無前臺任務運行的面板,它的shell歷史記錄才能被保存。

Tmux Continuum

可能你嫌手動保存和恢復太過麻煩,別擔心,這不是問題。Tmux Continuum 在 Tmux Resurrec的基礎上更進一步,現在保存和恢復全部自動化了,如你所愿,可以無感使用tmux,不用再擔心備份問題。

Tmux Continuum安裝過程如下所示(它依賴Tmux Resurrect,請保證已安裝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默認每隔15mins備份一次,我設置的是一天一次:

set -g @continuum-save-interval "1440"

關閉自動備份,只需設置時間間隔為 0 即可:

set -g @continuum-save-interval "0"

想要在tmux啟動時就恢復最后一次保存的會話環境,需增加如下配置:

set -g @continuum-restore "on" # 啟用自動恢復

如果不想要啟動時自動恢復的功能了,直接移除上面這行就行。想要絕對確定自動恢復不會發生,就在用戶根目錄下創建一個tmux_no_auto_restore空文件(創建命令:touch ~/tmux_no_auto_restore),該文件存在時,自動恢復將不觸發。

對于tmux高級用戶(可能就是你)而言,同時運行多個tmux服務器也是有可能的。你可能并不希望后面啟用的幾個tmux服務器自動恢復或者自動保存會話。因此Tmux Continuum會優先在第一個啟用的tmux服務器中生效,隨后啟用的tmux服務器不再享受自動恢復或自動保存會話的待遇。

實際上,不管Tmux Continuum功能有沒有啟用,或者多久保存一次,我們都有辦法從狀態欄知曉。Tmux Continuum提供了一個查看運行狀態的插值#{continuum_status},它支持status-rightstatus-left兩種狀態欄設置,如下所示:

set -g status-right "Continuum status: #{continuum_status}"

tmux運行時,#{continuum_status} 將顯示保存的時間間隔(單位為分鐘),此時狀態欄會顯示:

Continuum status: 1440

如果其自動保存功能關閉了,那么狀態欄會顯示:

Continuum status: off

借助Tmux Continuum插件,Mac重啟時,我們甚至可以選擇在Terminal 或者 iTerm2 中自動全屏啟用tmux。

為此,需在~/.tmux.conf中增加一行配置:

set -g @continuum-boot "on"

Mac下,自動啟用tmux還支持如下選項:

set -g @continuum-boot-options "fullscreen"Terminal自動全屏,tmux命令在Terminal中執行。

set -g @continuum-boot-options "iterm"iTerm2 替換 Terminal 應用,tmux命令在iTerm2中執行。

set -g @continuum-boot-options "iterm,fullscreen"iTerm2自動全屏,tmux命令在iTerm2中執行。

Linux中則沒有這些選項,它只能設置為自動啟用tmux服務器。

Tpm

以上,我們直接安裝了tmux插件。這沒有問題,可當插件越來越多時,我們就會需要統一的插件管理器。因此官方提供了tpm(支持tmux v1.9及以上版本)。

tpm安裝過程如下所示:

cd ~/.tmux/plugins
git clone https://github.com/tmux-plugins/tpm

安裝后需在~/.tmux.conf中增加如下配置:

# 默認需要引入的插件
set -g @plugin "tmux-plugins/tpm"
set -g @plugin "tmux-plugins/tmux-sensible"

# 引入其他插件的示例
# set -g @plugin "github_username/plugin_name" # 格式:github用戶名/插件名
# set -g @plugin "git@github.com/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環境。

更新插件,請按下prefix + U 鍵,選擇待更新的插件后,回車確認并更新。

卸載插件,需如下兩步:

~/.tmux.conf中移除插件所在行。

按下prefix + alt + u 移除插件。

會話共享 結對編程

tmux多會話連接實時同步的功能,使得結對編程成為了可能,這也是開發者最喜歡的功能之一。現在就差一步了,就是借助tmate把tmux會話分享出去。

tmate是tmux的管理工具,它可以輕松的創建tmux會話,并且自動生成ssh鏈接。

安裝tmate

brew install tmate

使用tmate新建一個tmux會話

tmate

此時屏幕下方會顯示ssh url,如下所示:

查看tmate生成的ssh鏈接

tmate show-messages

生成的ssh url如下所示,其中一個為只讀,另一個可編輯。

共享賬號&組會話

使用tmate遠程共享tmux會話,受制于多方的網絡質量,必然會存在些許延遲。如果共享會話的多方擁有同一個遠程服務器的賬號,那么我們可以使用組會話解決這個問題。

先在遠程服務器上新建一個公共會話,命名為groupSession

tmux new -s groupSession

其他用戶不去直接連接這個會話,而是通過創建一個新的會話來加入上面的公共會話groupSession

tmux new -t groupSession -s otherSession

此時兩個用戶都可以在同一個會話里操作,就會好像第二個用戶連接到了groupSession的會話一樣。此時兩個用戶都可以創建新建的窗口,新窗口的內容依然會實時同步,但是其中一個用戶切換到其它窗口,對另外一個用戶沒有任何影響,因此在這個共享的組會話中,用戶各自的操作可以通過新建窗口來執行。即使第二個用戶關閉otherSession會話,共享會話groupSession依然存在。

組會話在共享的同時,又保留了相對的獨立,非常適合結對編程場景,它是結對編程最簡單的方式,如果賬號不能共享,我們就要使用下面的方案了。

獨立賬號&Socket共享會話

開始之前我們需要確保用戶對遠程服務器上同一個目錄擁有相同的讀寫權限,假設這個目錄為/var/tmux/

使用new-session(簡寫new)創建會話時,使用的是默認的socket位置,默認socket無法操作,所以我們需要創建一個指定socket文件的會話。

tmux -S /var/tmux/sharefile

另一個用戶進入時,需要指定socket文件加入會話。

tmux -S /var/tmux/sharefile attach

這樣,兩個不同的用戶就可以共享同一個會話了。

通常情況下,不同的用戶使用不同的配置文件來創建會話,但是,使用指定socket文件創建的tmux會話,會話加載的是第一個創建會話的用戶的~/.tmux.conf配置文件,隨后加入會話的其他用戶,依然使用同一份配置文件。

Tmux優化

要想tmux更加人性化、性能更佳,不妨參考下如下配置。

設置窗口面板起始序號
set -g base-index 1 # 設置窗口的起始下標為1
set -g pane-base-index 1 # 設置面板的起始下標為1
自定義狀態欄
set -g status-utf8 on # 狀態欄支持utf8
set -g status-interval 1 # 狀態欄刷新時間
set -g status-justify left # 狀態欄列表左對齊
setw -g monitor-activity on # 非當前窗口有內容更新時在狀態欄通知

set -g status-bg black # 設置狀態欄背景黑色
set -g status-fg yellow # 設置狀態欄前景黃色
set -g status-style "bg=black, fg=yellow" # 狀態欄前景背景色

set -g status-left "#[bg=#FF661D] ? #S " # 狀態欄左側內容
set -g status-right "Continuum status: #{continuum_status}" # 狀態欄右側內容
set -g status-left-length 300 # 狀態欄左邊長度300
set -g status-right-length 500 # 狀態欄左邊長度500

set -wg window-status-format " #I #W " # 狀態欄窗口名稱格式
set -wg window-status-current-format " #I:#W#F " # 狀態欄當前窗口名稱格式(#I:序號,#w:窗口名稱,#F:間隔符)
set -wg window-status-separator "" # 狀態欄窗口名稱之間的間隔
set -wg window-status-current-style "bg=red" # 狀態欄當前窗口名稱的樣式
set -wg window-status-last-style "fg=red" # 狀態欄最后一個窗口名稱的樣式

set -g message-style "bg=#202529, fg=#91A8BA" # 指定消息通知的前景、后景色
開啟256 colors支持

默認情況下,tmux中使用vim編輯器,文本內容的配色和直接使用vim時有些差距,此時需要開啟256 colors的支持,配置如下。

set -g default-terminal "screen-256color"

或者:

set -g default-terminal "tmux-256color"

或者啟動tmux時增加參數-2

alias tmux="tmux -2" # Force tmux to assume the terminal supports 256 colours
關閉默認的rename機制

tmux默認會自動重命名窗口,頻繁的命令行操作,將頻繁觸發重命名,比較浪費CPU性能,性能差的計算機上,問題可能更為明顯。建議添加如下配置關閉rename機制。

setw -g automatic-rename off
setw -g allow-rename off
去掉小圓點

tmux默認會同步同一個會話的操作到所有會話連接的終端窗口中,這種同步機制,限制了窗口的大小為最小的會話連接。因此當你開一個大窗口去連接會話時,實際的窗口將自動調整為最小的那個會話連接的窗口,終端剩余的空間將填充排列整齊的小圓點,如下所示。

為了避免這種問題,我們可以在連接會話的時候,斷開其他的會話連接。

tmux a -d

如果已經進入了tmux會話中,才發現這種問題,這個時候可以輸入命令達到同樣的效果。

`: a -d

腳本化的Tmux

tmux作為終端復用軟件,支持純命令行操作也是其一大亮點。你既可以啟用可視化界面創建會話,也可以運行腳本生成會話,對于tmux依賴者而言,編寫幾個tmux腳本批量維護會話列表,快速重啟、切換、甚至分享部分會話都是非常方便的。可能會有人說為什么不用Tmux Resurrect呢?是的,Tmux Resurrect很好,一鍵恢復也很誘人,但是對于一個維護大量tmux會話的用戶而言,一鍵恢復可能不見得好,分批次恢復可能是他(她)更想要的,腳本化的tmux就很好地滿足了這點。

腳本中創建tmux會話時,由于不需要開啟可視化界面,需要輸入-d參數指定會話后臺運行,如下。

tmux new -s init -d # 后臺創建一個名稱為init的會話

新建的會話,建議重命令會話的窗口名稱,以便后續維護。

# 重命名init會話的第一個窗口名稱為service
tmux rename-window -t "init:1" service

現在,可以在剛才的窗口中輸入指令了。

# 切換到指定目錄并運行python服務
tmux send -t "init:service" "cd ~/workspace/language/python/;python2.7 server.py" Enter

一個面板占用一個窗口可能太浪費了,我們來分個屏吧。

# 默認上下分屏
tmux split-window -t "init:service"
# 切換到指定目錄并運行node服務
tmux send -t "init:service" "cd ~/data/louiszhai/node-webserver/;npm start" Enter

現在一個窗口擁有上下兩個面板,是時候創建一個新的窗口來運行更多的程序了。

# 新建一個名稱為tool的窗口
tmux neww -a -n tool -t init # neww等同于new window
# 運行weinre調試工具
tmux send -t "init:tool" "weinre --httpPort 8881 --boundHost -all-" Enter

另外新建窗口運行程序,有更方便的方式,比如使用 processes 選項。

tmux neww-n processes ls # 新建窗口并執行命令,命令執行結束后窗口將關閉
tmux neww-n processes top # 由于top命令持續在前臺運行,因此窗口將保留,直到top命令退出

新的窗口,我們嘗試下水平分屏。

# 水平分屏
tmux split-window -h -t "init:tool"
# 切換到指定目錄并啟用aria2 web管理后臺
tmux send -t "init:tool" "cd ~/data/tools/AriaNg/dist/;python -m SimpleHTTPServer 10108" Enter

類似的腳本,我們可以編寫一打,這樣快速重啟、切換、甚至分享會話都將更加便捷。

開機自動啟用Web服務器

開機自動準備工作環境是一個很好的idea,但卻不好實現。對于程序員而言,一個開機即用的計算機會節省大量的初始化操作,特別是前端工程師,本地常常會啟用多個服務器,每次開機挨個啟動將耗時耗力。為此,在遇到tmux之前,我常常拖延重啟計算機的時機,一度連續運行Mac一月之久,直到它不堪重負。

有了tmux腳本化的基礎,開機自動啟用web服務器就不在話下了,接杯水的時間,計算機就重啟恢復了滿血。如下是操作步驟:

首先,上面的tmux腳本,可以合并到同一個文件中,指定文件權限為可執行,并命名為init.sh(名稱可自取)。

chmod u+x ./init.sh

然后,打開 系統偏好設置 - 用戶與群組 - 登錄項,點擊添加按鈕+,選擇剛剛保存的init.sh腳本,最終效果如下:

至此,Mac開機將自動運行 init.sh 腳本,自動啟用web服務器。

完成了上面這些配置,就真正實現了一鍵開機。

最后,附上我本地的配置文件 .tmux.conf,以及啟動腳本 init.sh。

版權聲明:轉載需注明作者和出處。

本文作者: louis

本文鏈接: http://louiszhai.github.io/20...

相關文章

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88939.html

相關文章

  • tmux的超絕便利

    摘要:服務器的任務不間斷運行,就是利用了的特性。超絕常用操作快捷鍵參考。我的配置如下基礎設置前綴綁定啟用鼠標選中窗口將快捷鍵設置為模式 服務器的任務不間斷運行,就是利用了tmux的特性。就是說,一般ssh是斷開就會停止所有之前連接ssh期間運行的所有processes,而tmux的核心業務不在于把屏幕分成幾塊好看,而是它能保存session!而且還能多端實時直播session! 了解tmux...

    dunizb 評論0 收藏0
  • 使用AMD CPU,3000美元打造自己的深度學習服務器

    摘要:本文作者詳細描述了自己組裝深度學習服務器的過程,從主板電源機箱等的選取到部件的安裝,再到服務器的設置,可謂面面俱到。注本文旨在討論服務器設置及多用戶協作,部件組裝和軟件安裝過程是關于創建自己的的文章的簡化版本。本文作者詳細描述了自己組裝深度學習服務器的過程,從 CPU、GPU、主板、電源、機箱等的選取到部件的安裝,再到服務器的設置,可謂面面俱到。作者指出,組裝者首先要弄清自己的需求,然后根據...

    Vultr 評論0 收藏0

發表評論

0條評論

Half

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<