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

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

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

也在stackoverflow中问到了

评论

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

#1 楼

如@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

一些注意事项


这不能像q4​​312079q那样在插入模式下提供内联完成。相反,您将在命令行提示符下(<C-X><C-F>命令所在的位置)键入路径或文件名。按下:时,路径将插入到缓冲区中。
在命令行模式下也是如此,当您按Enter时有时会造成混淆,而忘记了仍然必须按Enter发出任何命令只需键入。
可以通过将其他目录功能添加到Enter中来注册其他功能。
插入的路径将是完整的绝对路径。可以对脚本进行调整以更改该行为,但是我还没有解决。


评论


没有完全测试解决方案,但是由于完整性而接受了它。相反,我使用建议的解决方法:YouCompleteMe而不是ctrl + x,ctrl + f。

–拉斐尔·巴博萨(Rafael Barbosa)
16-2-24在14:11