【问题标题】:Vim: Quickly select rectangular blocks of text in visual-block modeVim:在可视块模式下快速选择矩形文本块
【发布时间】:2013-09-18 11:12:06
【问题描述】:

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

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' 将选择向下扩展到块的底部。

我正在寻找 (4) 的替代方法,类似于“e”,将移动到块的最后一行。在这个简单的示例中,“jj”并不太方便,但有时这些是大块。

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

【问题讨论】:

  • 我觉得用记号不会太不方便...

标签: vim


【解决方案1】:

X 开始,您可以使用<C-v>}kee 执行此操作:

  1. <C-v> – 开始分块视觉模式
  2. } – 转到段落的末尾(据说该议案提供了这个相当复杂的组合的好处)
  3. k - 上面一个排除空行
  4. ee – 将光标从第一列移动到内部块的末尾。

【讨论】:

    【解决方案2】:

    我在尝试制作“选择光标周围的可视块”功能时获得了一些乐趣。

    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>
    

    你可以试试&lt;Leader&gt;vb:它应该选择光标周围任何连续的非空白矩形块。纵轴是首选。

    也许我稍后会改进它,但现在你可以试试它是否能解决你的问题,如果你愿意的话。

    作为我自己尝试的替代方案,您可以尝试流行的插件 textobj-word-column。它为您提供文本对象 ac ic aC iC 以选择一列单词或单词。

    【讨论】:

    • +1 textobj-word-column 确实让这种事情变得非常简单
    • @PeterRincker 真的吗?我总是觉得推荐 textobj-word-column 很糟糕,因为它从来没有为我工作过……它是一种“请按我的意思做”的插件,它似乎从来没有理解我的意思。我最终摆脱了它。
    • 我同意“请按我的意思做”插件位。这可能令人沮丧。在“明显”的情况下它运作良好。我相信这是。我个人有一个叉子,它使用周围的边界来帮助减少它的渴望。但是,我不确定它是否已准备好迎接黄金时段。我真的应该把它放在github上
    • 非常感谢您花时间编写这个不错的函数。实际上,textobj-word-column 插件非常适合我的需求,具有更多的灵活性。
    【解决方案3】:

    使用v 启动可视模式。然后用ip 选择内段。使用&lt;C-v&gt; 进入可视块模式。现在只需根据需要使用es 转到块的末尾即可。

    从块的右下角开始是一样的,但不是e,而是使用w

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2012-09-06
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2010-10-22
      • 2020-09-09
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多