Vim选择文本

5

我有一个长这样的文件:

1 148 1  4
2 333 1  3
3 534 2  3
4 772 g  7
5 921 p  2

我想要从第1行到第5行、第1列到第7列提取文本:
1 148 1  
2 333 1  
3 534 2  
4 772 g  
5 921 p   

我可以从vim命令行完成这个操作吗?如果我输入

:1,5ya a

整行被抓取到寄存器"a"中,我只想要特定的列。谢谢。
5个回答

2

您可以通过命令行执行任何命令,这里使用:normal来帮助您:

:execute "normal! 1G^\<C-v>6l5j\"ay"

这会创建一个块选择,然后将其复制到寄存器a中。使用:execute命令可以使用\<C-v>符号而不是直接插入它。它还允许您用变量替换硬编码的限制。


1
你无法从vim命令行以简单的方式完成这个操作。:y是一个按行处理的命令 - 它只影响整行。你需要的是按块处理。按块处理的命令涉及可视模式。因此,你能做的最好的事情是:
  1. 按CTRL-V开始可视化模式。
  2. 选择你想要的文本。
  3. "ay将所选文本复制到寄存器a中。

关于2:6l4j应该可以解决问题(假设您在块的左上角)。 - bitmask

0

虽然不太常规,但这应该可以工作:

:1,5y|put|-4,.s/\(.\{7\}\).*/\1/|-4,.d a

Yank 5 行,复制它们,删除所需列后的所有内容,并将其删除到缓冲区。

0
另一种适合脚本的方法:
:let @a = join(map(getline(1, 5), 'matchstr(v:val, ".*\\%<9v")'), "\n")

它将行作为列表 (getline()) 检索,然后通过特殊的 /\%<v 正则表达式原子匹配前7个虚拟列,并将其 (join() 作为字符串) 分配给寄存器 @a


0

我会这样做

C-vG2wy

然后就完成了(从文档顶部开始用gg

当然,如果您想要放在寄存器a中,请添加"a

C-vG2w"ay


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