我正在使用VIM 7.1.314,并想尽快在下面显示的代码中抽取名称(chris, robert, ben)
- 我将如何实现这一目标?请注意名称始终对齐(不管用户号码)。VIM - 最快的方法来打开一个尴尬的文本块
user 1: chris (05/04/1984)
user 2: robert (11/12/1991)
user 3: ben (5/25/1993)
另请注意,我正在寻找一个解决方案,其中有数百个名称,因此可扩展性非常重要。
我正在使用VIM 7.1.314,并想尽快在下面显示的代码中抽取名称(chris, robert, ben)
- 我将如何实现这一目标?请注意名称始终对齐(不管用户号码)。VIM - 最快的方法来打开一个尴尬的文本块
user 1: chris (05/04/1984)
user 2: robert (11/12/1991)
user 3: ben (5/25/1993)
另请注意,我正在寻找一个解决方案,其中有数百个名称,因此可扩展性非常重要。
一个简单的方法来做到这一点是掏出一个外部程序来帮助。例如:
:%!awk '{ print $3 }'
将与运行结果替换整个编辑缓冲区是对当前缓冲区的内容awk
命令。然后,您可以将结果复制到另一个文件或其他文件中,并且u
可以轻松地将原始缓冲区恢复到之前的状态。
由于您的名字长度不会超过16个字符,请使用正则表达式搜索并替换以在每个名称后面添加16个空格,然后使用块可视模式执行复制。首先,(在命令行上):
:%s/: [^ ]*/& /
该空白区域是16个空格。然后,转到名字的开头,然后按Control-V
,然后向右移15个字符到名单列表的最后一行,然后按Y
进行复制,然后到目标缓冲区,然后按P
进行粘贴。
您可以使用一个名为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)
然后,你可以简单地使用视觉块拉文本。这是一个非常棒的插件,可以节省大量的时间。
这里是一个纯viml解决方案,离开原来的缓冲区不变:
:let names= []
:g/^user \d/let names+= matchstr(getline('.'), 'user \d\+:\s*\zs\S\+')
:new
:put=names
我会用宏。
qeq
(以清除 “E” 寄存器)qa03w"Eywjq
(注册宏唬弄名)[email protected]
(重复宏大量的时间)然后你的名字在“e”寄存器中。输入“的EP,以查看它们
!注意:
yw
是不正确的,也许YT(或什么的,这取决于名称:set lazyredraw
可以用微距性能方面提供帮助!
你想对名称做什么?取决于你想做什么,像'cut`或者`sed`这样的东西可能会更好。 – 2011-02-07 02:12:50
将它们粘贴到另一个vim编辑器中作为哈希键:) - 也是名称总是字母数字且不含空格 – 2011-02-07 02:17:59
你知道最长名称的长度(或至少是一个限制)吗? – 2011-02-07 02:20:13