在 .vimrc 映射中使用寄存器

Using a register in a .vimrc mapping

我正在做一项涉及对 HTML 模板文件进行多次修改的工作,其中要替换的值在模板中使用诸如“%%ARTICLE_DATE”之类的标记指定。我想在我的 .vimrc 中的映射中使用“+”或“*”(剪贴板、X 剪贴板)vim 寄存器来使用剪贴板中的值设置搜索.例如:

cmap <esc>q %s/%%ARTICLE_DATE/<something>/c

因此,如果我的 X 剪贴板中有来自另一个应用程序的 "June 12, 2016",我可以按 Esc-q 并拥有

:%s/%%ARTICLE_DATE/June 12, 2016/c

在我的 vim 命令行中,我可以按 Enter 并有选择地替换匹配的标记。是否有剪贴板内容的功能表示,我可以将其用于 来执行此操作?

有两种不同的方法可以做到这一点。

  1. 简单的方法:

    cmap <esc>q %s/%%ARTICLE_DATE/<C-r>*/c
    

    这没有使用任何花哨的技巧。它只是使用 <C-r> 键来插入一个寄存器的内容。

  2. 稳健方式:

    cmap <expr> <esc>q "%s/\V%%ARTICLE_DATE/".escape(getreg("*"), "\/")."/c"
    

    这使用了一个 "expr" 映射,这意味着它会将 vimscript 评估为一个字符串,并 运行 该字符串作为一个映射。这有一些额外的东西来确保如果你的寄存器中有斜杠(向前或向后),它不会搞砸搜索。

@DJMcMayhem 回答了你的直接问题。然而,这感觉不像 Vim,并且使用 cmap 很棘手,因为它们会扩展到意想不到的地方(例如 /<esc>q)。

发出指令

制作执行此操作的命令非常简单。

command! -range=% -nargs=+ TemplateReplace keeppaterns <line1>,<line2>s/<args>/\=@*/gc

现在你可以做:TemplateReplace %%ARTICLE_DATE,它将替换为"*寄存器。

利用:s和映射

使用从当前搜索模式创建替换命令的映射。

nnoremap gS :<c-u>%s//\=@*/gc<cr>

设置您的搜索模式(例如 /%%ARTICLE_DATE 然后使用 gS

或者取一个寄存器作为参数:

nnoremap gS :<c-u>%s//\=getreg(v:register)/gc<cr>

使用 "*gS 将当前搜索模式替换为寄存器的内容,在这种情况下它将是 "* 寄存器。

视觉星图

使用如下所示的 visual star 映射来简化搜索模式的设置。

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\n','g')<cr><cr>``

现在您可以直观地 select 您的文本,然后使用 * 设置搜索模式。

使用gn动作

设置您的搜索模式(例如 /%%ARTICLE_DATE)然后执行 cgn<c-r>*<esc>。现在您可以使用 n. 进行替换。

Vimcasts episode: Operating on search matches using gn.

这种方法也将受益于视觉星图。

替换预览 traces.vim

Traces.vim 将允许您在编写替换时预览您的替换。有点像 'incsearch',但 :s。这不会直接帮助您解决当前的问题,但可能有助于在将来为您提供反馈和发现错误。