Vim Filename Complete

Vim Filename Complete,

Vim 有一個內建的自動補完功能是針對檔案名稱的,使用的方法是<C-X><C-F>,我目前在維護的 autocomplpop 也有支援這種補完模式,只要輸入./後就會自動幫忙觸發,不過我比較有機會觸發到是在使用 ECMAScript 6 的 import 和 CSS 的 import 時,不過常常就是發現他查看的路徑不太對,不是拿目前編輯檔案的位置做為起點的,研究過後發現是因為 Vim 找檔案的起點是看他的工作目錄($PWD),加上我會使用 ctrlp 這種工具,所以實際上在編輯的檔案通常是不在工作目錄下,對於這個問題,其實我覺得最理想的解決方式是 Vim 應該要提供兩種模式來決定要從那邊開始找,不過目前似乎沒這個計畫,唯一在文件是有提到的是未來可能會支援 path 的設定,理論上,如果有支援的話,應該就可以解決問題了,因為預設的path值包括了.,不過目前還沒有相關時程,就只能自救了。

最簡單的方法,其實就是開啟 autochdir,這個選項打開後就會自動在切換 window 時也更改工作目錄,不過這個選項是為了相容早期系統才提供的,文件也有說可能會和部分 Vim Script 不相容,實際上我也有找到一些不相容的 Vim Script,所以想避免,就搜尋了一下其它可能的解決方法,在 StackOverflow 上有看到一篇,裡面有兩個人提供了解法,第一個是用autocmd,然後在進入 insert mode (在這時候才有機會用到檔名補完的功能)時自動開啟autochdir,離開時自動關閉autochdir,不過這樣的方式(感覺上)還是不太安全,因為還是用到autochdir,所以下面有另外一個方法改用 lcd,作法是改成修改 Key Mapping 的方式,改的 mapping 是./<C-X><C-F>,不過這樣對我來說又不合用,因為我用 autocomplpop 的話,不會真的打<C-X><C-F>,所以基本上觸發不到這事件,所以我就決定把這兩種解法合併起來,改成用autocmd加上lcd

:autocmd InsertEnter * let save_cwd = getcwd() | execute 'lcd %:p:h'
:autocmd InsertLeave * execute 'lcd' fnameescape(save_cwd)

進入 insert mode 時改變該 window 的工作目錄,離開 insert mode 時把工作目錄還原。這是我目前認為影響最小的調整方式,不過其實可能執行一次lcd換工作目錄就夠了,沒深入研究 autochdir 所產生的問題,不過我推測是影響到 Vim Script 建立的 window 的工作目錄,像是 NERD Tree 之類的側邊欄那種,總之目前這樣運作還算正常,接下來就是等 Vim 加上path的支援吧(或是有人送 patch)。