防止Vim预览窗口移动main

时间:2013-06-06 10:40:05

标签: vim autocmd

预览窗口打开/关闭时是否有autocmd

我希望在预览窗口打开时向上滚动主窗口n行,然后在关闭时向下滚动n行,以抵消本机发生的“移动文本”效果。

我是否能够使用相关的autocmd(以及它是什么)来实现这一目标,还是有更好的方法来实现这一目标?

4 个答案:

答案 0 :(得分:2)

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

使用WinEnter,您可以查看previewwindow;如果您在预览窗口中,则可以设置缓冲区变量以使此事件与可通过移动到另一个窗口并返回到预览窗口生成的后续事件不同。您还可以设置au BufDelete <buffer> call MyRestoreMainWindow()以在预览窗口关闭时调用您的功能。

答案 1 :(得分:0)

我经常看到这个问题,总是抓住我的脑袋,想知道那些让我没有经历过的窗口转换的人会怎么说。

好吧,今天我突然意识到,很久以前我添加到~/.vimrc的两个选项具有避免可怕的窗口移动的令人愉快的副作用:

set splitbelow
set splitright

试一试!

答案 2 :(得分: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)

答案 3 :(得分:0)

使用简单的autocmd不能真正做到这一点-使用WinEnter / WinLeave / BufEnter / BufLeave自动命令都具有一些小怪癖(在vim文档中有说明),因此它们不能始终如一地完全解决您的问题。

如果在打开拆分时发生这种情况,那么可以通过在.vimrc中进行定义来解决@romainl建议的问题:

set splitright
set splitbelow

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

它的工作方式是保持光标位置的状态和在vim布局中打开的窗口的顶行号,并在每次切换到其他缓冲区时恢复它们。
它是相对较新的(截至撰写此答案时),因此,如果您发现有任何错误可随时打开一个问题,我将尝试快速解决。

希望这会有所帮助! :)