我正在寻找一种在视觉模式下选择文本块的快速方法。我处理这种性质的文件:
aaaa bbbb cccc
aaaa bbbb cccc
aaaa bbbb cccc
dddd Xeee ffff
dddd eeee ffff
dddd eeee ffff
gggg hhhh iiii
gggg hhhh iiii
gggg hhhh iiii
我的目标是在视觉块模式中选择中间块。我愿意:
我正在寻找(4)的替代方案,类似于'e',将移动到块的最后一行。在这个简单的例子中,'jj'不是太不方便,但有时这些都是大块。
有一个类似的问题here,但这涉及跳过预定数量的行。有没有办法做到这一点,再次类似于'e',但是逐行而不是逐列移动?谢谢!
答案 0 :(得分:5)
从X
开始,您可以使用<C-v>}kee
:
<C-v>
- 启动blockwise visual mode }
- 转到段落的末尾(该动议据称提供了这个相当复杂的组合的好处)k
- 上面一个排除空行ee
- 将光标从第一列移动到内部块的末尾。答案 1 :(得分:4)
尝试使用“选择光标周围的视觉块”功能,我有一些乐趣。
function! ContiguousVBlock()
let [lnum, vcol] = [line('.'), virtcol('.')]
let [top, bottom] = [lnum, lnum]
while matchstr(getline(top-1), '\%'.vcol.'v.') =~# '\S'
let top -= 1
endwhile
while matchstr(getline(bottom+1), '\%'.vcol.'v.') =~# '\S'
let bottom += 1
endwhile
let lines = getline(top, bottom)
let [left, right] = [vcol, vcol]
while len(filter(map(copy(lines), 'matchstr(v:val,"\\%".(left-1)."v.")'),'v:val=~#"\\S"')) == len(lines)
let left -= 1
endwhile
while len(filter(map(copy(lines), 'matchstr(v:val,"\\%".(right+1)."v.")'),'v:val=~#"\\S"')) == len(lines)
let right += 1
endwhile
call setpos('.', [0, top, strlen(matchstr(lines[0], '^.*\%'.left.'v.')), 0])
execute "normal! \<C-V>"
call setpos('.', [0, bottom, strlen(matchstr(lines[-1], '^.*\%'.right.'v.')), 0])
endfunction
nnoremap <Leader>vb :<C-U>call ContiguousVBlock()<CR>
您可以使用<Leader>vb
进行尝试:它应该选择光标周围的任何连续的非空白矩形块。垂直轴是首选。
也许我稍后会改进它,但是如果你愿意,现在你可以尝试解决你的问题。
作为我本土尝试的替代方案,您可以尝试使用热门插件 textobj-word-column 。它为您提供了文本对象ac
ic
aC
iC
来选择一列单词或WORD。
答案 2 :(得分:2)
使用v
启动可视模式。然后选择带有ip
的内部段落。使用<C-v>
进入可视屏蔽模式。现在只需根据需要使用e
转到块的末尾。
从块的右下角开始是相同的,但使用e
而不是w
。