Перейти к последней позиции курсора после команды в vim

У меня есть определенная пользователем команда vim, которая вызывает 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

vim
person highsciguy    schedule 03.04.2012    source источник


Ответы (1)


Я думаю, вам нужен «обычный ``»:

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

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

person sehe    schedule 03.04.2012
comment
Я попробовал это и команду! -complete=shellcmd -nargs=+ Оболочка let save_winnr = winnr() | вызов s:RunShellCommand(‹q-args›) | exec save_winnr . 'wincmd w' Но ни один из них не работает. Команда RunShellCommand открывает рабочий буфер и обычно снова его закрывает. В принципе, это должно быть так же просто, как добавить маркер или сохранить номер строки и вернуться к этой позиции после завершения команды. Но как я могу добавить маркер, который не перезаписывает возможные пользовательские маркеры. - person highsciguy; 03.04.2012
comment
Откуда берется RunShellCommand? Я подозреваю, что это может быть особенность плагина/скрипта, который вы используете, или, в противном случае, лучше всего реализовать его как (новую) функцию. - person sehe; 04.04.2012
comment
RunShellCommand — это модифицированная версия скрипта vim из советов по vim, см. edit. - person highsciguy; 04.04.2012