我有一个看起来像这样的文件:
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”,我只想要某些列。
谢谢。
我有一个看起来像这样的文件:
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”,我只想要某些列。
谢谢。
您可以在命令行上执行任何命令,这里借助:normal
:
:execute "normal! 1G^\<C-v>6l5j\"ay"
这会构建一个分块选择,然后将其拉到注册一个。使用:execute
是为了\<C-v>
可以使用符号而不是直接插入它。它还允许您用变量替换硬编码的限制。
您不能从 vim 命令行以简单的方式执行此操作。 :y
是一个逐行命令 - 它只影响整行。您正在寻找的内容被认为是blockwise。逐块命令涉及可视模式。所以你能做的最好的就是:
"ay
将突出显示的文本拉入 register a
。不是很笼统,但这应该可行:
:1,5y|put|-4,.s/\(.\{7\}\).*/\1/|-4,.d a
Yank 5 行,放置(复制)它们,删除所需列之后的所有内容,将它们删除到缓冲区中。
另一种方法,更适合脚本:
:let @a = join(map(getline(1, 5), 'matchstr(v:val, ".*\\%<9v")'), "\n")
它将行作为 List() 检索,然后通过特殊的正则表达式 atomgetline()
匹配前 7 个虚拟列,并将其分配(作为字符串)分配给 register 。/\%<v
join()
@a
我会做
并完成(从文档顶部开始gg)
当然,如果您想在寄存器a中添加它,请添加"a
: