在Vim的分屏视图中,可以通过为两个窗口设置:set scrollbind
相互绑定,以便进行滚动。完成此操作后,如果我在一个窗口中向下滚动光标,则另一个窗口也会随之向下滚动。
但是,两个窗口中的光标并不互相绑定。我使用了:set cursorline
来突出显示当前光标所在行。如何使突出显示的光标行在另一个窗口中同时滚动?
在Vim的分屏视图中,可以通过为两个窗口设置:set scrollbind
相互绑定,以便进行滚动。完成此操作后,如果我在一个窗口中向下滚动光标,则另一个窗口也会随之向下滚动。
但是,两个窗口中的光标并不互相绑定。我使用了:set cursorline
来突出显示当前光标所在行。如何使突出显示的光标行在另一个窗口中同时滚动?
我自己不使用这个,也许我没有理解重点,但是
:set cursorbind
看起来正好符合你的需求。
我也遇到了同样的情况(只有两个窗口可以比较),我的做法是:
: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
过于复杂以至于无法查看的文件,我认为这个设置已经足够实用了。
当我想在 vimdiff
会话中进行“跨窗口列跟踪”(除了“跨窗口行跟踪”)时,我提出了这个解决方案。可能这也能解决你的问题。
首先,在每个窗口上启用 cursorcolumn
、cursorbind
、cursorline
和 scrollbind
。
: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>
我在vim文档中发现了这个页面,认为你可能会觉得有用:http://vimdoc.sourceforge.net/htmldoc/scroll.html#scroll-binding
有时候,直接从源头获取信息是最好的。
我对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 很好。
gg
)来实现吗? - puk