Python vim complete(),带有lvim的结果

Python vim complete(),带有lvim的结果,python,vim,macvim,Python,Vim,Macvim,我正在尝试创建一个函数,它将弹出一个包含单词“Module”(不区分大小写)的文件列表 当所有*.f90都在当前目录中时,我尝试了:lvim/Module/gj*.f90,但我未能创建类似globpath()的展开,以便包含和细分 所以,我转向python。从python中,我得到了完美的列表。我正在插入python代码,这可能会显示我的目标: #!/usr/bin/python import os import re flsts = [] path = "/home/rudra/De

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

当所有*.f90都在当前目录中时,我尝试了:lvim/Module/gj*.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获得一个列表,并在完整的函数中使用它

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

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

$tree */*.f90
OLD/dirac.f90
OLD/environment.f90
src/constants.f90
src/gencrystal.f90
src/geninp.f90
src/init.f90
其中只有两个模块中包含单词
模块

$ grep Module */*.f90
OLD/dirac.f90:      10 :module mdirac
src/constants.f90:   2 :module constants
因此,我希望使用
inoremap
complete()
只弹出
常量
狄拉克


因此,
模块
是我在当前工作目录的
子目录中搜索的
关键字
,只有那些文件匹配项(本例中的dirac和常量)应该在
complete()

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

inoremap=FindFiles()
功能!FindFiles()
调用完成(col('.')、拆分(system('python path/to/script.py')、'\n'))
返回“”
端功能

我不确定您的确切问题是什么

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

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

本身,
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>
函数!s:完成()
“来自左侧vim库:word_tools.vim
let key=GetCurrentKeyword()
let files=split(glob('./***'.key'.*/***','.*.vim'),'\n')
调用完成(列('.')-len(键),文件)
返回“”
端功能
inoremapµ=完整()
但是,如果您想触发一个操作(而不是插入文本),它会变得更加复杂。我在中这样做了。我在中发布了用于将挂钩与完成项关联的框架(请参见
lh#icomplete#*()
functions)

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

关于Python集成,可以使用
:py vim.command()
。例如,请参阅将
complete()
与构建完成列表的Python脚本集成的jira complete:

注:

  • 如果可以使用ctags预先搜索“module:”,则可以使用
    taglist()
    从标签数据库中提取文件
  • 还可以使用
    complete\u add()
    动态填充文件列表,这对于一个接一个地测试每个文件的python脚本来说是有意义的

正确…感谢您的展示。但这不是我想要的,除非我今天解决它。现在,我希望将python嵌入到vim中,或者在纯viml中实现。但是,感谢您的建议…我将保留它作为备份:)Hi@Luc,我还没有设法让您的代码段运行,但我在问题中添加了更多解释你能看一看吗?好的。我在回答中增加了第二部分。
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>