compl-filename
)从当前目录中完成文件名/路径。与set autochdir结合使用时效果很好,后者将当前目录更改为活动缓冲区的目录。但是,我开始使用
airblade/vim-rooter
将当前目录设置为“ project”文件夹。现在,文件名补全总是从项目文件夹开始。问题:是否有办法使文件名补全使用活动缓冲区的目录而不是当前目录?还是其他解决方法?
也在stackoverflow中问到了
#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
。一些注意事项
这不能像q4312079q那样在插入模式下提供内联完成。相反,您将在命令行提示符下(
<C-X><C-F>
命令所在的位置)键入路径或文件名。按下:
时,路径将插入到缓冲区中。在命令行模式下也是如此,当您按
Enter
时有时会造成混淆,而忘记了仍然必须按Enter
发出任何命令只需键入。可以通过将其他目录功能添加到
Enter
中来注册其他功能。插入的路径将是完整的绝对路径。可以对脚本进行调整以更改该行为,但是我还没有解决。
评论
没有完全测试解决方案,但是由于完整性而接受了它。相反,我使用建议的解决方法:YouCompleteMe而不是ctrl + x,ctrl + f。
–拉斐尔·巴博萨(Rafael Barbosa)
16-2-24在14:11
评论
C-xC-f始终使用当前缓冲区的工作目录,而没有任何配置选项(它也不支持路径)。这取决于您对vim-rooter的预期用途。根据您的需求,我们可以使用其他插件。另外:我使用youcompleteme,如果您开始输入./,它将完成当前缓冲区目录的路径。参见reddit.com/r/vim/comments/216jdd/…