2011-12-13 60 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