Vim Script命令完成:按Tab键重新加载列表

时间:2016-08-05 17:58:54

标签: vim viml

我正在尝试编写一个允许调用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

先谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

ArgLead应该基于光标(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

请参阅function saveData() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; var url = sheet.getRange('Sheet1!A1').getValue(); var follower_count = sheet.getRange('Sheet1!B1').getValue(); var date = sheet.getRange('Sheet1!C1').getValue(); sheet.appendRow([url,follower_count,date]); }