vimrc 的 onload
vimrc 會比任何 plugin 都還要先執行,所以如果有什麼工作是想要在 plugin 讀完後才做的,就不能直接寫在 vimrc 裡面,以我的例子,我想要在某些 plugin 有安裝,該 plugin 的命令確實存在的話,才去另外做這些命令的 mapping ,例如:
if exists(":Align")
com! -bang -range -nargs=* A <line1>,<line2>call Align#Align(<bang>0,<q-args>)
endif這段程式直接放在 vimrc 裡面的話, if 判斷都不會成立,所以我的作法是丟到 function 裡面,然後放到VimEnter這個 auto command 的事件執行:
function AfterStart ()
" plugin commands
if exists(":Align")
com! -bang -range -nargs=* A <line1>,<line2>call Align#Align(<bang>0,<q-args>)
endif
endfunction
autocmd VimEnter * :call AfterStart()
壹月
08
Perl Style RegExp for Vim
今天下午在尋找能讓 Vim 的 Regular Expression 變得好看一點的方法,因為實在太多斜線了,當然直接就把目標鎖定在 perl 的語法,一開始找到一個vim tip有建議用perldo,不過編譯時要把+perl弄起來,使用上也不是很好用,而且不能搜尋,只能做取代,雖然有人寫了 function來搜尋,不過實際測試之後離方便使用還有些距離。c9s還有建議我用very magic看看,結果還是不夠滿意,後來換成找日本那邊,終於找到eregex.vim這個 plugin ,他的作法是把 perl/ruby 的 regexp 語法用 function 轉成 vim 的 regexp 語法,所以問題少很多,預設會把 S(大寫S)替換成用 perl/ruby 的 regexp 語法來搜尋搜尋取代的指令,使用方法和原來 s(小寫S)的都一樣,另外單純搜尋的部分有 :M/ 這個命令,也可以 map 到原來的 / 上:
nnoremap / :M/使用上就和原來幾乎完全一樣了,超棒的~
順帶一提,Ubuntu上要編譯出 +perl 的功能要確定一下 libperl.so 在不在,像我的系統就只有 libperl.so.5.8,還要自己做個鏈結。
壹月 07Screen 下 Vim F1~F4 沒辦法正常 map
剛剛遇到的問題,好像是我的環境才會,不過如果有遇到的話就把下面這段 code 加到 vimrc 裡面吧,記得放在 map 前。
" Screen fix
if &term =~ '^screen'
set t_k1=^[[11~
set t_k2=^[[12~
set t_k3=^[[13~
set t_k4=^[[14~
endif
拾貳
31
簡單的 javascript 自動單元測試
前幾天弄完JSLint.vim後,就對 server side javascript 產生了一些興趣,還抓了v8 引擎來用,於是就想到之前想弄很久的自動單元測試,想說要跑QUnit,不過 QUnit 雖然獨立於 jQuery 了,但還是要在瀏覽器環境下才能執行,純 javascript engine 還少了 DOM 和 BOM,就是說它需要 document, window 這些物件,找了一下發現 John Resig 有弄env.js這個專案,就是要在 js shell 裡面做出瀏覽器的環境,不過問題是目前只能跑在Rhino下,因為他是 java based ,可以在 javascript 裡面寫 Java ,所以可以做很多壞事,但是其他的 js shell 沒辦法這樣跑, John Resig 好像有想要 port 成 python + v8 的版本,不過不知道有沒有成功,因為也沒放出。
閱讀 「簡單的 javascript 自動單元測試」 全文 拾貳 26javascript on vim
因為現在主要都是在寫 javascript 為主,所以這兩天調整Vim主要目標都是為了 javascript,這篇整理一下使用的 plugin 和相關設定,不過在開始前,請先把 Vim 升級到 7.2,套件沒有的話自己編譯也可以。
syntax/indent
Vim 雖然有內建支援 javascript 的縮排和語法標籤,不過另外都有人維護比較完整的版本,而且不只一種,我沒詳細比較,只是挑看起來比較有在維護的:
- JavaScript syntax : Better JavaScrirpt syntax support
- Javascript Indentation : Indentation for Javascript
照說明把檔案放到正確的位置即可,另外雖然有jQuery 的 syntax,不過我安裝後發現會和The NERD Commenter衝突,而且看一下內容覺得也沒做的很好,就沒用了。縮排的部份也有人是用外部程式來處理,詳細可以vim-taiwan上的討論,我目前是還沒覺得有需求。
閱讀 「javascript on vim」 全文 拾貳 25htmlcomplete#CompleteTags 的 bug
今天又在玩 vim 自動完成時發現的,網路上也有找到一點點情報,不過資料實在很少,我花了不少時間測試找出會發生問題的狀況,這個 bug 是在使用autocomplpop時,游標放到 class=" or id=" 這兩個字串後會有錯誤訊息 (line 304, E121: Undefined variable :classlines)。網路上找到有人回報給 acp.vim 作者,日本那邊也有人hack acp.vim 來避開這個問題,不過其實問題不在 autocomplpop,而是 vim 內的 htmlcomplete 的問題,這個 function 位置在 $VIMRUNTIME/autoload/htmlcomplete.vim ,上次更新是 2006 年了,之後回報 bug 會不會有人修還不知道XD。
閱讀 「htmlcomplete#CompleteTags 的 bug」 全文Zen Coding on vim
前兩天試了一下,還蠻厲害的,不過不知道是不是我現在的設定有點亂,所以沒辦法 tab 觸發自動完成,一定要按 Ctrl + E,另外就是目前只支援 HTML 的樣子,我看原始碼發現判斷檔案格式的函式直接回傳 "HTML",不過這也還好,因為 CSS 有其他自動完成可以用,zen-coding 在 CSS 處理上沒特別強,但是 HTML 要到這樣厲害目前沒其他方案,下面記錄一下安裝方法。
先到這串討論抓最下面的 zencoding.vim 和 zencoding_vim.py 兩個檔案,放到 ~/.vim/plugin/ 裡,再來到zen-coding 下載頁抓 Zen Coding for TextMate v0.3.1.zip, TextMate.Zen.HTML.1.3.1.zip, TextMate.Zen.CSS.1.3.1.zip 三個檔案一樣解開放到 ~/.vim/plugin/ 裡面,這樣就可以了,測試方法就是隨便打個 css selector 然後按 Ctrl+E ,另外記得 selector 裡面不要有空白,這個 plugin 其實是用 Vim 跑 python ,所以 Vim 要先支援執行 Python Script ,我的就是裝完就可以,所以沒對這部份下去研究,如果有人跑不起來可以看看是不是這方面的問題。
玖月 08Vim 儲存完 JavaScript 檔案後自動用 yuicompressor
因為每次存完 js 檔案還要 Ctrl+Z ,然後手動跑 yuicompressor 才能去看效果,有問題還要 fg 回來繼續改,所以我剛剛終於受不了去研究 vim script 了
function Js_css_compress ()
let cwd = expand('<afile>:p:h')
let nam = expand('<afile>:t:r')
let ext = expand('<afile>:e')
if -1 == match(nam, "[\._]src$")
let minfname = nam.".min.".ext
else
let minfname = substitute(nam, "[\._]src$", "", "g").".".ext
endif
if ext == 'less'
if executable('lessc')
cal system( 'lessc '.cwd.'/'.nam.'.'.ext.' &')
endif
else
if filewritable(cwd.'/'.minfname)
if ext == 'js' && executable('closure-compiler')
cal system( 'closure-compiler --js '.cwd.'/'.nam.'.'.ext.' > '.cwd.'/'.minfname.' &')
elseif executable('yuicompressor')
cal system( 'yuicompressor '.cwd.'/'.nam.'.'.ext.' > '.cwd.'/'.minfname.' &')
endif
endif
endif
endfunction
autocmd FileWritePost,BufWritePost *.js :call Js_css_compress()
autocmd FileWritePost,BufWritePost *.css :call Js_css_compress()
autocmd FileWritePost,BufWritePost *.less :call Js_css_compress()
把上面的指令加到 vimrc 檔裡面就可以了,前兩個分別是會把 blah.src.js, blah_src.js 轉成 blah.js 用的,第三行則是會把 blah.js 檔轉成 blah.min.js ,慎用之~~
加上第四行,會先檢查 blah.min.js 存不存在,存在的話才用 yuicompressor ,另外 code 在 gist 也貼了一份。
改版成 function 形式了~~
更新:支援 less,有 Google Closure 的話會先用它壓縮 js 檔。
參月 23vim的自動完成
我食言了,上一篇文章發完後,我還是一直在搞vim的設定,基本上都是在弄自動完成的部份,我是很希望弄到像Visual Studio新版那樣,邊打字選項就會邊過濾,物件的結構程式也都會知道,要拿物件的屬性時,自動完成也能正確顯示選擇,就這樣弄了好一陣子,昨天晚上我終於成功了,不過又遇到syntax complete在windows會出錯的奇怪現象,一直搞到凌晨四點,連CLANNAD都忘了看還是沒有解決,一直到今天才成功迴避這個錯誤。
現在我vim關於自動完成相關的plugin有四個:supertab、snippetsEmu、OmniCppCompletion、autocomplpop。supertab是用Tab鍵觸發自動完成功能用的,本來要使用Omni Auto Completion要先按Ctrl+X再按Ctrl+O,很不方便。snippetsEmu則是用關鍵字完成一段預先設定的內容,舉例來說,我只要輸入"doc4s",再按Tab就可以插入完整的HTML 4 Strict文件宣告,這功能可以減少很多重複的工作,像是if迴圈、for迴圈都可以用這個功能來快速完成。這兩個我之前都有介紹過,而剩下的兩個剛好就一個完成我的一個需求,OmniCppCompletion讓我可以在編寫物件導向程式時有更完整的自動完成功能,autocomplpop讓自動完成的選項在你輸入時就自動出現,並且隨著你輸入的內容不斷過濾選項。
閱讀 「vim的自動完成」 全文 貳月 29我現在的Vim設定
這兩三天都沒在寫code,反而又再次弄起了Vim設定,一開始的目標是讓之前的Tab鍵自動完成的功能和snippet(想知道snippet是什麼的可以看看c9s的在 Vim 上使用 Slippery Snippet這篇文章,裡面有一段影片),雖然沒學過Vim的script,不過我還是下去翻snippetEmu的原始碼,結果發現到它會判斷有沒有安裝supertab這個plugin,我才發現原來supertab就是Tab鍵觸發自動完成,把它裝起來就達成我的需求,一下子省事不少。之後我又升級了snippetEmu到最新版,還裝了安裝新版snippetEmu所用的vbs檔所需要的Vimball外掛,另外之前就會用到的還有The NERD Commenter,這些東西已經能滿足我目前的大部分需求了,應該好一陣子不會修改設定,接下來需要記住多些指令才行。
