2016-04-04 5 views
0

Ich möchte eine Reihe von @tags (z. B. @sea_ice, @models) in meine Markdown-Dateien bei der Bearbeitung in Vim pflanzen. Zurzeit verwende ich SuperTab, um gewöhnliche Wörter zu tabulatorisieren. Jedoch, wenn ich <tab> nach dem @ Symbol treffe, gibt es mir keine Liste aller @tags, aber eher eine lange Liste aller Wörter, die im gegenwärtigen Zusammenhang gefunden werden.Liste @ Tag Auto abgeschlossen in Vim

Ich bemerkte, dass SuperTab benutzerdefinierte Kontextdefinitionen erlaubt, aber ich weiß nichts über vim Scripting und die Dokumentation enthält nur 2 Beispiele, ich bin nicht in der Lage, es selbst zu skripten.

Nach etwas suchen um glaube ich wahrscheinlich eine neue benutzerdefinierte omni komplette Funktion definieren müssen, insbesondere die 2. Hälfte der Funktion:

function! TagComplete(findstart, base) if a:findstart " locate the start of the word let line = getline('.') let start = col('.') - 1 while start > 0 && line[start - 1] != '@' let start -= 1 endwhile return start else " find @tag let res = [] ???? ???? endif return res endif endfun

Dies ist der Code ich arbeite. Aber ich weiß nicht, wie ich es testen soll oder wo es richtig ist. Bitte helfen

Dank

Antwort

0

Nach ziemlich viel Mühe und Suche nach Hilfe, habe ich eine Lösung gefunden.

erstens ein completefunc erstellen, die für @tags in der aktuellen Datei sucht (Credits cherryberryterry: https://www.reddit.com/r/vim/comments/4dg1rx/how_to_define_custom_omnifunc_in_vim_seeking/):

function! CompleteTags(findstart, base) 
    if a:findstart 
     return match(matchstr(getline('.'), '.*\%' . col('.') . 'c'), '.*\(^\|\s\)\[email protected]') 
    else 
     let matches = [] 

     " position the cursor on the last column of the last line 
     call cursor(line('$'), col([line('$'), '$'])) 

     " search backwards through the buffer for all matches 
     while searchpos('\%(^\|\s\)\zs' . (empty(a:base) ? '@' : a:base) . '[[:alnum:]_]*', 'bW') != [0, 0] 
      let matches += [matchstr(getline('.'), '\%' . col('.') . '[email protected][[:alnum:]_]*')] 
     endwhile 

     return filter(matches, "v:val != '@'") 
    endif 
endfunction 
set completefunc=CompleteTags 

Die nach dem setzen in .vimrc Setup Tab-Vervollständigung mit SUPERTAB:

function! TagCompleteContext() 
    let line = getline('.') 
    if line[col('.') - 2] == '@' 
     return "\<c-x>\<c-u>" 
    endif 
endfunction 


let g:SuperTabDefaultCompletionType = "context" 
let g:SuperTabCompletionContexts = ['TagCompleteContext', 's:ContextText'] 
let g:SuperTabContextDefaultCompletionType = "<c-p>" 
0

ich nie SUPERTAB verwendet habe, so habe ich keine Ahnung, ob und wie diese Lösung vorgenommen werden könnte, mit diesem Plugin zu arbeiten, aber es ist ziemlich einfach mit der eingebauten manuellen Fertigstellung.

  1. Wenn es nicht bereits vorhanden ist, erstellen Sie diese Verzeichnisstruktur:

    ~/.vim/after/ftplugin/ 
    
  2. In ~/.vim/after/ftplugin/markdown.vim, fügen Sie diese Zeile:

    setlocal [email protected] 
    
  3. In einem Abschlags-Puffer Typ @ und drücken Sie <C-x><C-d>.

    enter image description here

Siehe :help 'define' und :help ctrl-x_ctrl-d.

+0

Danke für die Antwort. Es funktioniert irgendwie, aber nicht ganz. Wenn ich 6 solche '@ Tags' in einer Testdatei habe und Ihre Methode verwende, gibt mir die Vervollständigung nur 2 Möglichkeiten (die ersten 2), und es durchläuft die 2. Gibt es einen Längenbegrenzungsparameter oder was? – Jason

+0

Ich fand heraus, dass das 'define' verwendet wird, um eine Definition ** Zeile ** zu markieren. In meinem Fall habe ich mehrere "@ Tags" in einer einzigen Zeile, so dass alle nachfolgenden Tags nicht erkannt werden. Gibt es eine Möglichkeit, dies zu lösen? – Jason