Vim:在可视块模式下快速选择矩形文本块

时间:2013-09-13 17:17:02

标签: vim

我正在寻找一种在视觉模式下选择文本块的快速方法。我处理这种性质的文件:

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

我的目标是在视觉块模式中选择中间块。我愿意:

  1. 导航到角落(X所在的位置)
  2. CTRL-V
  3. 'e'将选择范围扩展到块的结尾
  4. 'jj'或'2j'将选择向下扩展到块的底部。
  5. 我正在寻找(4)的替代方案,类似于'e',将移动到块的最后一行。在这个简单的例子中,'jj'不是太不方便,但有时这些都是大块。

    有一个类似的问题here,但这涉及跳过预定数量的行。有没有办法做到这一点,再次类似于'e',但是逐行而不是逐列移动?谢谢!

3 个答案:

答案 0 :(得分:5)

X开始,您可以使用<C-v>}kee

执行此操作
  1. <C-v> - 启动blockwise visual mode
  2. } - 转到段落的末尾(该动议据称提供了这个相当复杂的组合的好处)
  3. k - 上面一个排除空行
  4. 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