Vim文件名/路径完成


11

我知道我可以使用ctrl + x,ctrl + f(compl-filename)从当前目录完成文件名/路径。与set autochdir结合使用时效果很好,后者将更改将当前目录更新为活动缓冲区的目录。

但是,我开始使用airblade/vim-rooter将当前目录设置为“项目”文件夹。现在,文件名补全总是从项目文件夹开始。

问题:是否有办法使文件名补全使用活动缓冲区的目录而不是当前目录?或其他解决方法?

在stackoverflow中也被问到


5
C-xC-f始终使用当前缓冲区的工作目录,而没有任何配置选项(它也不支持path)。这取决于您对vim-rooter的预期用途。根据您的需求,我们可以使用其他插件。另外:我使用youcompleteme,如果您开始输入,它将完成当前缓冲区目录的路径./。参见reddit.com/r/vim/comments/216jdd/…–
muru,

Answers:


7

如@muru所述,没有任何选项可配置要从中完成路径和文件名的目录。它始终使用窗口的工作目录。

我编写了一些函数和映射来帮助实现这一点。在后台,他们:lcd临时更改本地工作目录(使用),然后在完成后还原先前的工作目录。

由于我什至不知道的原因,我将其称为微插件Elephant

这是代码(从我在GitHub上的Vim配置复制):

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

如何使用它

使用这些映射需要3个步骤。

1.调用映射

在插入模式或命令行模式下,使用调用映射<C-R><C-E>

2.选择一个目录

键入一个字符以选择要从中完成的根目录。上面的代码提供了两种类型的根:

  • f -当前文件(缓冲区)所在的目录
  • p -当前文件所属的Git项目的基本目录

3.输入路径或文件名

系统将提示您输入相对于指定目录的路径或文件名,并提供完成功能。Enter完成后按。

一些注意事项

  • 这样做不能像“插入”模式那样提供内联完成<C-X><C-F>。相反,您将在命令行提示符(:命令所在的位置)上键入路径或文件名。按下时Enter,路径将插入到缓冲区中。
  • 在命令行模式下也是如此,当您按下Enter并忘记您仍然必须点击Enter以发出您刚刚键入的任何命令时,有时会令人困惑。
  • 可以将其他目录功能添加到中进行注册g:elephant_map
  • 插入的路径将是完整的绝对路径。可以对脚本进行调整以更改该行为,但是我还没有解决。

没有完全测试解决方案,但是由于完整性而接受了它。相反,我使用建议的解决方法:YouCompleteMe而不是ctrl + x,ctrl + f。
拉斐尔·巴博萨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.