【发布时间】:2013-06-06 10:40:04
【问题描述】:
预览窗口打开/关闭时是否有autocmd?
我想在预览窗口打开时将主窗口向上滚动 n 行,然后在关闭时向下滚动 n 行,以抵消本机发生的“移动文本”效果。
我可以通过相关的autocmd(以及它是什么)来做到这一点,还是有更好的方法来实现这一点?
【问题讨论】:
预览窗口打开/关闭时是否有autocmd?
我想在预览窗口打开时将主窗口向上滚动 n 行,然后在关闭时向下滚动 n 行,以抵消本机发生的“移动文本”效果。
我可以通过相关的autocmd(以及它是什么)来做到这一点,还是有更好的方法来实现这一点?
【问题讨论】:
没有这样的autocmd event。但是您可以使用与previewwindow 选项关联的WinEnter 和BufDelete 来实现类似的效果。
使用WinEnter可以查看previewwindow;如果您在预览窗口中,您可以设置一个缓冲区变量,以将此事件与可以通过移动到另一个窗口并返回预览窗口生成的后续事件区别开来。你也可以设置au BufDelete <buffer> call MyRestoreMainWindow()在预览窗口关闭时调用你的函数。
【讨论】:
我看到这个问题经常被问到,而且总是让我头疼不已,想知道那些改变窗户的人谈论我没有经历过的事情。
好吧,今天我突然想到,我很久以前添加到我的~/.vimrc 中的两个选项具有防止可怕的窗口移动的令人愉快的副作用:
set splitbelow
set splitright
试一试!
【讨论】:
:ps /something/,然后是:pclose。
nnoremap <leader>ps zt:ps ?
:ps,这只是一个显示问题的示例。
scrolloff 选项有关。我将它设置为10,这会使光标在窗口打开时移动。当我将光标设置为0 时,光标不再移动。不过,我喜欢scrolloff 功能。如何让他们同居?
我实际上想知道除了标签栏之外的同一件事 - 如何防止在显示或隐藏标签栏时发生烦人的转变。您是否考虑过包装器功能?以下似乎适用于 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)
并恢复原来的tabbar设置
let [view.topline,&stal]=[view.topline-!g:stal,g:stal]
call winrestview(view)
【讨论】:
你不能用简单的 autocmd 真正做到这一点 - 使用 WinEnter/WinLeave/BufEnter/BufLeave 自动命令都有一些小问题(在 vim 文档中说明),因此它们不会始终如一地完全解决你的问题。
如果您在打开拆分时发生这种情况,那么您可以像@romainl 建议的那样通过在您的 .vimrc 中定义来解决这个问题:
set splitright
set splitbelow
但是...当打开各种“预览”窗口或使用 vim 必须提供的快速修复或位置列表窗口时,仍然会发生这种情况。我经常使用它们,这个问题让我很恼火,所以我写了一个插件来解决这个问题。
你可以在这里查看:https://github.com/gillyb/stable-windows
它的工作原理是保持 vim 布局中打开的窗口的光标位置和顶行号的状态,并在每次切换到不同的缓冲区时恢复它们。
它相对较新(在撰写此答案时),因此如果您发现任何错误,请随时打开问题,我会尝试快速解决它们。
希望这会有所帮助! :)
【讨论】: