从vimscript触发文件完成

时间:2018-04-26 10:52:06

标签: vim

可能我的问题的答案是显而易见的,但即使经过我们的搜索,我也找不到任何有用的东西。

我目前正在编写一个小的vim latex自动完成插件,它根据编辑环境建议完成。代码的相关部分如下所示:

function! Complete_latex(findstart, base)
    if a:findstart
        " locate the start of the base
        "....
    else
        if s:envname_required()
            return s:env_complete(a:base)
        endif

        if s:citation_required()
            return s:cite_complete(a:base)
        endif

        if s:filename_required()
            " TODO: Trigger filename completion
        endif
    endif
endfunction

set omnifunc=Complete_latex

*_required()函数基本上在我正在编辑的当前行中抛出一堆正则表达式来弄清楚我现在在做什么。因此,如果我处于INSERT模式,如... \ _输入{| ...我希望我的omnifunc调用相同的完成,我可以在INSERT模式下使用C-X C-F触发。

由于我还使用YouCompleteMe插件并将{设置为* .tex文件中语义完成的触发器,因此触发正在处理。

我知道我可以获得一个文件列表并自己填充弹出菜单,但我仍然想知道我是否可以使用vim的内置函数。

谢谢。

1 个答案:

答案 0 :(得分:0)

我不完全确定这是否是最佳方式,但我想出了

let l:glob_pattern = a:base . '*' 

let l:files_pre = globpath('.', l:glob_pattern, 0, 1)
let l:files_post = []

for l:file in l:files_pre
     call add(l:files_post, substitute(l:file, '^\./', '', ''))
endfor

return l:files_post

这基本上使当前目录中的所有文件都匹配“base *”并返回它们的列表。后处理部分只删除globpath

返回的每个文件名开头的'./'