我正在做一个涉及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键并有选择地替换匹配的标记。是否可以对
答案 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将允许您在编写替换文字时预览替换文字。有点像'incsearch'
,但有:s
。这并不能直接帮助您解决当前的问题,但可能会帮助您提供反馈并在将来发现错误。
答案 1 :(得分:1)
您可以通过两种不同的方式来做到这一点。
简单方法:
cmap <esc>q %s/%%ARTICLE_DATE/<C-r>*/c
这不使用任何花哨的技巧。它只使用<C-r>
键插入寄存器的内容。
可靠的方式:
cmap <expr> <esc>q "%s/\V%%ARTICLE_DATE/".escape(getreg("*"), "\\/")."/c"
这使用了一个“ expr”映射,这意味着它将评估vimscript为一个字符串并以该字符串的形式运行。这有一些额外的东西可以确保如果您的寄存器中有一个斜杠(正向或反向),则不会使搜索搞乱。