7

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

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

我是否能够通过相关autocmd(以及它是什么)来做到这一点,还是有更好的方法让我实现这一目标?

4

4 回答 4

2

没有这样autocmd event的。但是你可以使用WinEnterBufDelete关联previewwindow选项来实现类似的东西。

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

于 2013-06-06T14:24:16.593 回答
0

我经常看到这个问题被问到,并且总是挠头,想知道那些改变窗户的人谈论我没有经历过的事情。

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

set splitbelow
set splitright

试试看!

于 2013-06-06T14:50:59.817 回答
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)
于 2013-12-30T09:15:29.737 回答
0

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

如果您在打开拆分时发生这种情况,那么您可以像@romainl 建议的那样解决这个问题,方法是在您的 .vimrc 中定义:

set splitright
set splitbelow

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

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

希望这可以帮助!:)

于 2019-10-04T10:58:57.967 回答