2012-04-03 13 views
2

Ich habe einen Benutzer definiert Vim-Befehl, der einen Vim-Skript aufruft:zur letzten Cursorposition nach dem Befehl in Vim

command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand(<q-args>) 

wenn ich es ausführen

:Shell echo "foo" 

springt der Cursor auf den ersten Zeile der Datei. Aber ich möchte, dass es an der Stelle bleibt, wo es war, bevor ich den Befehl eingegeben habe.

Ich versuchte

command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand(<q-args>) | '' 

, die nicht zu funktionieren scheint.

Die RunShellCommand ist

" Shell command with output in vim scratch buffer 
function! s:RunShellCommand(cmdline) 
    let isfirst = 1 
    let words = [] 
    for word in split(a:cmdline) 
    if isfirst 
     let isfirst = 0 " don't change first word (shell command) 
    else 
     if word[0] =~ '\v[%#<]' 
     let word = expand(word) 
     endif 
     let word = shellescape(word, 1) 
    endif 
    call add(words, word) 
    endfor 
    let expanded_cmdline = join(words) 
    botright new 
    setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap 
    call setline(1, 'You entered: ' . a:cmdline) 
    call setline(2, 'Expanded to: ' . expanded_cmdline) 
    call append(line('$'), substitute(getline(2), '.', '=', 'g')) 
    silent execute '$read !'. expanded_cmdline 
    " close scratch buffer if successfull 
    if v:shell_error == 0 
     q 
    endif 
    1 
endfunction 

Antwort

1

Ich glaube, Sie brauchen "normal` `":

command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand(<q-args>) | normal `` 

siehe auch die winsaveview/winrestview hier beschriebenen Funktionen: https://stackoverflow.com/a/9989348/85371

+0

Ich versuchte dies und Befehl ! -complete = shellcmd -nargs = + Shell let saved_winnr = winnr() | Rufen Sie s: RunShellCommand () | exec saved_winnr. 'wincmd w' Aber keiner scheint zu funktionieren. Der RunShellCommand öffnet den Scratch-Puffer und schließt ihn normalerweise wieder. Im Prinzip sollte es so einfach sein wie das Hinzufügen eines Markers oder das Speichern der Zeilennummer und das Zurückkehren zu dieser Position, wenn der Befehl beendet ist. Aber wie kann ich einen Marker hinzufügen, der mögliche Benutzermarker nicht überschreibt? – highsciguy

+0

Woher kommt RunShellCommand? Ich vermute, dass dies eine Funktion des verwendeten Plugins/Skripts sein könnte, ansonsten sollte es am besten als (neues) Feature implementiert werden. – sehe

+0

Der RunShellCommand ist eine modifizierte Version eines vim-Skripts von vim tips, siehe Bearbeiten. – highsciguy

Verwandte Themen