Vim:转到可视区域的开头或结尾

Vim:转到可视区域的开头或结尾

我想做一些棘手的映射,用一些代码包裹当前选定的可视区域。为了做到这一点,我需要确保我位于当前可视区域的开头。在可视模式下是否有任何热键可以执行此操作?

答案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”即可转到行的绝对开头。

相关内容