Vim:不同视觉模式下的不同地图

时间:2014-08-13 14:37:00

标签: vi vim

我使用常见的技巧让j和k在正常模式下通过将其添加到我的vimrc包装线更好地工作:

nnoremap <silent> j gj
nnoremap <silent> k gk

我只是考虑在视觉模式下使用它:

vnoremap <silent> j gj
vnoremap <silent> k gk

它在普通视觉模式下效果很好,但它在视线模式(Shift + V)或视觉模式下很糟糕。因为我想在这些模式中移动实际行,而不是在同一行中上下移动。

我怎样才能在正常视觉模式下使用此地图?

2 个答案:

答案 0 :(得分:3)

无法让gj使用V (line-wise visual)模式。

假设它可以工作,那么当你在很长(包裹)的线上做gj时,vim将选择一条线的一部分,也就是说,它不再是直线视觉模式

按行选择的最小选定单位应为一行。

更新

我必须澄清,如果您选择了V在选定区域中的长行,gj有效,它会向上/向下移动光标。但是如果你想让gj另外选择一个&#34;屏幕线&#34;下来,它不会工作,gj这里与j

相同

UPDATE2

对于OP的评论,

一种解决方法(仅以j/gj为例)

nnoremap V :vnoremap j j<cr>V
nnoremap v :vnoremap j gj<cr>v

或(Peter Rincker的建议)

xnoremap <expr> j mode() ==# 'V' ? 'j' : 'gj'

答案 1 :(得分:0)

感谢@Kent他的回答,我找到了一种方法,让我的工作方式符合我的想法。

nnoremap <silent> V :silent! vunmap j<cr>:silent! vunmap k<cr>V
nnoremap <silent> v :vnoremap j gj<cr>:vnoremap k gk<cr>v
vnoremap <silent> V <esc>:silent! vunmap j<cr>:silent! vunmap k<cr>gvV
vnoremap <silent> v <esc>:vnoremap j gj<cr>:vnoremap k gk<cr>gvv

然而,我确实认为这是一个丑陋的黑客,因为它会在每次按vV时取消映射并映射密钥。