防止 Vim 预览窗口移动主窗口

7

有没有在打开/关闭预览窗口时使用的autocmd

当打开预览窗口时,我想将主窗口向上滚动n行;当关闭预览窗口时,我想将主窗口向下滚动n行,以抵消本地发生的“移动文本”效果。

我是否可以使用相关的autocmd来实现这一点(它是什么),或者是否有更好的方法让我实现这一点?

4个回答

2

没有这样的 autocmd event。但是您可以使用与 previewwindow 选项相关的 WinEnterBufDelete 来实现类似的功能。

使用 WinEnter 您可以检查 previewwindow;如果您在预览窗口上,您可以设置一个缓冲区变量来区分此事件和可能由移动到另一个窗口并返回预览窗口生成的后续事件。 当预览窗口关闭时,您还可以设置 au BufDelete <buffer> call MyRestoreMainWindow() 调用您的函数。


0
我其实也在想同样的问题,只不过是关于选项卡栏 -- 如何防止当选项卡栏显示或隐藏时发生的烦人移位。你考虑过使用包装函数吗?以下代码似乎适用于ps示例(如果预览窗口会遮挡光标,则仍会导致移位)。
se splitbelow splitright
fun! PsWrapper(text)
     let view=winsaveview()
     exe 'ps' a:text
     call winrestview(view)
endfun

既然我们在这里……选项卡栏似乎需要一些黑魔法。也就是说,正如有人指出的那样,如果光标在中间线以上,选项卡栏会导致文本向下滚动(??)。但这似乎可以解决问题——始终显示选项卡栏:

let [view,g:stal]=[winsaveview(),&stal]
let [view.topline,&stal]=[view.topline+!g:stal,2]
call winrestview(view)

并恢复原始的选项卡设置

let [view.topline,&stal]=[view.topline-!g:stal,g:stal]
call winrestview(view)

你应该让选项卡栏一直可见。总是能从顶部看到自己所在的文件,这样做不会有任何坏处... - Steven Lu

0

你不能仅通过简单的 autocmd 来实现这个功能 - 使用 WinEnter/WinLeave/BufEnter/BufLeave 自动命令都有一些小问题(在 vim 文档中说明),因此它们无法完全解决你的问题。

如果在打开分割窗口时出现这种情况,那么你可以像 @romainl 建议的那样,在你的 .vimrc 文件中定义:

set splitright
set splitbelow

但是... 当打开各种“预览”窗口或使用vim提供的快速修复或位置列表窗口时,这仍然会发生。我经常使用它们,这个问题真的很烦人,所以我写了一个插件来解决这个问题。
你可以在这里查看:https://github.com/gillyb/stable-windows

它通过维护vim布局中打开窗口的光标位置和顶部行号的状态来工作,并在每次切换到不同的缓冲区时恢复它们。
它相对较新(截至撰写本答案),因此如果您发现任何错误,请随时提出问题,我将尽快解决。

希望这有所帮助! :)


0

我经常看到这个问题,总是摇头不解人们谈论的窗口切换是什么,我却没有体验过。

现在,我终于想到了,在很久以前我添加到~/.vimrc中的两个选项有一个好处,那就是防止了这种可怕的窗口切换:

set splitbelow
set splitright

试一试吧!


1
我也有这些设置,但我说的是当执行 :ps /something/,然后执行 :pclose 时发生的移动。 - Michael Robinson
你是正确的。只有当光标位于窗口中心以下时,这种移动才会发生。也许可以使用类似 nnoremap <leader>ps zt:ps 的方式来解决? - romainl
1
我想要防止窗口每次打开时移动,实际上我从来没有使用过 :ps,它只是一个展示问题的例子。 - Michael Robinson
没有相应的选项或自动命令。 - romainl
我认为这与scrolloff选项有关。我将其设置为10,这会使光标在打开窗口时移动。当我将其设置为0时,光标不再移动。虽然我喜欢scrolloff功能,但如何使它们共存呢? - iago-lito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接