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

1353
cmhobbs

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

2
Какую команду или клавишу вы используете точно? Мне интересно, потому что клавиши `Ctrl-WV` и`: vsplit` не перемещают курсор для меня. xaizek 11 лет назад 0
Вы как-нибудь изменили свой _vimrc? EBGreen 11 лет назад 0
Вот мой vimrc: https://gist.github.com/1bf9c5228c74cbb2ed1d Я использую ctl + w, v, чтобы открыть сплит, но: vsplit также демонстрирует это поведение. cmhobbs 11 лет назад 0
Я не видел ничего вероятного в вашем .vimrc. Это, вероятно, один из ваших плагинов. Вы можете попробовать запустить vim как `vim -N -u NONE` и посмотреть, исчезнет ли проблема. Поскольку `: vsplit` также вызывает проблему, скорее всего, это автокоманда, а не отображение. Вы можете попробовать `: au! filetypedetect` (чтобы избавиться от этой группы и упростить просмотр остальных), а затем `: au`, чтобы вывести список всех автокоманд и посмотреть, не выглядят ли они подозрительно. garyjohn 11 лет назад 0
Это демонстрирует такое же поведение при запуске vim -N -u NONE. Единственный плагин, который у меня есть, это буфер. Я пошел так далеко, чтобы удалить его безрезультатно. Обратите внимание, что это происходит как в Debian, так и в OSX 10.8. cmhobbs 11 лет назад 0

2 ответа на вопрос

1
Markus Orreilly

EDIT: REAL ANSWER: see https://stackoverflow.com/questions/9625028/vim-buffer-position-change-on-window-split-annoyance

TLDR: This behavior only happens on the first time a new window is created. If you close the window and do it again, the cursor in the new buffer is the same as in the old buffer. The answer on there was to do something useless that opens then closes a window, and then to do your vertical split.

Here's another .vimrc mapping that wraps the answer from stackoverflow to do that for you:

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

So when you press ctrl-shift-o it will open a new blank tab (:tabnew<CR>), delete the buffer (:bwipeout<CR>) and then do your vertical split (:vs<CR>)

Hope this is better - works perfectly for me. Thanks for making me want to figure out something usable to work around this annoying behavior!


This happens all the time to me! I recently came up with an answer that works most of the time (better than nothing though). Put this in your .vimrc:

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

Everytime you press ctrl+shift+o it should do a vertical split and put the cursor on the same line and column you had it in the original buffer before you split.

The behavior in vim that this tries to get around is when the buffer you are editing is larger than can be currently displayed. Depending on where the cursor is in the buffer (exactly in the middle, upper-half, lower-half), once you do a :vs (vertical split), it will scroll the new buffer down or up to where it thinks best.

The .vimrc mapping above is doing:

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 

Again, it works most of the time for me, not sure why it doesn't work all the time. Anyways, hope this helped some

На самом деле, «set splitright» из комментариев в принятом сообщении, которое вы связали, решило проблему, однако вся тема была очень проницательной. Принятие, потому что связанное решение решило мою проблему. cmhobbs 11 лет назад 0
0
Conner

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

Настройка nowrap, похоже, никак не влияет на него. Даже если у меня есть буфер с достаточно короткими строками, чтобы избежать переноса с помощью разбиения, мой курсор все равно переходит на верхнюю часть экрана. cmhobbs 11 лет назад 0
Хм, ну, я не могу воспроизвести это. Какая версия vim это? Conner 11 лет назад 0
VIM - Vi IMproved 7.2 (9 августа 2008 г., составлено 5 апреля 2012 г. 10:17:30) Включенные исправления: 1-411 cmhobbs 11 лет назад 0