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)。