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。

這個錯誤訊息的發生條件其實很特別,首先 html 的 omnifunc 要設成 htmlcomplete#CompleteTags,就是說你的 vimrc 裡面應該會有一行長成

autocmd FileType html set omnifunc=htmlcomplete#CompleteTags

再來你正在編輯的 html 文件裡面要有 <link rel="stylesheet" /> 這種外連 CSS 檔案的標籤,而關鍵是 href 指到的位置沒有一個可以用的檔案(不存在、無權限讀取都可),然後接下來你在 class=" 或是 id=" 的位置裡面執行了 omni complete (<C-x>, <C-o>) ,當然如果有裝 autocomplpop 的話,這時就會自動幫你跑(2.7 版以後),錯誤訊息也就會自動冒出。

問題發生的原因是,這個 html 自動完成函式會去檢查你的 CSS ,包括外連的檔案,去裡面把 class name, id name 抽出送回作自動完成的選項,不過他有一個動作應該是要檔案可讀才要跑的,卻放到 if 的外面,所以只要把它移過去就好了,錯誤那行 code 是 310 行:

308        endif
309    " We gathered classes definitions from all external files
310    let classes += classlines

把它移到 308 行的 endif 前面就好了:

308        " We gathered classes definitions from all external files
309        let classes += classlines
310    endif