有没有在打开/关闭预览窗口时使用的autocmd
?
当打开预览窗口时,我想将主窗口向上滚动n行;当关闭预览窗口时,我想将主窗口向下滚动n行,以抵消本地发生的“移动文本”效果。
我是否可以使用相关的autocmd
来实现这一点(它是什么),或者是否有更好的方法让我实现这一点?
没有这样的 autocmd event
。但是您可以使用与 previewwindow
选项相关的 WinEnter
和 BufDelete
来实现类似的功能。
使用 WinEnter
您可以检查 previewwindow
;如果您在预览窗口上,您可以设置一个缓冲区变量来区分此事件和可能由移动到另一个窗口并返回预览窗口生成的后续事件。 当预览窗口关闭时,您还可以设置 au BufDelete <buffer> call MyRestoreMainWindow()
调用您的函数。
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)
你不能仅通过简单的 autocmd 来实现这个功能 - 使用 WinEnter/WinLeave/BufEnter/BufLeave 自动命令都有一些小问题(在 vim 文档中说明),因此它们无法完全解决你的问题。
如果在打开分割窗口时出现这种情况,那么你可以像 @romainl 建议的那样,在你的 .vimrc 文件中定义:
set splitright
set splitbelow
但是... 当打开各种“预览”窗口或使用vim提供的快速修复或位置列表窗口时,这仍然会发生。我经常使用它们,这个问题真的很烦人,所以我写了一个插件来解决这个问题。
你可以在这里查看:https://github.com/gillyb/stable-windows
它通过维护vim布局中打开窗口的光标位置和顶部行号的状态来工作,并在每次切换到不同的缓冲区时恢复它们。
它相对较新(截至撰写本答案),因此如果您发现任何错误,请随时提出问题,我将尽快解决。
希望这有所帮助! :)
我经常看到这个问题,总是摇头不解人们谈论的窗口切换是什么,我却没有体验过。
现在,我终于想到了,在很久以前我添加到~/.vimrc
中的两个选项有一个好处,那就是防止了这种可怕的窗口切换:
set splitbelow
set splitright
试一试吧!
:ps /something/
,然后执行 :pclose
时发生的移动。 - Michael Robinsonnnoremap <leader>ps zt:ps
的方式来解决? - romainl:ps
,它只是一个展示问题的例子。 - Michael Robinsonscrolloff
选项有关。我将其设置为10
,这会使光标在打开窗口时移动。当我将其设置为0
时,光标不再移动。虽然我喜欢scrolloff
功能,但如何使它们共存呢? - iago-lito