Vim对应Emacs' open-rectangle命令的功能是什么?

6
Emacs有一个名为open-rectangle的函数,它允许您选择一个矩形区域(即Vim的可视块模式),然后按下组合键来用空格填充该矩形,将任何现有内容向右推送:
这在处理垂直对齐的文本列时非常有用。我觉得我也应该能够在Vim中轻松地做到这一点,使用可视块和搜索和替换。但是当我尝试时,似乎无法弄清楚为什么我的搜索和替换没有绑定到我的矩形上。
:'<,'>s/\^/    /

这实际上是缩进整行,而不是展开所选区域。我试过替换以下代码:
:'<,'>s/\v(.*)/   \1/

但是这种方法的效果相同。我如何让我的模式理解我只想用空格 + 选定区域替换选择块中的每一行?简单的替换,比如只是改变字母可以工作,但使用 "^" 或 " .* "并不按照我的预期工作。
我知道可以按"I"键插入一些空格然后返回到正常模式,但是当您需要缩进大量行时,很难判断。

@hammar,那似乎做的不对。它确实在所选区域周围填充了空格,但它却破坏了文本。 - d11wtq
啊,当然。我在回来这里之前刚刚弄清楚了。您能把那个发到答案里吗? :) 完美运作! - d11wtq
1
我猜你处理的是行中的出现次数,否则使用“>”符号可能更高效。 - Chris Morgan
行中出现的次数,是的。 - d11wtq
我更改了图片,使其更加明显,因为之前左边的内容不太清晰 ;) - d11wtq
3个回答

8
如何:
yPgvr<Space>

这将拖动块并粘贴以复制它,然后重新选择原始块并用空格替换它。

更高效:用y替换dP - Chris Morgan
@ChrisMorgan 那绝对更有意义,而且可以使撤销序列变得不那么混乱(如果您决定撤销的话)。 - d11wtq
我将这个绑定到了我的vimrc文件的<C-o>键。这一直是我从Emacs错过的东西之一,现在我又回来了。谢谢! - d11wtq

6

另一种方法:

  1. 只选择一个列的可视块。

  2. 按下 nI<Space><Esc>,其中 n 是您想要的空白列数。


这适用于任意数量的列。块选择模式中的 I 在选择之前的每一行插入文本,就像 A 在选择之后的每一行附加文本一样。 - Nathan Fellman
这是一个更通用的解决方案。我喜欢它。但你知道它在哪里有记录吗?我找不到任何相关信息。(不幸的是,可视化块模式的文档相当匮乏。) - Chris Morgan
“可视化块选择仅限于一列。” 当然,如果您想选择更多,也可以... 然后,nI<Space> 可以替换为 I 加上 n 个空格(这可能更容易在视觉上感知)。[啊,我讨厌用于评论的 Markdown 实现!它甚至比用于格式化问题和答案的实现还要糟糕!] - Chris Morgan
@d11wtq:如果按照这种方式进行操作,我更倾向于使用I<空格><空格><空格>...<Esc>而不是nI<空格><Esc>;这样你可以在第一行看到你要插入的内容。 - Chris Morgan
只是为了明确,我认为Hammar的答案是正确的方法,因为你不需要计算任何东西,一旦映射完成,它就非常通用。我只是想指出另一个选项,可能适用于其他情况。此外,我坚持“只有一列”,因为比多列更快,并且在这种情况下多列也是无用的。最后一点:nI<Space><Esc>I<Space><Space>…<Esc>更具可扩展性。 - romainl
显示剩余3条评论

2
作为对romainl回答的一个变化,我有以下建议:
vnoremap <C-Space> I<Space><Esc>gv

它允许通过前置计数一次插入n个空格,并通过对映射的重复应用来迭代添加列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接