2011-02-07 45 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可以用微距性能方面提供幫助!