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

标签 vim

文件.txt

abc123
456efg
hi789j

命令

:set hlsearch
/\d\+

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

123
456
789

就像

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

谢谢。

最佳答案

可以按照以下步骤操作。

  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 然后 Enter (或 Ctrl+M),输入 ^[ 作为 Ctrl+V 然后 Esc (或 Ctrl+[)。为了不重新输入模式 刚刚在搜索中使用过的,可以按 Ctrl+R/ 自动插入 最后的搜索模式。

    还可以记录在匹配行上执行的命令(部分 遵循规范!)作为宏。这允许查看操作 立即在 sample 线上进行测试并确保它们是正确的。然后, 可以使用 :global 应用宏:

    :g/\d\+/norm!@z
    

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

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

3 人们总是可以通过以下方式查看特定宏中记录的操作: 使用 :di z"zp 检查相应寄存器的内容, 例如。

关于vim - 如何在 Vim 中将所有 hlsearch 文本复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6176659/

相关文章:

python - solarized gvim 主题的区别

VIM 智能退出宏

macos - 在命令模式下将按键重新映射到 <Esc> 不起作用

vim - 关于 vim 折叠的困惑 - 如何禁用?

vim - 为什么带数字参数的 vim 映射执行的次数比预期多?

Java System.out.print();,在 Eclipse 上的行为与在 Eclim 上的行为不同

c++ - 如何在ACM竞赛中仅使用g++和vim高效地调试程序?

linux - Vim:通过 ssh 访问系统剪贴板 - Linux 到 OS X

c++ - vim 在 ifstream 输入期间文件末尾的新行

javascript - 如何使用 ES6/ES2015 字符串插值修复语法高亮?