2016-08-05 36 views
0

Ich versuche gerade ein Skript zu schreiben, das das Aufrufen eines Vim-Befehls ermöglicht, der wiederum einen externen Befehl aufruft. Ich möchte die automatische Vervollständigung mit Ergebnissen in einer Liste von Dateien mit einer bestimmten Erweiterung aktivieren (siehe Code unten).Vim Script-Befehl-Vervollständigen: Tab drücken, laden Sie die Liste neu

Die Komplettierung durchläuft tatsächlich die Liste der Dateien mit der angegebenen Erweiterung, aber wenn ich etwas eintippe und die Tabulatortaste drücke, wird der Abschlusszyklus vom Anfang der Liste wiederholt, unabhängig davon, was gerade eingegeben wird Vervollständigen des restlichen Dateinamens, der in der Eingabe angegeben ist). Der Code ist die folgende:

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 

Zum Beispiel, wenn ich habe: app.component.ts und test.component.ts und ich tippe

:EComponent test 

und die Tabulatortaste drücken, die abgeschlossene Befehl wird die folgende

:EComponent app.component.ts 

statt:

:EComponent test.component.ts 

Vielen Dank im Voraus für Ihre Hilfe zu diesem Thema.

+0

Was ist der Zweck dieses "Befehlsfabrikbefehls"? – romainl

Antwort

0

ComponentFiles() soll Filter die Liste der Dateien auf die Zeichen vor dem Cursor basiert (ArgLead), aber Sie immer die gleiche Liste zurück, so dass Funktion nichts Nützliches tut.

Die benutzerdefinierte Vervollständigungsfunktion unten gibt nur die Elemente in ls, die die Zeichen vor dem Cursor entsprechen:

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>) 

Siehe :help :command-completion-customlist.

+0

Danke, deine Antwort hat mein Problem gelöst. Ich habe die Filterung mit dem ArgLead-Argument verpasst. Ich habe es geschafft, diese Arbeit zu machen. –