Archive for the 'vim' Category

highlight GTK+ APIs in vim

找到一個方便的套件,順便抱怨一下在 debian 遇到的怪異相依性問題 Read more »

Using Vim as a syntax-highlight pager

最近在 Debug 程式時總覺得之前弄出來的 output highlighter 不太夠用,雖然可以很方便標出一些關鍵字,但規則一多就得串一大堆,效率不彰。不曉得腦筋怎麼轉的,突然想到 Vim 應該可以好好利用一下… Read more »

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,試用後再來報告。

歌詞加上 LaTeX 的斷行記號

自從幾年前改用 LaTeX 撰寫筆記後,我將大部份的文書編輯需求都慢慢移植過去,連歌詞的記錄也是用 LaTeX 產出精美的 PDF 文件。不過比較麻煩的是歌詞通常都是一段一段的,我不習慣通通串成一行,所以從網路上找到的歌詞都要手動加上斷行,不然產生出來的 PDF 內容會全部擠在一起。

其實也不是沒想過寫個程式來處理,不過我有時候會在 Windows 上作業,還要弄個跨平台的程式頗麻煩 (就算是 script 還是得裝 interpreter 阿…)。剛剛有點受不了了,就研究一下能不能直接在 vim 裡處理掉。

vim 雖然也有很強的文字處理功能,不過因為它的 regex 跟我不太熟 (我比較熟 perl 的…),所以一直不太想用它來處理文字。剛剛翻了一下 help 終於找到我要的東西了,我的需求很簡單:在每個段落中的最後一行除外,每一行的行尾都加上 \\,例如

line1
line2
line3

變成

line1\\
line2\\
line3

要用 vim 在行尾加個東西是不難,不過一直不知道怎麼在 vim 中做判斷,不過知道語法後就很容易了,我可以直接把 perl 的語法轉成 vim 的語法使用:

:%s/\(^[^\\]\+\)\n\([^\r]\)\@=/\1\\\\\r/

這個命令有略過開頭是 \ 的 LaTex 指令,如果不需要的話修改一下就可以了。

其實簡單一點的話也可以把歌詞丟進 verbatim 環境,不過有時候我需要在日文歌詞加上 ruby annotation,一丟進 verbatim 就破功了….(最主要還是為了日文歌詞,因為我幾乎只聽古典樂和 ACG 歌曲)