如何让 vim 在打开分割时保留光标位置

如何让 vim 在打开分割时保留光标位置

当我在 vim 中打开垂直分割时,它会将我当前的行移到缓冲区的顶部(将整个文件向上滚动)。如何让 vim 保留其当前位置?

答案1

编辑:真正的答案: 看https://stackoverflow.com/questions/9625028/vim-buffer-position-change-on-window-split-annoyance

结论:此行为仅在第一次创建新窗口时发生。如果您关闭窗口并再次执行此操作,新缓冲区中的光标与旧缓冲区中的光标相同。那里的答案是做一些无用的事情,打开然后关闭窗口,然后进行垂直分割。

下面是另一个.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

再次强调,它对我来说大多数时候都有效,不确定为什么它不是一直有效。无论如何,希望这对一些人有所帮助

答案2

这可能是因为您的长行被垂直分割挤在一起了。如果您:set nowrap这样做,:vsp您会发现这种情况不会发生。

相关内容