我正在使用VIM 7.1.314,并希望尽快在下面显示的代码中抓取名称(chris, robert, ben)
- 我将如何实现这一目标?请注意,名称始终对齐(无论用户编号如何)。
user 1: chris (05/04/1984)
user 2: robert (11/12/1991)
user 3: ben (5/25/1993)
另请注意,我正在寻找一个有数百个名称的解决方案,因此可扩展性非常重要。
答案 0 :(得分:8)
一种简单的方法是向外部程序提供帮助。例如:
:%!awk '{ print $3 }'
这将替换整个编辑缓冲区,其结果是对当前缓冲区的内容运行awk
命令。然后,您可以将结果复制到另一个文件或其他任何文件,u
可以轻松地将原始缓冲区恢复到之前的状态。
答案 1 :(得分:3)
鉴于您的名字不会超过16个字符,请使用正则表达式搜索并替换以在每个名称后添加16个空格,然后使用块可视模式进行复制。首先,执行(在命令行上):
:%s/: [^ ]*/& /
该空白区域为16个空格。然后,转到第一个名称的开头并按Control-V
,然后在名称列表的右侧和最后一行中输入15个字符,然后按Y
复制,然后再到目标缓冲区然后按P
粘贴。
答案 2 :(得分:1)
您可以使用名为Tabularize的插件,您可以从https://github.com/godlygeek/tabular获取该插件。在您列出的情况下,您可以
:Tabularize /(.*
它会将您的文本文件更改为:
user 1: chris (05/04/1984)
user 2: robert (11/12/1991)
user 3: ben (5/25/1993)
然后你可以简单地使用visual block来拉动文本。这是一个很棒的插件,可以节省大量的时间。
答案 3 :(得分:0)
这是一个纯粹的viml解决方案,它保持原始缓冲区不变:
:let names= []
:g/^user \d/let names+= matchstr(getline('.'), 'user \d\+:\s*\zs\S\+')
:new
:put=names
答案 4 :(得分:0)
我会使用宏。
qeq
(清除“e”寄存器)qa03w"Eywjq
(注册一个名字的宏)200000@a
(大量时间重复宏)然后你的名字在“e”登记册中。输入“ep来查看它们!
注意:
yw
不正确,也许是yt(或其他东西,取决于名称。:set lazyredraw
有助于宏观表现!