Vim 文件名补全相对于当前文件

Vim 文件名补全相对于当前文件

Vim,当我处于插入模式时,我想使用文件名补全,我希望搜索路径相对于当前文件,而不是当前工作目录。例如,如果在插入模式下我输入以下内容:

./^X^F

完成菜单向我显示了:pwd,但我更希望看到%:p:h列出。

是否有我可以设置选项来修复此问题?如果没有,您建议什么解决方法?

答案1

如果你

:set autochdir

您将获得所需的行为。但是,如果您需要保留工作目录(例如,为了轻松打开其他项目文件),则必须使用自动命令保存/恢复 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<回车><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>,离开插入模式时则返回到上一个目录。

相关内容