2012-04-03 5 views
2

У меня есть определенные пользователем команды VIM, которая называет ВИМ-Skript:Перейти к последнему положению курсора после выполнения команды в Vim

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

, если я исполню его

:Shell echo "foo" 

курсор перескакивает на первый строка файла. Но я хочу, чтобы он остался там же, где и был, прежде чем я вошел в команду.

Я попытался

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

, не похоже на работу.

RunShellCommand является

" 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 

ответ

1

Я думаю, что вам нужно "нормальный`":

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

см Также winsaveview/функция winrestview описана здесь: https://stackoverflow.com/a/9989348/85371

+0

Я попытался это и команда ! -complete = shellcmd -nargs = + Shell let saved_winnr = winnr() | вызов s: RunShellCommand () | exec saved_winnr. 'wincmd w' Но, похоже, не работает. RunShellCommand открывает буфер нуля и обычно закрывает его снова. В принципе это должно быть так же просто, как добавить маркер или сохранить номер строки и вернуться в эту позицию, когда команда будет закончена. Но как я могу добавить маркер, который не перезаписывает возможные пользовательские маркеры. – highsciguy

+0

Откуда у RunShellCommand? Я подозреваю, что это может быть особенностью используемого вами плагина/скрипта или, иначе, лучше всего реализовать его как (новую). – sehe

+0

RunShellCommand - это модифицированная версия скрипта vim из vim tips, см. Edit. – highsciguy

Смежные вопросы