從Tmux 轉到GNU Screen


網上很多地方都說TmuxGNU Screen要好用,不過無意間看到這篇Switching from tmux to GNU Screen之后,我發現GNU Screen的窗口/區域概念更好,至少是更適合我(雖然相對Tmux有不少小缺點)。

優點1: GNU Screen的窗口/區域/布局概念更適合某些場景

Tmux里面的窗口概念是: 程序是跑在pane里面的,每個window可切分成多個pane,一般我們會並行開多個window.這樣每個window多半用於不同的事情.這種方式要把一個window里面的某個pane移動到另外一個windows

GNU Screen的窗口與區域關系更接近Emacs里面buffer與window的關系:

  • gnu screen里面的region相當於tmux里面的pane,而screen的window更類似於跑在tmux pane里面的程序;
  • 與tmux不同的是,一般情況下程序/窗口是隱藏的,每次只把一個程序/窗口切換到當前region來(tmux里面一般情況下所有程序都會在某個window的某個pane里面顯示者,除非有其它pane被最大化導致當前pane被隱藏了)

GNU Screen里面沒有tmux里面的window那樣的東西,它的layout倒是跟tmux的window有點像,雖然我們可以從一個layout切換到另外一個layout,但layout只是region的容器,而不是window的容器,兩個layout里面是可以查看同一個應用(window)的.

不實際操作一下的話,不一定能感受到上面的差異.網上找到兩個圖說明兩者概念的不同,也許對讀者有所幫助(來自Differences between tmux vs screen - Wesley Tanaka )

gnu screen:
gnu screen概念
tmux:
tmux概念

這樣的好處是:

  1. 一旦確定了一個layout,剩下的大部分時候都是切換到不同的程序來工作,而不需要切換到不同程序工作時來回調整當前窗格的大小(因為我們很多時候都想讓當前程序占據比較大的面積,但又未必是全屏-比如一個窗口看代碼,一個窗口調試,還一個窗口查文檔).
  2. 兩個人(或者兩個顯示器)可以attach到同一個session,然后各自工作在自己的"視圖"上(即可以跟不同的程序交互)-之前在windows上用putty連到開發用機的時候,我總找不到一個好方法讓tmux充分利用兩個顯示器(putty最大化不能占據兩個顯示器,自己拖又麻煩,就算拖大了,有時從其它單顯示器機器連上來tmux的寬度又縮回去了)

不過有幾個小地方需要注意:

  1. 在當前region下,切換到一個window時,window不會自動根據當前region大小調整窗口(因為它也有可能在另外一個region里面顯示),需要用 C-a F調整一下.對應命令是 fit (change the window size to the size of the current region).
  2. 要attach到一個session的話,需要用命令screen -r,但一旦這個session已經被attach了,其它客戶端要attach上來,得用screen -x

優點2: zmodem集成

跟遠程機器打交道時比較煩人的一個事情是上傳下載文件,尤其是要傳送文件的源目錄或者目標目錄在一個較深的路徑的時候.zmodem提供一個比較便捷的方法.

至於具體用法,官方的文檔Zmodem - Screen User's Manual講得很語焉不詳,這篇GNU Screen and Zmodem | Adam Monsen 寫得很詳細:

Send a file from the remote host to the local host:

  1. start a Screen session on the local host
  2. configure Screen to “catch” zmodem traffic (CTRL-A:zmodem catch )
  3. execute sz FILE from the command line
  4. hit when Screen brings up the default receive command ( :!!! rz -vv -b -E)
  5. bam, the file is available on the local host!

Send a file from the local host to the remote host:

  1. start a Screen session on the local host
  2. configure Screen to “catch” zmodem traffic (CTRL-A:zmodem catch )
  3. execute rz from the command line (no need to specify filename)
  4. add local filename when Screen brings up the default send command(:!!! sz -vv -b), then hit
  5. bam, the file is available on the remote host!

從描述上來看,從遠端發送一個文件到screen這邊還算比較方便,因為大多數情況下我們在遠端機器上已經進入了文件所在的目錄,只需要直接發起 sz FILE 就可以了,screen接收后就存放在它的"當前目錄";不過從screen發送一個文件就有點不爽,因為這里要輸入待發送文件的全路徑,這里並沒有一個瀏覽文件的功能.

其它小問題

縱向分割

網上很多比較gnu screen和tmux的文章都列了一個理由是gnu screen不支持縱向分割.不過4.2.0版本(Apr/17/2014)已經支持了( /'-v' parameter to 'split' command for vertical splits/ ).

另外有一點提醒一下: 在漫長的4.1.x時代,一些發行版集成了一個第三方補丁來支持縱向分割,當時實現的縱向分割命令是vert_split(而4.2.0版本里面實現的是split -v).如果你的screen不支持split -v,那么可以試試有沒有vert_split這個命令.

鼠標

mousetrack on命令即可開始鼠標支持(用C-a :輸入,或者放入~/.screenrc),開啟后可以用鼠標切換region.

但它沒有tmux的鼠標能力強,不能mouse-select-window的功能(即使你將hardstatus配置為顯示window列表,也不行),也不能mouse-resize-pane

~/.screenrc 里面加入 termcapinfo screen*|term* ti@:te@ 可以讓screen支持用鼠標滾輪來回滾scroll buffer(注意設置此選項需要重啟screen session,而即時通過C-a :來輸入是不行的),但與tmux不同的是它不會自動進入copy-mode, 也就是說需要用C-a[進入copy-mode后鼠標滾輪才有作用. 對於上述配置的詳細解釋請參看Using the scrollwheel in GNU screen - Stack Overflow

Emacs用戶

如果你是emacs用戶,要設置以下幾個選項:

  • escape ^Bb 將熱鍵改為C-b, 按C-b b的時候才向里面的應用程序發送C-b.因為默認的C-a在Emacs和命令行里面用的還是比較多的如果這個
  • vbell off 不想在C-g的時候看到什么閃屏,就設置這個吧
  • defflow auto 不想讓C-s把屏幕鎖住,就需要這個,具體請查看: Flow Control - Screen User's Manual
  • 如果你在Emacs里面用了F12, F9這些功能鍵的話,不要用ubuntu的byobu(除非你願意去修改某一方的快捷鍵)

參考資料

基本入門

gnu screen 與 tmux 比較

速查卡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM