2011-12-13 101 views

回答

4

看一看這裏http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard, '複製包含搜索命中行' 的部分。

這爲我工作(清除寄存器a,猛拉pattern結果進去,拷貝過來到剪貼板):

qaq 
:g/pattern/y A 
:let @+ = @a 

當我試圖:g/pattern/y+它只是複製了第一道防線。

鏈接上的這一部分也給出了一個可以寫入來複制所有行的函數,但它仍然看起來像一個2步過程(執行/pattern然後調用該函數):但是您可以編寫自己的宏/按順序執行兩個快捷方式。

+0

這個直接回答覆制包含正則表達式的整行。但是在上面給出的鏈接中,有一個名爲CopyMatches的腳本只複製匹配的部分。 – squid 2014-08-22 06:56:24

1

嘗試以下。首先定義一個函數,用於將您的 匹配的正則表達式保存到列表(:幫助列表)中。

:fun Add(list, item) 
: call add(a:list, a:item) 
: return a:item 
:endfun 

請注意,它也會返回添加的項目。這並非必要, 但您在此處返回的內容將成爲 替代文本:下面的後續替代文本。

接下來,創建一個空列表。

:let list=[] 

然後運行你的正則表達式。

:%s/^\S\+/\=Add(list, submatch(0))/ 

注意更換開始\ =(見:幫助 子取代特)。結果是我們用自己替換了匹配表達式 ,但是同時在列表中捕獲結果。

匹配的部件的子匹配()函數返回:代替 命令。 submatch(0)返回整個匹配。

注意,作爲副作用的緩衝器被標記爲已改變。 如果您執行替代之前,那麼你可以 只需按ü撤銷,或附加「解決這個保存在緩衝區|你'到你的 命令。 (如果你要撤消操作,它並不重要 我們從我們的添加函數返回。)

您可以

:echo list 

查看自己的比賽,也可以附加到您的緩衝區與

:$put=list 

我希望這可以幫助。一旦你知道如何,它很簡單,但是在那裏有很多需要消化的 。

哦,我差點忘了!您可以將您的匹配添加到剪貼板

:let @+ = join(list, '^@') 

然後您的匹配將位於剪貼板中,每個位於單獨的行中。

^@表示NUL字符,並且與< C-V > <Ç-J >生成,這意味着 壓力機控制-V,接着控制-J。 (爲什麼你必須使用^ @這裏是 本身就是一個整體的話題。)

+0

很好的答案。我認爲你可以通過直接附加到@ +來完成列表。我懷疑你的答案在一般情況下會表現得更好,雖然 – sehe 2011-12-14 10:04:09

+0

是的,這也可以,謝謝。OP可能更喜歡這種方式,儘管將這些單詞存儲在列表中也可以提供選項。 – 1983 2011-12-14 12:10:55

2

也許你可以找到在以下一些啓示:

:saveas %.tmp 

開始在副本上工作

:v//d 
:exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

因此,例如做在下面的文本搜索/word\d

Tincidunt。 Proin sagittis2。 Curabitur auctor metus非mauris。 Nunc調味品 nisl非augue。 Donec leo urna,dignissim vitae,porttitor ut,iaculis坐 amet,sem。

類aptent taciti sociosqu3廣告litora torquent每conubia諾斯特拉,每 inceptos himenaeos。暫停的潛力。 Quisque augue metus,hendrerit坐在一起,商品,scelerisque ut,ante。 Praesent euismod euismod risus。 Mauris ut metus坐amet mi cursus commodo。 Morbi認爲mauris ac sapien。 Donec justo。 sed congue nunc vel mauris0。 Pellentesque vehicula orci id libero。在hac habitasse platea dictumst。 Nulla sollicitudin,purus1 id elementum dictum,dolor augue hendrerit ante,vel semper metus enim et dolor。 Pellentesque molestie9

將突出顯示所示的字樣。做

:v//d|exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

結果在以下緩衝液:

sagittis2 
sociosqu3 
mauris0 
purus1 
molestie9 
1

追加所有搜索結果以由換行分隔reg X(大寫):

:g/^/call setreg('X', matchstr(getline('.'), '^\S\+') . "\n") 

清除reg x

qxq