如何将所有hlsearch文本复制到Vim中的剪贴板

时间:2011-05-30 13:06:16

标签: vim

file.txt的

abc123
456efg
hi789j

命令

:set hlsearch
/\d\+

我想将突出显示的文本复制到剪贴板(或注册):

123
456
789

就像

一样
egrep -o '[0-9]+' file.txt

感谢。

3 个答案:

答案 0 :(得分:5)

可以按照以下程序进行操作。

  1. 清空一个寄存器(例如,"a)。

    qaq
    

    :let @a = ''
    
  2. 运行命令 1

    :g/\d\+/norm!//e^Mv??^M"Ay
    

    如果需要在每个后面附加一个新的行字符 匹配,改为运行此命令: 2

    :g/\d\+/norm!//e^Ma^M^[??^Mv$"Ayu
    

    键入^M Ctrl + V 然后输入(或 Ctrl + M ),键入^[ Ctrl + V 然后 Esc (或 控制 + [)。为了不重新键入模式 只是用于搜索,人们可以按 Ctrl + R / 自动插入 最后的搜索模式。

    还可以记录命令在匹配的行上执行(该部分 跟随norm!)作为宏。这允许查看操作 立即在样品线上并确保它们是正确的。然后, 可以使用:global

    应用宏
    :g/\d\+/norm!@z
    

  3. 1 在顶层,命令是执行Ex的:global 在与模式匹配的每一行上命令norm!//e^Mv??^M"Ay \d\+。 Ex命令以norm!命令开始执行Normal 模式命令//e^Mv??^M"Ay。这是由三个命令分隔的命令 回车符号^M。第一个//e查找搜索 模式(设置为全局命令中使用的模式)并放入 将光标移动到匹配的最后一个符号(由于标记e,请参阅:help search-offset)。然后v命令启动可视模式。命令??看起来 最后一个搜索模式向后(并将光标放在第一个 匹配的字符),从而选择与上次搜索匹配的文本 图案。最后一个命令"Ay将所选文本附加到其中 a注册。

    2 第二个全局命令类似于第一个全局命令。 在每个匹配的行中,它将光标移动到匹配的最后一个符号 并在该符号后插入换行符。然后它将光标放在开头 匹配并选择(在可视模式下)一切直到行尾 (包括刚刚插入的换行符)。最后,该命令附加所选的 文本到寄存器,并撤消换行插入。

    3 人们总能看到特定宏中记录的动作 使用:di z"zp检查相应寄存器的内容, 例如。

答案 1 :(得分:2)

如果您的文字服从您发布的模式,您可以使用 Ctrl + V 以块状方式启动视觉模式,并从1中选择第一行9 1}}在最后一行。然后,您只需键入+即可复制到"+y寄存器,即系统剪贴板。

编辑:

我已经为文本测试了这个新解决方案:

abc123
456efg
hi789j

将所有非数字替换为:%s/\D//g,结果将为:

123
456
789

将其复制到剪贴板,键入"+y%,然后使用u还原更改,您就完成了。

答案 2 :(得分:-1)

使用此命令提取所有URL,并附加到文件末尾:

:let urls = [] | %s/http:[^"]*/\=add(urls, submatch(0))[-1]/g | call setline(line('$')+1, urls)