Pages

Friday, March 16, 2007

shell buffer in vim

之前一直在想,如果可以在寫 python script 時同時開個視窗測試執行結果,應該會方便很多吧。在 emacs 中可以開個 shell buffer 直接使用,不過 vim 中好像沒有這樣的功能。雖然有 ":sh" 指令可以用,可是會把整個環境直接切換到 shell prompt 底下,沒辦法只出現在某一個 window。到官網找了一下,發現有兩個類似的 script:

vimsh 需要在編譯時加入 python support,雖然功能比較完整,不過在一些環境不太方便,所以後來選了 Bexec。安裝方式相當簡單,因為是 VimBall 的格式,只要用 vim 打開下載的 vba 檔,輸入 ":so %" 就可以了。

使用上相當簡單,因為它主要是根據 shebang 來動作,所以第一行一定要加上執行的程式名。接著在 normal mode 輸入 "\bx" 就會自動建立新的 window,並顯示執行後的輸出,內容修改後只要再輸入一次就可以直接更新。不過在有檔案的情形下,它會執行檔案內容,而不是 buffer 內容,記得存檔後再執行。在 visual mode 的話,會執行 buffer 中被選取的部份,測試部份程式碼時相當方便。

要關掉 output window 的話可以用 "\bc" 或 vim 的 window command 來關。不過我在測試的時候發現只要一關掉 output window,以後再開啟的 output window 都關不掉了。查了一下原始碼看不出個所以然,所以修改了一下,讓它只關掉 window,而不刪除 buffer。另外我也加了一個切換用的函式,所有修改如下:

@@ -404,13 +404,18 @@ " Close/Delete the output window/buffer. " function! BexecCloseOut() - silent! exec "bdelete! ".s:bexec_outbufname +" silent! exec "bdelete! ".s:bexec_outbufname + let l:outBuf = bufwinnr(s:bexec_outbufname) + exec l:outBuf . "wincmd w" + exec "wincmd c" endfunction

+let s:isRunBufOpen = 0 " " Wrapper function for visually selected text execution. " function! BexecVisual(...) range + let s:isRunBufOpen = 1 call <SID>BexecDo([a:firstline, a:lastline]) if g:bexec_rehighlight == 1 " Rehighlight selection @@ -422,5 +427,22 @@ " Wrapper function for normal buffer execution. " function! Bexec(...) + let s:isRunBufOpen = 1 call <SID>BexecDo() endfunction + + +" +" Toggle output buffer +" + +function! ToggleRunBuf() + if s:isRunBufOpen == 0 + call Bexec() + else + call BexecCloseOut() + let s:isRunBufOpen = 0 + endif +endfunction

最後只要在 .vimrc 中加上 key binding 就可以方便使用了:
nmap <silent> <unique> <F7> :call ToggleRunBuf() <CR> nmap <silent> <unique> <F8> :call Bexec() <CR> vmap <silent> <unique> <F8> :call BexecVisual() <CR>
除了 shebang 外,也可以根據 file type 來執行對應的 filter,只要修改 bexec.vim 中的 custom filter 定義就可以了。例如針對 html,我就設定了 "w3m -dump" 這個指令,以後就可以直接在 vim 中預覽最後的結果了。當然 txt2tags 文稿也可以,只要把 output 設為 stdout 就好了。比較可惜的是 filter 只能接檔名,不能接受 stdin 的資料,不然就可以串接很多個 filter 了。(是可以改,但很多程式不接受 stdin...想來想去沒找到好一點的改法)

有空再來試試 vim 和 debugger 的整合,在 vim 官網上有找到幾個 script,試用後再來報告。


This article was originally posted on this site.

No comments:

Post a Comment