2013年1月23日

使用 tmux 與 tmuxifier 打造 Console 開發環境(比 screen 更棒)

對於 Mac OS X 與 Linux 開發者來說,直接在 Console(或 Terminal)下使用 Command-line 完成工作,才是最高效率的王道。

若要同時可以操作多個 shell,古老但管用的 screen 工具可以派上用場。執行 screen 指令後,使用 [Ctrl+a, S] 可以建立垂直分割的畫面,再用 [Ctrl+a, <TAB>] 切換到第二個畫面,以 [Ctrl+a, c] 就可以建立第二個 shell。

screen 垂直分割

但是如果想要水平分割,就只有某些版本的 screen 可以做到。對於現在的寬螢幕來說,不能水平分割實在很不方便。

更好的替代方案是改用 tmux 工具,它可以輕鬆做到水平分割。

Ubuntu / Debian 安裝方式

sudo apt-get install tmux

Mac OS X + MacPorts 安裝方式

sudo apt-get install tmux

執行 tmux


tmux 會建立一個 server,在 Terminal 執行一次 tmux 指令後,就可以再用 tmux + 參數操作。

例如建立垂直分割:

tmux split-window

執行後會建立新的分割畫面(pane),並自動開啟一個新的 shell。


要在兩個畫面之間切換,需要先按 Ctrl + b 再用上下左右按鍵選擇畫面。

如果已經習慣 screen 的 Ctrl + a,可以參考這篇將熱鍵設定成 Ctrl + a。一般的鍵盤要用同一隻手按 Ctrl + b 比較不容易,所以建議重設這組熱鍵。

接下來再建立一個新的水平分割,加上 -h (horizontal)指令。


每次都要下這些指令很麻煩,所以建議將常用的指令寫成 script,例如建立 tmux-workspace.sh,並將 tmux split-window 等指令都放進去,日後只要直接執行 script 就能自動開啟慣用的工作畫面。

tmux 也提供 layout 的定義,只要按下「Ctrl+a <ESC> 1」,數字 1~5 共有五組預設 layout 可選,可以依照 layout 定義的畫面配置方式重新排列。


更多 tmux 用法可參考這些文章。
  1. 進化版 screen - tmux
  2. tmux cheat sheet
  3. Switching to tmux
  4. Tmux 教學 + Screen 到 Tmux 的無痛轉換

用 tmux 還要搭配 tmuxifier 這個工具,可以讓工作畫面的建立更加方便。

使用 git clone 安裝 tmuxifier

git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier

在 ~/.profile 加入一行設定,讓 tmuxifier 指令自動列入 $PATH 環境變數。

[[ -s "$HOME/.tmuxifier/init.sh" ]] && source "$HOME/.tmuxifier/init.sh"

接下來先檢查是否有 $EDITOR 變數。

echo $EDITOR

如果沒有設定,或想要修改,一樣把設定寫到 ~/.profile。

export EDITOR=vim

這邊指定用 vim 當成預設編輯工具。

重新啟動 shell 讓設定生效。

接下來,可以開始建立 tmuxifier 的視窗設定。

tmuxifier new-window example

這個指令會打開預設編輯器(vim),就可以編輯 example 這個新視窗定義的 script。

    # 可以直接指定某專案的路徑作為預設 Shell 的 Working Directory

    window_root "~/project/example"

    # 設定標題
    new_window "Example"

    # 先建立水平分割 50% 寬度
    split_h 50

    # 後建立垂直分割 50% 高度
    split_v 50

    # 分別在編號 0~2 三個畫面跑指令
    run_cmd "vim" 0
    run_cmd "date" 1
    run_cmd "htop" 2

    # 將游標切換到畫面 0
    select_pane 0

    # 因為主畫面 0 已經進入 VIM,可以對它送出編輯或操作指令
    send_keys "iI Love Vim"

定義好之後先儲存視窗設定。

打開視窗前需要先進入 tmux。

tmux

進入 tmux 之後再利用 load-window 指令打開定義的視窗。

tmux load-window example


所以 tmuxifier 可以很方便地依照個人使用習慣,將打造開發環境所需的畫面配置及功能,先寫在視窗定義裡,日後只要用 load-window 就能快速建立工作環境。

之後想要修改 window 的設定,則利用 edit-window 指令。

tmuxifier edit-window example

以我的 Grails 開發環境來說,使用的視窗定義如下:

  window_root "~/project/codecanaan"                                                                                                                        
  new_window "CodeCanaan"                                                                                                                                  
  split_h 45                                                                                                                                                
  split_v 40                                                                                                                                                
  run_cmd "vim" 0                                                                                                                                          
  run_cmd "grails" 1                                                                                                                                        
  run_cmd "htop" 2                                                                                                                                          
  select_pane 0                                                                                                                                            
  send_keys "\t"                                                

這組設定可以快速建立三個畫面,分別執行 vim、grails、htop 指令,並且利用 \t 打開 Vim Command-T 所提供的檔案搜尋功能,方便在工作環境啟動後,可以快速選擇想要編輯的檔案。


還有最重要的功能,就是 tmux 與 screen 一樣都可以重新 attach 尚未結束的 session。對於有架設 Linux 或租用 VPS 的開發者,只要在主機上利用 tmux 建立好開發環境,就可以隨時 detach 然後結束遠端連線;當下次需要重新上線工作,只要再 attach 就能重新回到繼續運行的畫面。

這個操作流程大概是這樣:
  1. 遠端 ssh 連線登入主機。
  2. 執行 tmux。
  3. 工作完成一段落後,按 Ctrl + b(或 a),再輸入 :detach 離開 tmux。
  4. 這時候已經打開的 tmux 與畫面中的程式仍然在背景運作。
  5. 結束 ssh 連線,收工,睡覺。

回復工作狀態的方法是:
  1. 重新連線 ssh 登入遠端主機。
  2. 使用 tmux attach 指令重新接上 session。
  3. 繼續工作!

結論:tmux 讓你再也回不去了!

1 則留言:

  1. tmux 加上 mosh 不就讓人不知道還有回去這件事...:p

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!