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
所以,我希望 inoremap
、complete()
只弹出 constants
和 dirac
。
因此,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 脚本来说是有意义的。
我正在尝试创建一个函数,它将弹出一个文件列表,其中包含单词“模块”(不区分大小写)。
我试过 :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
所以,我希望 inoremap
、complete()
只弹出 constants
和 dirac
。
因此,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 脚本来说是有意义的。