Как заставить vim сохранить позицию курсора при открытии сплита

Когда я открываю вертикальное разбиение в vim, он берет мою текущую строку и поднимает ее до верхней части буфера (прокручивая весь файл вверх). Как мне получить vim, чтобы сохранить свою текущую позицию?

2 ответа

Решение

РЕДАКТИРОВАТЬ: РЕАЛЬНЫЙ ОТВЕТ: см. https://stackoverflow.com/questions/9625028/vim-buffer-position-change-on-window-split-annoyance

TLDR: это происходит только при первом создании нового окна. Если вы закроете окно и сделаете это снова, курсор в новом буфере будет таким же, как в старом буфере. Ответ на этот вопрос заключался в том, чтобы сделать что-то бесполезное, которое откроет, затем закроет окно, а затем сделать вертикальное разделение.

Вот еще один .vimrc отображение, которое оборачивает ответ от stackoverflow, чтобы сделать это для вас:

map <C-S-O> :tabnew<CR>bwipeout<CR>:vs<CR>

Поэтому, когда вы нажимаете ctrl-shift-o откроется новая пустая вкладка (:tabnew<CR>), удалите буфер (:bwipeout<CR>), а затем сделать ваш вертикальный раскол (:vs<CR>)

Надеюсь, что это лучше - отлично работает для меня. Спасибо, что заставили меня захотеть найти что-то полезное, чтобы обойти это раздражающее поведение!


Это происходит со мной все время! Недавно я пришел с ответом, который работает большую часть времени (хотя лучше, чем ничего). Поместите это в свой .vimrc:

map <C-S-O> mmH:vs<CR>`m<C-W>l`m<C-W>h

Каждый раз, когда вы нажимаете ctrl+shift+o он должен выполнить вертикальное разбиение и поместить курсор на ту же строку и столбец, которые у вас были в исходном буфере до разделения.

Поведение в vim это пытается обойти, когда буфер, который вы редактируете, больше, чем может отображаться в данный момент. В зависимости от того, где находится курсор в буфере (точно в середине, в верхней половине, в нижней половине), как только вы сделаете :vs (вертикальное разделение), он будет прокручивать новый буфер вниз или вверх, где он думает лучше всего.

.vimrc отображение выше делает:

map <C-S-O>                                     map ctrl-shift-o to run this

            mm                                  mark the current cursor position

              H                                 move the cursor to the top of
                                                the buffer

               :vs<CR>                          do a vertical split

                      `m                        move to line and column of mark

                        <C-W>l                  move focus to the right to the
                                                original buffer

                              `m                move the cursor in the orig buffer
                                                back to the marked position

                                <C-W>h          move back to the new buffer on
                                                the left

Опять же, это работает большую часть времени для меня, не уверен, почему это не работает все время. В любом случае, надеюсь, это помогло некоторым

Это может произойти, потому что у вас есть длинные линии, которые сгруппированы по вертикали. если ты :set nowrap а потом :vsp Вы заметите, что этого не происходит.

Другие вопросы по тегам