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”,我只想要某些列。

谢谢。

4

5 回答 5

2

您可以在命令行上执行任何命令,这里借助:normal

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

这会构建一个分块选择,然后将其拉到注册一个。使用:execute是为了\<C-v>可以使用符号而不是直接插入它。它还允许您用变量替换硬编码的限制。

于 2013-02-15T20:31:41.097 回答
1

您不能从 vim 命令行以简单的方式执行此操作。 :y是一个逐行命令 - 它只影响整行。您正在寻找的内容被认为是blockwise。逐块命令涉及可视模式。所以你能做的最好的就是:

  1. CTRL-V 启动可视模式。
  2. 突出显示您想要的文本。
  3. "ay将突出显示的文本拉入 register a
于 2013-02-15T20:13:15.997 回答
0

不是很笼统,但这应该可行:

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

Yank 5 行,放置(复制)它们,删除所需列之后的所有内容,将它们删除到缓冲区中。

于 2013-02-15T20:10:32.167 回答
0

另一种方法,更适合脚本:

:let @a = join(map(getline(1, 5), 'matchstr(v:val, ".*\\%<9v")'), "\n")

它将行作为 List() 检索,然后通过特殊的正则表达式 atomgetline()匹配前 7 个虚拟列,并将其分配(作为字符串)分配给 register 。/\%<vjoin()@a

于 2013-02-15T20:37:35.503 回答
0

我会做

C-vG2wy

并完成(从文档顶部开始gg

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

C-vG2w"ay

于 2013-02-15T21:56:59.260 回答