Vim 檔案名稱補全相對於目前文件

Vim 檔案名稱補全相對於目前文件

維姆,當我處於插入模式並且我想使用文件名完成時,我希望搜尋路徑相對於當前文件,而不是當前工作目錄。例如,如果在插入模式下,我鍵入以下內容:

./^X^F

完成選單顯示了以下位置的文件:pwd,但我寧願看到文件%:p:h列出。

我可以設定一個選項來解決這個問題嗎?

答案1

如果你

:set autochdir

你會得到你想要的行為。但是,如果您需要保留工作目錄(例如,為了輕鬆開啟其他專案檔案),則必須使用 autocmds 儲存/復原 CWD:

:autocmd InsertEnter * let save_cwd = getcwd() | set autochdir
:autocmd InsertLeave * set noautochdir | execute 'cd' fnameescape(save_cwd)

答案2

@英戈·卡卡特回答很好,但我有點猶豫要不要把它放進去我的 vimrc,因為即使是幫助頁面'autochdir'指出它的使用會破壞一些插件。

我提出了自己的解決方案,該解決方案可能非常適合我的用例:

內線圖./<CX><CF> <CO>:液晶螢幕 %:p:h<CR><CX><CF>

我計劃將其提取到一個函數中,並在發出 lcs 命令之前為 pwd 設定一個變量,然後在某個時間點重置它。如果有一個自動命令選單就好了。

我可能會也可能不會使用這個,但我想我會拋出另一個解決方案。

答案3

我的.vimrc

" [relative autocomplete]
" ==============================================================================
" Vim's file autocomplete (C-X C-F) works only in an absolute path (using the
" current working directory) as base. But in most languages, you want to use
" relative imports, and file autocomplete doesn't work there. For that, I use
" <C-X><C-X><C-F>:

function! s:EnableRelativeAutocomplete() abort
  let b:relative_autocomplete_cleanup_pending = 1
  lcd %:p:h
endfunction

function! s:DisableRelativeAutocomplete() abort
  if exists('b:relative_autocomplete_cleanup_pending') && b:relative_autocomplete_cleanup_pending
    lcd -
    let b:relative_autocomplete_cleanup_pending = 0
  endif
endfunction

inoremap <C-x><C-x><C-f> <C-o>:call <SID>EnableRelativeAutocomplete()<CR><C-x><C-f>

augroup relative_file_autocomplete
  autocmd!
  autocmd InsertLeave * call s:DisableRelativeAutocomplete()
augroup END

如果需要,它會在使用時將工作目錄變更為目前檔案的工作目錄<C-x><C-x><C-f>,並在離開插入模式時返回先前的目錄。

相關內容