我想做一些棘手的映射,用一些代码包裹当前选定的可视区域。为了做到这一点,我需要确保我位于当前可视区域的开头。在可视模式下是否有任何热键可以执行此操作?
答案1
如果我理解正确的话,你也许可以使用
`<
和
`>
棘手的是,他们去的开始/结束以前的可视区域,而不是当前区域。
因此,你可以做这样的事情:
:vmap __ <Esc>`>aEND<Esc>`<iSTART<Esc>l
在我的 Vim 版本中,使用该序列后,最后的可视区域略显不稳定(重新选择它会gv
选择一个不太正确的区域)。
在当前的用户可以交互使用的可视区域o
(如果使用块区域的话也可能如此O
),但如果您想在地图中使用它们,这些区域是不确定的。
因此,我编写了下面的函数来制作o
(定义为_^
和_$
下面的)的确定性版本。示例_*
命令使用它们执行与上述类似的“包装” ,但也假装在包装后__
重新选择区域()以保持所选的可视区域:1v
:function! MoveToVisualAreaExtrema(wantEnd) range
: normal gv
: let l:mode = mode()
: " only character (v) and line mode (V) work with this implementation
: if !(l:mode == 'v' || l:mode == 'V')
: throw 'must be in character- or line-visual mode'
: endif
: " get original posision
: let l:iLn = line('.')
: let l:iCl = col('.')
: " move to other end of visual selection
: normal o
: " get current position
: let l:cLn = line('.')
: let l:cCl = col('.')
: let l:atEnd = (l:cLn > l:iLn) || (l:cLn == l:iLn) && (l:cCl > l:iCl)
: if a:wantEnd != l:atEnd
: normal o
: endif
: if l:mode == 'V'
: execute 'normal ' . (a:wantEnd ? '$' : '0')
: endif
:endfunction
:vmap _^ :call MoveToVisualAreaExtrema(0)<CR>
:vmap _$ :call MoveToVisualAreaExtrema(1)<CR>
:" Example: wrap ";print q();" around the visual region
:vmap _* _$<Esc>a);<Esc>gv_^<Esc>i;print q(<Esc>l1v
答案2
大写 H(“Home”)将带您回到开头,大写 L(“Last”)将带您回到结尾。
可能会给您带来麻烦的一种行为是,这些行为将光标放在行的第一个非空白字符上,因此键入“0”即可转到行的绝对开头。