VIM - 最快的方式来阻止一个笨拙的文本块

时间:2011-02-07 02:09:20

标签: vim editor text-editor vi

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

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

5 个答案:

答案 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)

我会使用宏。

  1. qeq(清除“e”寄存器)
  2. qa03w"Eywjq(注册一个名字的宏)
  3. 200000@a(大量时间重复宏)
  4. 然后你的名字在“e”登记册中。输入“ep来查看它们!

    注意:

    • 也许yw不正确,也许是yt(或其他东西,取决于名称。
    • :set lazyredraw有助于宏观表现!