跳過導覽列

O3noBLOG

A Happy(?)Designer ~~

VIM

貳月 28

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,還要自己做個鏈結。

壹月 07

Screen 下 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 自動單元測試」 全文 拾貳 26

javascript on vim

因為現在主要都是在寫 javascript 為主,所以這兩天調整Vim主要目標都是為了 javascript,這篇整理一下使用的 plugin 和相關設定,不過在開始前,請先把 Vim 升級到 7.2,套件沒有的話自己編譯也可以。

syntax/indent

Vim 雖然有內建支援 javascript 的縮排和語法標籤,不過另外都有人維護比較完整的版本,而且不只一種,我沒詳細比較,只是挑看起來比較有在維護的:

照說明把檔案放到正確的位置即可,另外雖然有jQuery 的 syntax,不過我安裝後發現會和The NERD Commenter衝突,而且看一下內容覺得也沒做的很好,就沒用了。縮排的部份也有人是用外部程式來處理,詳細可以vim-taiwan上的討論,我目前是還沒覺得有需求。

閱讀 「javascript on vim」 全文 拾貳 25

htmlcomplete#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 ,我的就是裝完就可以,所以沒對這部份下去研究,如果有人跑不起來可以看看是不是這方面的問題。

玖月 08

Vim 儲存完 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 檔。

參月 23

vim的自動完成

我食言了,上一篇文章發完後,我還是一直在搞vim的設定,基本上都是在弄自動完成的部份,我是很希望弄到像Visual Studio新版那樣,邊打字選項就會邊過濾,物件的結構程式也都會知道,要拿物件的屬性時,自動完成也能正確顯示選擇,就這樣弄了好一陣子,昨天晚上我終於成功了,不過又遇到syntax complete在windows會出錯的奇怪現象,一直搞到凌晨四點,連CLANNAD都忘了看還是沒有解決,一直到今天才成功迴避這個錯誤。

現在我vim關於自動完成相關的plugin有四個:supertabsnippetsEmuOmniCppCompletionautocomplpop。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,這些東西已經能滿足我目前的大部分需求了,應該好一陣子不會修改設定,接下來需要記住多些指令才行。

此類別所有文章


其它資訊

關於本網站

本網站是O3(othree)的個人部落格,主要內容為網路標準、網頁設計,穿插些ACG心得和敗家紀錄,如果需要聯絡我請寄信到

Google Friend Connect

分類彙整

我在看什麼

訂閱本網誌

貼紙

時間がない


認證、授權

XHTML, CSS,WCAG,創用CC 姓名標示