名詞解釋
tmux:terminal multiplexer
What is a terminal multiplexer? It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal. And do a lot more.簡單講就是可以讓你把一個 terminal 畫面變成很多個,然後在其中切換。類似的 tool 還有 screen,不過我都用 tmux,覺得他比較強。
REPL:read-eval-print loop
A read–eval–print loop (REPL) is a simple, interactive computer programming environment.簡單講就是那些可以 interactive 下指令跑的 language shell,ex:python, perl, node, bash。
所以我們要解決的是什麼問題
舉例來說,當我們在寫一個 python script 時,可能會想知道某段程式,某一行寫的對不對,是不是如我們想的,甚至是某個 regular expression,想要馬上測測看是不是真的能 match 到想要的東西。這時候我們就要從 editor 的環境切換到 REPL,在互動的環境中執行那些 code,然後看結果如何。
透過 tmux,我們可以把畫面切成兩塊,一邊是 editor,另一邊是 REPL,只要把 code 從 editor 複製到 REPL,就可以兩邊對照,不需要進進出出,造成大腦多餘的 context switch。
但是這樣還是要手動複製貼上,利用 Vim plugin tslime,就可以簡單的把這段處理掉。
設定與使用方式
我的 tmux 設定檔在這邊,主要是把 prefix 設成 <C-A> (Ctrl + A),讓他跟 screen 一樣,方便無痛轉換,以及分割 key mapping,讓他跟 Vim 的概念類同,用起來比較直覺。
<C-A> v:vertical split
<C-A> s:horizontal split
tslime 的部份用 vundle 裝起來就好,然後在 .vimrc 裡寫
vmap <C-c><C-c> <Plug>SendSelectionToTmux
nmap <C-c><C-c> <Plug>NormalModeSendToTmux
nmap <C-c>r <Plug>SetTmuxVars
使用時,先用 tmux 切一塊出來,進入 REPL,例如圖中的 2、3 分別是 nodejs 跟 python 的。接著在 Vim 中按 <C-c> r,他會提示你要跟 tmux 的哪塊連結,這時候有 tab auto complete。tmux 是三層的架構,session / window / pane,以我圖中為例,左下角 > 0 < 表示 session = 0,0:vim* 表示 window = 0 (這例子有點爛 XD),如果切割比較複雜的話,pane 較不直覺,可以用 <C-a> q 顯示 (或是用 <C-a> ? 列出所有的 key binding,找一下 display panes)。
設定好後,在 Vim normal mode 或是 visual mode 按 <C-c> <C-c> 就可以把那行或是選取區間的 code 丟到設好的那塊 tmux,也就是 REPL 的環境。
大功告成,我現在都用這樣的環境在寫 shell script、python、nodejs,超方便,應該要列成「真希望我20歲就懂的事」。
沒有留言:
張貼留言