切换滚动条有很奇怪的副作用

时间:2014-06-27 11:21:31

标签: vim

受到https://stackoverflow.com/a/18466534/42580的启发,我将其插入.vimrc

nmap <F2> :windo set invscrollbind<cr>

点击<F2>成功切换所有窗口上的滚动条。 但是我想要了解一些奇怪的事情:

  1. 当打开和关闭焦点时,焦点从当前活动的窗口移动到右下角的窗口。我希望重点留下来!
  2. 如果我绑定两个窗口,向下滚动一个屏幕,然后取消绑定(用),我希望没有视觉上的变化。但是,未聚焦的窗口会滚动回到绑定之前的位置(一个屏幕向上)。为什么以及如何避免这种情况?

3 个答案:

答案 0 :(得分:1)

我知道这篇文章不是答案,但也许可以解决你的问题:这个函数打开窗口同步,如diff,但没有着色:

let s:sync_win = 0

function SyncWin()

  let nr = winnr()
  let s:sync_win = 1 - s:sync_win

  if ! s:sync_win
    windo set noscrollbind nocursorbind
    exe nr . 'wincmd w'
    return
  endif

  windo set scrollbind cursorbind nowrap
  exe nr . 'wincmd w'
  syncbind
  set scrollopt+=hor

endfunction
编辑:对不起简短描述,但我没有时间。

要使用该功能将其放在.vimrc的末尾,请在两个分割中打开要比较的文件,然后:

:call SynWin()

要关闭同步,请再次调用。

答案 1 :(得分:1)

你无法重现的第二个问题。

您的第一个问题是因为您使用了windowindo会遍历所有窗口并执行命令,最后将焦点放在最后一个窗口上。您可以做的是在完成windo后移至上一个窗口。这张<expr>地图可以提供帮助:

nnoremap  <expr> <F2> ":windo set invscrollbind\<cr>:".winnr()."wincmd w\<cr>"

答案 2 :(得分:0)

回答2

我在.vimrc中使用this tip来阻止窗口在缓冲区之间切换时上下跳跃。但这确实与滚动绑定发生冲突。我重命名了var然后没有问题:

au BufLeave * if !&diff | let b:URwinview = winsaveview() | endif
au BufEnter * if exists('b:URwinview') && !&diff | call winrestview(b:URwinview) | unlet! b:URwinview | endif