2013-07-10

透過 tmux 與 tslime 建立連結 Vim 與 REPL 的開發環境

名詞解釋


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歲就懂的事」。

沒有留言:

張貼留言