2

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

2 ответа2

1

РЕДАКТИРОВАТЬ: РЕАЛЬНЫЙ ОТВЕТ: см. 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 которое пытается обойти это, - это когда буфер, который вы редактируете, больше, чем может отображаться в данный момент. В зависимости от того, где находится курсор в буфере (точно в середине, в верхней половине, в нижней половине), после того, как вы выполните a :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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .