2011-02-07 49 views
3

我正在使用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) 

另请注意,我正在寻找一个解决方案,其中有数百个名称,因此可扩展性非常重要。

+3

你想对名称做什么?取决于你想做什么,像'cut`或者`sed`这样的东西可能会更好。 – 2011-02-07 02:12:50

+0

将它们粘贴到另一个vim编辑器中作为哈希键:) - 也是名称总是字母数字且不含空格 – 2011-02-07 02:17:59

+0

你知道最长名称的长度(或至少是一个限制)吗? – 2011-02-07 02:20:13

回答

8

一个简单的方法来做到这一点是掏出一个外部程序来帮助。例如:

:%!awk '{ print $3 }' 

将与运行结果替换整个编辑缓冲区是对当前缓冲区的内容awk命令。然后,您可以将结果复制到另一个文件或其他文件中,并且u可以轻松地将原始缓冲区恢复到之前的状态。

3

由于您的名字长度不会超过16个字符,请使用正则表达式搜索并替换以在每个名称后面添加16个空格,然后使用块可视模式执行复制。首先,(在命令行上):

:%s/: [^ ]*/&    /

该空白区域是16个空格。然后,转到名字的开头,然后按Control-V,然后向右移15个字符到名单列表的最后一行,然后按Y进行复制,然后到目标缓冲区,然后按P进行粘贴。

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) 

然后,你可以简单地使用视觉块拉文本。这是一个非常棒的插件,可以节省大量的时间。

0

这里是一个纯viml解决方案,离开原来的缓冲区不变:

:let names= [] 
:g/^user \d/let names+= matchstr(getline('.'), 'user \d\+:\s*\zs\S\+') 
:new 
:put=names 
0

我会用宏。

  1. qeq(以清除 “E” 寄存器)
  2. qa03w"Eywjq(注册宏唬弄名)
  3. [email protected](重复宏大量的时间)

然后你的名字在“e”寄存器中。输入“的EP,以查看它们

!注意:

  • 也许yw是不正确的,也许YT(或什么的,这取决于名称
  • :set lazyredraw可以用微距性能方面提供帮助!