Vim:如何使光标所在行也滚动绑定?

20

在Vim的分屏视图中,可以通过为两个窗口设置:set scrollbind相互绑定,以便进行滚动。完成此操作后,如果我在一个窗口中向下滚动光标,则另一个窗口也会随之向下滚动。

但是,两个窗口中的光标并不互相绑定。我使用了:set cursorline来突出显示当前光标所在行。如何使突出显示的光标行在另一个窗口中同时滚动?


我无法确定您是想使用“scrollbind”绑定多个窗口的相对偏移量,还是使用“cursorbind”设置光标的绝对偏移量。 - puk
Puk:两个分割窗口已经绑定。现在,我希望光标也可以沿着窗口中的相同行向下移动。因此,如果我从窗口1的第10行移动光标到第11行,我希望在窗口2中也发生相同的情况。 - Ashwin Nanjappa
你想要的基本上是两个窗口,无论它们是否显示相同的文件,始终指向同一行?在执行“set scrollbind”之前,你不能通过转到两个文件的顶部(gg)来实现吗? - puk
5个回答

23

我自己不使用这个,也许我没有理解重点,但是

:set cursorbind

看起来正好符合你的需求。


4
今天我仍然学到了有关 Vim 的新东西。它是一个功能丰富的应用程序! - Benoit
4
Prince Goulash: 谢谢,cursorbind 命令似乎部分达到了我的需求。当我滚动窗口时,光标没有更新。但是当我切换到下一个窗口时,光标就同步了。 - Ashwin Nanjappa
@Ashwin 我这里也遇到了同样的问题。你找到解决办法了吗? - Yang
@Yang:不,我还没有得到 :-( - Ashwin Nanjappa
当且仅当两个光标距离所在行末尾不超过一个字符时,它们才绑定到两个窗口。 - Tjaart
显示剩余2条评论

12

我也遇到了同样的情况(只有两个窗口可以比较),我的做法是:

:set cursorbind
:set scrollbind
:set cursorline

然后

:map <Down> j<C-w><C-w><C-w><C-w>
:map <Up> k<C-w><C-w><C-w><C-w>

这会导致每次按上下箭头都在窗口之间来回切换一次,这将更新另一个窗口的光标位置(您可以使用:redraw!<CR>而不是丑陋的窗口切换,但在移动过快时看起来很糟糕)。当然,有许多方法可以在没有箭头的情况下移动行,因此这远非完美。

然而,由于这对我来说不是主要的工作模式,主要用于比较文件,对于其中diff过于复杂以至于无法查看的文件,我认为这个设置已经足够实用了。


可以使用“:syncbind”而不是在窗口之间切换。即::map j j:syncbind<cr> - elig

6

当我想在 vimdiff 会话中进行“跨窗口列跟踪”(除了“跨窗口行跟踪”)时,我提出了这个解决方案。可能这也能解决你的问题。

首先,在每个窗口上启用 cursorcolumncursorbindcursorlinescrollbind

:windo set cursorcolumn | set cursorbind | set cursorline | set scrollbind

然后将hjkl动作键映射到每个移动操作的光标位置更新。

:nmap h h:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>
:nnoremap j j:let curwin=winnr()<CR>:keepjumps windo redraw<CR>j:execute curwin . "wincmd w"<CR>
:nmap k k:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>
:nmap l l:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>

2

1

我对cychoi的回答做了微小的更改。在差异模式中重新映射h,j,k,l并删除cychoi原始映射中的一个‘j’命中。

if &diff
  au VimEnter * windo set cursorcolumn | set cursorbind | set cursorline | set scrollbind
  nmap h h:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>
  nmap j j:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>
  nmap k k:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>
  nmap l l:let curwin=winnr()<CR>:keepjumps windo redraw<CR>:execute curwin . "wincmd w"<CR>
endif

我认为这个设置对于逐行比较 CSV 很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接