vim complete() 结果来自 lvim

vim complete() with result from lvim

我正在尝试创建一个函数,它将弹出一个文件列表,其中包含单词“模块”(不区分大小写)。

我试过 :lvim /Module/gj *.f90 当所有 *.f90 都在当前目录中时,但我没能像扩展那样创建一个 globpath() 以便我可以包含和子目录.

所以,我转向python。从 python,我得到了完美的列表。我正在插入 python 代码,这可能会显示我的目标:

#!/usr/bin/python
import os
import re
flsts = []
path = "/home/rudra/Devel/dream/"
print("All files==>")
for dirs, subdirs, files in os.walk(path):
    for tfile in files:
        if tfile.endswith('f90'):
            print(os.path.splitext(tfile)[0])
            text = open(dirs+'/'+tfile).read()
            match = re.search("Module", text)
            if match:
                flsts.append(os.path.splitext(tfile)[0])
print("The list to be used ==>")
print(flsts)

拿到清单后,我想要一个

complete(col('.')), flsts)

问题是,我无法将它包含在 vim 函数中。

请问我可以得到一些帮助,以便我可以从 vim 中获取一个列表并在完整的函数中使用它吗?

我已经检查了 this 作为可能的解决方案,但不幸的是它不是。 请帮忙。

编辑:更多解释 所以,比如说,在我的工作目录中,我有:

$tree */*.f90
OLD/dirac.f90
OLD/environment.f90
src/constants.f90
src/gencrystal.f90
src/geninp.f90
src/init.f90

其中只有两个有module字:

$ grep Module */*.f90
OLD/dirac.f90:      10 :module mdirac
src/constants.f90:   2 :module constants

所以,我希望 inoremapcomplete() 只弹出 constantsdirac

因此,Module 是我在当前工作目录的 subdirs 中搜索的 keyword,只有匹配的文件(本例中的狄拉克和常量)应该弹出在 complete()

:help complete() 中有一个您可以改编的示例。如果您修改 Python 脚本以仅输出(换行符分隔的)文件,则可以通过 system():

调用它
inoremap <F5> <C-R>=FindFiles()<CR>

function! FindFiles()
  call complete(col('.'), split(system('python path/to/script.py'), '\n'))
  return ''
endfunction

我不确定你的确切问题是什么。

使用 split(globpath('./**/Module/**', '*.f90'), '\n') 您将获得与 *.f90 匹配的所有文件的列表,这些文件位于名为 Module.

的目录中的某处

然后,使用 complete() 有一些限制。它必须来自将从插入模式调用的函数,并且 returns 是一个空字符串。

本身,complete() 将插入选定的文本,如果我们使用 {starcol} 参数,我们甚至可以删除光标之前的内容。这样,您可以键入 Module,按您想要的键并使用 Module 进行过滤。

function! s:Complete()
  " From lh-vim-lib: word_tools.vim
  let key = GetCurrentKeyword()
  let files = split(glob('./**/*'.key.'*/**', '*.vim'), '\n')
  call complete(col('.')-len(key), files )
  return ''
endfunction

inoremap µ <c-R>=<sid>Complete()<cr>

但是,如果您想触发一个动作(而不是插入文本),它会变得复杂得多。我在 muTemplate. I've published the framework used to associate hooks to completion items in lh-vim-lib 中做到了(参见 lh#icomplete#*() 函数)。

编辑:好的,那么,我将使用 let files=split(system("grep --include=*.f90 -Ril module *"), '\n') 获取文件列表,然后使用该列表调用 complete(col('.'), files)。那应该是更有效的解决方案。这在某种程度上与 Ingo 的解决方案非常相似。不同之处在于,如果 grep 可用,我们不需要 Python。

关于 Python 集成,:py vim.command() 是可能的。例如,参见将 complete() 与构建完成列表的 Python 脚本集成的 jira-complete:https://github.com/mnpk/vim-jira-complete/blob/master/autoload/jira.vim#L116

备注:

  • 如果 "module:" 可以使用 ctags 进行预搜索,则可以使用 taglist().
  • 从标签数据库中提取文件
  • 也可以用 complete_add() 动态填充文件列表,这对于一个接一个测试每个文件的 python 脚本来说是有意义的。