2010年5月19日 星期三

[Linux] screen教學與bindkey設定用法

聽說常在用Linux的老手老早都知道使用screen這個工具,我這新手當然是最近看學長用才知道的,於是花了點時間研究和整理一下他的使用方法。

screen的全名叫做(full-screen window manager),是在Linux or BSD上一個很好用的工具,可以讓你在一個terminal下開啟多重視窗執行,讓你只要靠一個putty/pietty視窗就可以同步地處理很多的事情,視窗彼此的切換又很方便迅速,有點像瀏覽器的「分頁」功能一樣。

例如說你可以開一個視窗正在compile程式,另開一個視窗開vim看code,再開第三個視窗連ftp抓一個大檔,最後再開一個視窗用偷偷telnet連BBS逛PTT這樣(最後一個上班不要亂用,雖然screen也是超級好用的BBS「掛站」利器),視窗間可以隨時用熱鍵切換,彼此卻又運作順暢互不干擾。

我覺得screen對我來說最無可取代的強大好處有三點:
  1. 提供多視窗工作
  2. 提供離線繼續工作
  3. 提供終端機編碼轉換
第一點剛剛講了,第二點是說,你在screen模式下的每個視窗畫面和進度都會被存起來,離開時只要用「detach」不要真正exit,所有process就會都還在背景執行中,你甚至可以logout帳號,下次再登入再把screen「叫起來」(正式點的動詞叫做resume session),就可以繼續剛剛的工作,例如你在公司執行上述的四個視窗,累了就按Ctrl+a+d 「detech」收工回家,回家再putty連到主機輸入screen -rd,剛剛vim看到哪一行,BBS和妹聊到哪一句,通通輕鬆回復原來的樣子!至於第三點後面會提到......

screen的下載及安裝:

這部份省略,Linux版本眾多族繁不及備載,官方網站在這裡,請查明自己的OS後自行去ftp安裝相對應的版本,安裝指令不外乎打rpm或者tar解壓縮後make、make install之類的那幾招。(如果不會這些,你大概也不可能是會用Linux的人,更不需要這工具了...)

screen操作簡易教學:

進入與脫離screen的指令是:
  • screen //第一次執行screen
  • Ctrl a+d //關閉screen(至背景),也就是detached
  • screen -rd //重新回到(resume)剛剛的screen 裡
  • exit //關閉視窗(若只剩一個視窗則為關閉screen)
在進入screen的世界後,都是以熱鍵來做操控,他的原生熱鍵都是以Ctrl+a開始的,(以C-a 代表,C-a c 代表按住 Ctrl 鍵不放再按 a 鍵,然後放開按 c 鍵)最基本必會的幾個熱鍵是:
  • C-a c 或 C-a C-c #開啟新的視窗,並同時切換到這個新的視窗
  • C-a n 或 C-a C-n 或 C-a (space) #切換到下一個視窗(0->1 1->2 ...)
  • C-a p 或 C-a C-p #切換到上一個視窗(1->0 2->1 ...)
  • C-a C #清除目前的視窗內容
  • C-a d 或 C-a C-d #脫離(detach)目前的 screen ,並放到背景執行
  • C-a ? 或 C-a C-? #熱鍵查詢

其實只要知道上面這些,實際再按個兩三下感覺一下,馬上就上手,可以使用愉快了。當然還有很多很多熱鍵,不過光上面的那些我都覺得很難按了,什麼Ctrl+a放掉再按這麼彆扭的按法,又不是在格鬥遊戲輸入豪華連續技。好在他有提供bindkey的功能,也就是可以自定義熱鍵,這需要動到screen的設定檔,也就是你的安裝目錄下的.screenrc那個檔案,如果你要讓你的screen使用上更加順手和個人化,請接著看下去......

screenrc設定檔教學:(進階設定)

請vim .screenrc修改裡頭的檔案,以下是我的配置,大家可以參考一下:

.screenrc

# Start message
startup_message off

# Set hardstatus always on
hardstatus alwayslastline " %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %M %d %0c:%s "

# Set default encoding using utf8
defutf8 on

# Refresh the display when exiting programs
altscreen on

# Dynamic title
shelltitle '$ |bash'

# Disable vbell
vbell off

# Keboard binding
# bind F11 to move to previous window
bindkey -k F1 prev
# bind F12 to move to next window
bindkey -k F2 next
# bind Alt`~= to screen0~12
bindkey "^[`" select 0
bindkey "^[1" select 1
bindkey "^[2" select 2
bindkey "^[3" select 3
bindkey "^[4" select 4
bindkey "^[5" select 5
bindkey "^[6" select 6
bindkey "^[7" select 7
bindkey "^[8" select 8
bindkey "^[9" select 9
bindkey "^[0" select 10
bindkey "^[-" select 11
bindkey "^[=" select 12
# bind F7 to detach screen session (to background)
bindkey -k k7 detach
# bind F8 to kill current screen window
bindkey -k k8 kill
# bind F9 to create a new screen
bindkey -k k9 screen
# bind F10 to rename current screen window
bindkey -k k; title


由上而下簡介: (#的都是註解請忽略)
第一個是把惱人的screen開啟訊息關掉
第二個是在視窗底下新增一個很好用的狀態列(這很方便!一定要加這行!) (註1)
第三個是強制終端機編碼為utf8 (這樣就能正常看中文字囉!) (註2)
第四個是離開視窗時自動refresh一下螢幕
第五個是支援動態顯示視窗的「標題名稱」(註3)
第六個是把熱鍵操作錯誤時的逼逼聲給關掉
接下來重點來了,就是Keboard bindkey,也就是自行定義熱鍵,以上那些是我個人喜歡的配置方式,我將熱鍵定義如下:
  • F7 關閉screen(至背景) (相當於C-a d )
  • F8 kill目前screen視窗
  • F9 開一個新的screen視窗 (相當於C-a c)
  • F10 將目前screen視窗「標題名稱」重新命名
  • F11 往前切換視窗 (相當於C-a p)
  • F12 往後切換視窗 (相當於C-a n)
  • Alt+` 切換至screen 0
  • Alt+1 切換至screen 1
  • Alt+2 切換至screen 2
    ...…(依此類推)
  • Alt+= 切換至screen 12

當然這是我喜歡的配置方式,你看懂後也可以自行變化對應按鈕,總之自己按的順手就好!

最後我再分享一個screen應用的最終密技,那就是——「分割視窗」!熱鍵是「Ctrl + a  S 」(大寫的 S唷,也就是Split的意思),螢幕就會切成兩半了,此時再按「Ctrl + a  tab」就可以切換focus的視窗,接著再「Ctrl + a  c」 建立新視窗,或著以號碼跳選其它視窗。(恕沒有圖解教學,請自行操作領會)分割視窗有啥好處呢?相信常在trace code的人都能感受,有時常看某個.c檔就想開著他refer 到 header include 的檔案去查找macro定義或struct宣告之類的,或者是兩個檔案做diff比對,此時若能分割視窗就方便多啦!(雖說VIM也支援分割視窗啦!)



註1:那行狀態列等於是瀏覽器上的分頁列那樣,強烈建議常駐,可以很清楚的知道你身處於哪個screen,至於那些""內百分比的東西是自定義的風格(如標題格式、顏色...等等)我的設定是走藍色低調風,還在右下角加了日期和時間,網路上有各式各樣的風格分享。例如:

第一種

caption always "%{= wk} %{= KY} [%n]%t @ %H %{-} %= %{= KR} %l %{-} | %{= KG} %Y-%m-%d %{-} "
hardstatus alwayslastline " %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %0c:%s "

第二種

caption always "%{=u .G} %-w%<%{=ub .y}%n %t%{=u .G}%+w "
hardstatus alwaysignore
hardstatus alwayslastline "%{= .K} [%l]%<%=%{= .W}@%H %=%{= .y} %Y/%m/%d%{= .m} %0c:%s "

第三種

caption always "%{=u .G} %-w%<%{=ub .y}%n %t%{=u .G}%+w "
hardstatus alwaysignore
hardstatus alwayslastline "%{= .K} [%l]%<%=%{= .W}@%H %=%{= .y} %Y/%m/%d%{= .m} %C %A"

第四種

caption always "%{=u .G} %-w%<%{=ub .y}%n %t%{=u .G}%+w "
#hardstatus alwayslastline "%{= wk} %{by} %H %{wk} | %-Lw%{kw}◣%{= g}%n%f* %t%{wk}◤%{wk}%+Lw%< %= %{kw}◣%{= R} [%m/%d %c] %{-}"

顏色那些參數可以看這篇教學(或者man screen),請自行更換調整囉!

註2:這個也就是上述提到的第3個好處,你也可以default設成big5,端看你的終端機是什麼格式的,或者你也可以big5 的 terminal裡看utf8,或在utf8的terminal裡看big5,(好像在念rap...),可以設個熱鍵如下:

terminal使用big5的:

# C-a b --(switch to)--> view big5 data
bind b encoding big5 big5
# C-a u --(switch to)--> view utf8 data
bind u encoding utf8 big5

terminal使用utf8的:

# C-a b --(switch to)--> view big5 data
bind b encoding big5 utf8
# C-a u --(switch to)--> view utf8 data
bind u encoding utf8 utf8


註3:關於動態支援標題名稱的設定(例如開VIM編輯wtf.c檔案,標題就自動換成wtf.c),這是進階中的進階用法,小弟我也還在參透中,有興趣的可以看這一篇教學文這一篇教學文,在此就不敢掠美了。

延伸閱讀:

沒有延伸啦!這篇已經盡我所能講完screen的用法囉,很多高手都有分享自己的screenrc設定方法,大家可以自行google,其餘的東西,請自行問「男人」,也就是man screen去發掘囉!


2010/06更新:我又寫了一篇 [Linux] screen進階用法 囉!有興趣的看官請一起打包帶走,謝謝!

3 則留言:

  1. 真的很棒 用了幾年的screen 其實對profile還沒這麼熟哩

    回覆刪除
  2. 哈哈,謝謝你的留言鼓勵,小弟我最近又悟出了一些screen操作的心得,有空會再PO一篇,歡迎常來逛逛阿~

    回覆刪除
  3. 我上了原廠REDHAT RHCA 認證課程才接觸到screen
    還是搞不太清楚
    screen -t CONSOLE 0 <----一下這指令視窗就凍結了

    回覆刪除

寫在參加309反核遊行之前

圖片出自:日本藝術家 奈良美智(Yoshitomo Nara) 的經典反核作品 一開始,先來聽首好聽的【 棉花糖 katncandix2 - 深黑的河 】 吧! 我一直以來都犯個毛病,就是有時會過於理性,相信「證據會說話」,換句話說就是愛當「認真魔人」,...