1

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

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

因此,如果我在另一个应用程序的 X 剪贴板中有“2016 年 6 月 12 日”,我可以键入 Esc-q 并拥有

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

在我的 vim 命令行中,我可以按 Enter 并有选择地替换匹配的标记。是否有剪贴板内容的功能表示可以用于 <something> 来做到这一点?

4

2 回答 2

3

@DJMcMayhem 回答了您的直接问题。然而,这感觉不像 Vim,而且使用cmap's 很棘手,因为它们会在意想不到的地方扩展(例如/<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将当前搜索模式替换为寄存器的内容,本例为"*寄存器。

视觉星图

使用如下的视觉星图来简化搜索模式的设置。

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

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

使用gn动作

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

Vimcasts插曲:使用 gn 对搜索匹配进行操作

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

使用 traces.vim 进行替换预览

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

于 2019-03-01T16:36:48.417 回答
2

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

  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 评估为字符串并将该字符串作为映射运行。这有一些额外的东西可以确保如果您的寄存器中有斜线(向前或向后),它不会搞砸搜索。

于 2019-02-28T22:29:37.597 回答