当我在 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
您会发现这种情况不会发生。