Vim 脚本命令完成:按 Tab 键重新加载列表
Vim Script command-complete: pressing tab reload the list
我目前正在尝试编写一个允许调用 Vim 命令的脚本,该命令又会调用外部命令。我想在具有特定扩展名的文件列表中启用自动完成结果(参见下面的代码)。
完成实际上是在具有给定扩展名的文件列表中循环,但是当我开始输入内容并按 Tab 键时,完成是循环从列表的开头重复,不管输入的是什么(而不是实际上完成输入中给定的文件名的其余部分)。代码如下:
call CreateEditCommand('EComponent', 'ComponentFiles')
function! CreateEditCommand(command, listFunction)
silent execute 'command! -nargs=1 -complete=customlist,'. a:listFunction . ' ' . a:command . ' call EditFile(<f-args>)'
endfunction
function! ComponentFiles(A,L,P)
return Files('component.ts')
endfunction
function! Files(extension)
let paths = split(globpath('.', '**/*.' . a:extension), "\n")
let idx = range(0, len(paths)-1)
let g:global_paths = {}
for i in idx
let g:global_paths[fnamemodify(paths[i], ':t:r')] = paths[i]
endfor
call map(paths, 'fnamemodify(v:val, ":t:r")')
return paths
endfunction
function! EditFile(file)
execute 'edit' g:global_paths[a:file]
endfunction
例如,如果我有:app.component.ts 和 test.component.ts,然后我输入
:EComponent test
然后按tab键,完成的命令如下
:EComponent app.component.ts
而不是:
:EComponent test.component.ts
在此先感谢您的帮助。
ComponentFiles()
应该根据光标前的字符 过滤 文件列表 (ArgLead
) 但你总是 return相同的列表,因此函数没有任何用处。
下面的自定义完成函数 return 仅匹配 ls
中与光标之前的字符的项目:
function! MyComp(ArgLead, CmdLine, CursorPos)
return filter(systemlist("ls"), 'v:val =~ a:ArgLead')
endfunction
function! MyFunc(arg)
execute "edit " . a:arg
endfunction
command! -nargs=1 -complete=customlist,MyComp MyEdit call MyFunc(<f-args>)
见:help :command-completion-customlist
。
我目前正在尝试编写一个允许调用 Vim 命令的脚本,该命令又会调用外部命令。我想在具有特定扩展名的文件列表中启用自动完成结果(参见下面的代码)。
完成实际上是在具有给定扩展名的文件列表中循环,但是当我开始输入内容并按 Tab 键时,完成是循环从列表的开头重复,不管输入的是什么(而不是实际上完成输入中给定的文件名的其余部分)。代码如下:
call CreateEditCommand('EComponent', 'ComponentFiles')
function! CreateEditCommand(command, listFunction)
silent execute 'command! -nargs=1 -complete=customlist,'. a:listFunction . ' ' . a:command . ' call EditFile(<f-args>)'
endfunction
function! ComponentFiles(A,L,P)
return Files('component.ts')
endfunction
function! Files(extension)
let paths = split(globpath('.', '**/*.' . a:extension), "\n")
let idx = range(0, len(paths)-1)
let g:global_paths = {}
for i in idx
let g:global_paths[fnamemodify(paths[i], ':t:r')] = paths[i]
endfor
call map(paths, 'fnamemodify(v:val, ":t:r")')
return paths
endfunction
function! EditFile(file)
execute 'edit' g:global_paths[a:file]
endfunction
例如,如果我有:app.component.ts 和 test.component.ts,然后我输入
:EComponent test
然后按tab键,完成的命令如下
:EComponent app.component.ts
而不是:
:EComponent test.component.ts
在此先感谢您的帮助。
ComponentFiles()
应该根据光标前的字符 过滤 文件列表 (ArgLead
) 但你总是 return相同的列表,因此函数没有任何用处。
下面的自定义完成函数 return 仅匹配 ls
中与光标之前的字符的项目:
function! MyComp(ArgLead, CmdLine, CursorPos)
return filter(systemlist("ls"), 'v:val =~ a:ArgLead')
endfunction
function! MyFunc(arg)
execute "edit " . a:arg
endfunction
command! -nargs=1 -complete=customlist,MyComp MyEdit call MyFunc(<f-args>)
见:help :command-completion-customlist
。