Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Переключить буфер без движения экрана

#vim


Допустим, есть два файла, первый выглядит как-то так (как выглядит второй неважно):

001 #include 
002
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

Комментариев нет:

Отправить комментарий