2009-11-07 42 views
2

假設下面的文本文件,它實際上是資金和價格統計數據的轉儲:VIM替代:使用當前行作爲搜索字符串

PBCPDF 
05/01/2006 
0.0000 
0.0000 
PBCPDF 
0.0000 
06/01/2006 
0.0000 
0.0000 
PBCPDF 
0.0082 
[… lines repeat …] 

我想達到什麼是刪除的所有實例PBCPDF除了第一個,我可以寫替代命令爲:.+1,$s/PBCPDF\n//g

但是,因爲我想編程一個宏來處理多個基金名稱,所以我需要一種方法來使用某種模式來檢索當前行作爲搜索模式,而無需我手動完成。

有沒有辦法做到這一點?

+0

這是非常類似於http://stackoverflow.com/questions/1477652/in-vim-is-it-possible-to-use-the-selected-text-in-the-substitute-clause-without/ 1484771#1484771。 – 2009-11-07 03:43:35

回答

0

如果你在宏中使用這個命令(使用q命令),當你執行一些更深奧的擊鍵命令時它足夠聰明 - 我特別想到的是CTRL-R,CTRL- W,它將光標下的單詞插入命令行。因此,舉例來說,如果你沒有

 
ESC 
qw 
/[CTRL-R, CTRL-W] (you should see the word under the cursor enter the command line) 
[enter] 
q 

那麼你剛剛創建,在這相同的,因爲這一個緩衝搜索下一個字的宏,怎麼做呢?它會動態地將光標下的單詞作爲宏的一部分放入命令中。在上面的命令中可能會出現類似CTRL-W的情況,這對於整行來說是這樣的,但我不知道它是不是正確的。

4
ggyy:+1,$s/<Ctrl-R>"<BS>//g 

讓我們來看看究竟是什麼。

深入第一線

gg 

猛拉整個liine

yy 

開始替代

:+1,$s/ 

獲取從寄存器當前行到你拷貝它到:

<Ctrl-R>" 

注意:不要輸入「,你必須實際保存控制並按R,然後加雙引號。

刪除行字符的末尾:

<BS> 

注:按Backspace鍵。

替換爲空。

//g 

你可以用一個qq/q或者任何東西包裝它來記錄這個宏。

+0

很好的解釋! – 2009-11-08 01:17:08

0

在研究了sykora和Matt的答案之後,我想出了一個稍微好一點的改進,這個改進是以行爲爲基礎而不是以字面爲基礎的(根據Matt's solution)。

此命令是光標定位在其上的刪除將要發生行後執行:

:.+1,$s/<CTRL-R>=getline(".")<CR>\n//g 

爲VIM初學者說明:從

:.+1,$s/ 

開始取代當前行之後的行(.+1)和結束文件($

<CTRL-R>=getline(".")<CR>\n 

<CTRL-R>是指實際按下CTRL鍵和R鍵,它允許你輸入特殊的表情。在這種情況下,=getline(".")將檢索當前行的文本。

<CR>指的是按下回車鍵,它完成了<CTRL-R>表達式。因爲我需要將其刪除我還可以指定在搜索模式結束的換行符(\n)。

//g 

然後替換爲無。