在.vimrc映射中使用寄存器

时间:2019-02-28 22:07:09

标签: vim vim-registers

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

<section>
  <h1> <span> @ </span>USMAN'S WEBSITE </h1>
  <ul>
    <a href="#">
      <li> <i class="fas fa-home"></i><br>HOME </li>
    </a>
    <a href="#">
      <li> <i class="far fa-newspaper"></i><br> ABOUT </li>
    </a>
    <a href="#">
      <li> <i class="fas fa-briefcase"></i> <br> WORK </li>
    </a>
    <a href="#">
      <li> <i class="fas fa-user-alt"></i> <br> TEAM </li>
    </a>
    <a href="#">
      <li> <i class="fas fa-phone"></i><br>CONTACT </li>
    </a>
  </ul>
  <div id="search-box">
    <input id="search-txt" type="text" placeholder="Search..">
    <button id="search-btn" type="submit"><i class="fas fa-search"></i></button>
  </div>
</section>

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

cmap <esc>q %s/%%ARTICLE_DATE/<something>/c
在我的vim命令行中,按

,然后按Enter键并有选择地替换匹配的标记。是否可以对使用剪贴板内容的功能表示?

2 个答案:

答案 0 :(得分:3)

@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>``

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

使用gn动作

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

Vimcasts集:Operating on search matches using gn

这种方法也将受益于视觉恒星映射。

使用traces.vim替换预览

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

答案 1 :(得分:1)

您可以通过两种不同的方式来做到这一点。

  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为一个字符串并以该字符串的形式运行。这有一些额外的东西可以确保如果您的寄存器中有一个斜杠(正向或反向),则不会使搜索搞乱。