Сценарии Vim: сохранение позиции курсора и вида экрана при вызове функции - PullRequest
22 голосов
/ 05 июня 2009

У меня есть несколько функций Vim, которые вносят изменения в формат документа. Когда я вызываю эту функцию, я в настоящее время использую что-то вроде следующего, чтобы сохранить и восстановить мою позицию курсора:

func! Foo()
  :norm mz
  ...
  :norm `z
endf

Это правильно сохраняет положение курсора, но иногда меняет положение окна, так что текущая строка перемещается от верхней части экрана к нижней или наоборот. Есть ли способ сохранить положение курсора и положение строки на экране?

Ответы [ 5 ]

26 голосов
/ 11 декабря 2012
let l:winview = winsaveview()
" do stuff
call winrestview(l:winview)

Это должно в значительной степени делать именно то, что вы хотите, возможно, за исключением того, что количество строк меняется над курсором (я подозреваю, что удаление строк над курсором приведет к перемещению курсора вниз).

6 голосов
/ 05 июня 2009

Вы можете сохранить метку для первой экранной строки, которая отображается в окне, и восстановить ее. Пример, который выполняет команду g? для всего буфера и восстанавливает обе позиции:

:noremap <F11> mkHmlggg?G`lzt`k

Прогулка по команде:

  • mk: установить отметку k для текущей позиции
  • H: перейти к первой строке на экране
  • ml: установить отметку l для этой позиции
  • ggg?G: выполнить команду
  • zt: установите эту строку в первую строку на экране
  • : jump to mark k`
6 голосов
/ 05 июня 2009

Просто: h getpos ()

let save_cursor = getpos(".")
" MoveTheCursorAround
call setpos('.', save_cursor)
3 голосов
/ 05 июня 2009

вы можете использовать getline () для сохранения текущей строки буфера и winline () для сохранения текущей строки окна.

Так что будет примерно так:

  • сохранить строку окна с winline ()
  • переместите курсор в верхнюю часть окна с помощью: normal! ЧАС
  • сохранить строку буфера с помощью getline ()
  • ...
  • восстановить строку буфера с помощью: exec 'normal! '.Myline.'G'
  • Прокрутите вверх: обычный zt
  • затем восстановите исходную строку окна с помощью: exec 'normal! '.Mywinline.'H'

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

0 голосов
/ 01 сентября 2017

Существует плагин , но я использую одну функцию, подобную этой:

if !exists('*Preserve')
    function! Preserve(command)
        try
            " Preparation: save last search, and cursor position.
            let l:win_view = winsaveview()
            let l:old_query = getreg('/')
            silent! execute 'keepjumps ' . a:command
         finally
            " Clean up: restore previous search history, and cursor position
            call winrestview(l:win_view)
            call setreg('/', l:old_query)
         endtry
    endfunction
endif

тогда я вызываю это, чтобы очистить конечные пробелы

fun! CleanExtraSpaces()
    call Preserve(':%s/\s\+$//ge')
endfun
com! Cls :call CleanExtraSpaces()
au! BufwritePre * :call CleanExtraSpaces()

пустые строки

fun! DelBlankLines()
    call Preserve(':%s/^\n\{2,}/\r/ge')
endfun
command! -nargs=0 DelBlank :call DelBlankLines()

и изменить информацию заголовка (последнее изменение)

fun! ChangeHeader()
    call Preserve(':1,5s/Last Change: \zs.*/\=strftime("%c")/e')
endfun
command! -nargs=0 CH :call ChangeHeader()
au BufWritePost * :call ChangeHeader()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...