#vim
Допустим, есть два файла, первый выглядит как-то так (как выглядит второй неважно): 001 #include002 003 int main(void) 004 { 005 puts("hello world"); 006 return 0; 007 } При этом, высота терминала, например, три строки. Я перемещаю курсор на третью строку и делаю zt. В терминале получаю: 003 int main(void) 004 { 005 puts("hello world"); Всё отлично. Но после перемещения на второй файл командой :bnext и возвращения через :bprev, экран смещается так, что строка с курсором становится посередине. То есть, в терминале я получаю: 002 003 int main(void) 004 { Вопрос: Как перемещаться между буферами, не трогая положение экрана относительно курсора?
Ответы
Ответ 1
Для решения можно воспользоваться следующим способом: Прежде чем перейти в другой buffer, сохраняем текущие настройки окна. Как только переходим (возвращаемся) в buffer, восстанавливаем ранее сохранённые для него настройки. Готовое решение находим здесь https://vim.fandom.com/wiki/Avoid_scrolling_when_switch_buffers и добавляем его в ~/.vimrc: " Save current view settings on a per-window, per-buffer basis. function! AutoSaveWinView() if !exists("w:SavedBufView") let w:SavedBufView = {} endif let w:SavedBufView[bufnr("%")] = winsaveview() endfunction " Restore current view settings. function! AutoRestoreWinView() let buf = bufnr("%") if exists("w:SavedBufView") && has_key(w:SavedBufView, buf) let v = winsaveview() let atStartOfFile = v.lnum == 1 && v.col == 0 if atStartOfFile && !&diff call winrestview(w:SavedBufView[buf]) endif unlet w:SavedBufView[buf] endif endfunction " When switching buffers, preserve window view. if v:version >= 700 autocmd BufLeave * call AutoSaveWinView() autocmd BufEnter * call AutoRestoreWinView() endif
Комментариев нет:
Отправить комментарий