如何实现选择不同行长的不同文本?


10

假设我有以下文本:

aaa-dd-e:“ aaa”,
bb-x:“ bb”,
c-9:“ c”

我想做如下选择:

aaa-dd-e:“ aaa”,
bb-x:“ bb”,
c-9:“ c”

我尝试使用cv创建可视块,但是在第一列上创建选择并按“ f:”(我的意思是在上面的每一行上将选择扩展到冒号)之后,我得到的是:

aaa-dd-e:“ aaa
bb-x”,:“ bb”,
c-9:“ c”

选择将在第一个冒号处停止并创建一个矩形。


6
您希望通过该选择实现什么,可能还有另一种方式
Arjen Dijkstra 2015年

如果以字符分隔,则可以尝试先重新对齐块,然后再选择它。请参阅:仅在VIM中的第一个分隔符上对齐文本
kenorb

Answers:


6

选择通常是达到目的的手段,在Vim中更是如此,因为通常Vim首先不需要选择。

假设您仍想在非JSON文件中的属性名称周围加上引号,以将其转换为正确的JSON:

  1. 选择要修改的行,无论是按字符还是按行,都没关系,
  2. :'<,'>norm I"^[f:i"'<,'>会自动为您插入,并^[通过提供<C-v><Esc>)。

如果您有漂亮的环绕声插件,则步骤2变为:

:'<,'>norm ^vt:S"

通过替换,步骤2可能变为:

:'<,'>s/^\s*\([^:]*\):/"\1"

你们是对的,我现在发现视觉选择可能没有必要。在或的帮助下:g/regex/norm,我可以轻松实现自己想做的任何事情。
亚伦沉

有什么办法可以将整个选定的块放入系统剪贴板并粘贴到另一个文件中?
亚伦·申

当然。假设Vim是在剪贴板支持下编译的,则可以执行"+y"*y,这取决于要定位的剪贴板。这里有很多相关的问题。
romainl'9

14

Vim仅支持矩形按块选择,但按时锯齿状的右边框除外$

有一些插件(例如vim多个游标)可以模拟多个选择,但是您也应该能够使用纯Vim命令实现您的实际目标(不幸的是您没有提到),例如:global:substitute(如果可以制定一个常规的表达式,以匹配每行中的选择),或者通过重复宏(如果有特定的动作覆盖每行中的选择)。


如果要剪切这些行并粘贴到另一个缓冲区中怎么办?
亚伦·申

1

只是要戴上帽子,如果您真的想使用视觉选择,则可以使用Tabular插件排列冒号,然后进行视觉选择。

如果您使用原始文字:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs 将对齐结肠后的所有内容,如下所示

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

然后,您可以选择可视块。

但是,正如其他人所说,在这种情况下,视觉选择可能不是必需的。使用norm或替换可能会完成您想要的操作,而不必大惊小怪。


1

我已经找到了解决这个问题的方法,它非常简单!从要复制的文本的底部开始可视块模式,然后向上选择!当您向上移动时,它将扩展该块,而如果您向下突出显示,则会使选择范围缩小。


但是这样一来,它将永远是一个矩形块,对吗?在我阅读本文时,这不是OP想要的(他们提到他们尝试了可视块模式)。
马丁·图尔诺伊

否。如果所有线的长度相同,它将始终是一个矩形块。我发现从底部开始并向上突出显示,然后按$转到行的末尾将导致所有突出显示的行都突出显示到该行的末尾。
亚瑟·鲍尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.