在 .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 并有选择地替换匹配的标记。是否有剪贴板内容的功能表示,我可以将其用于 来执行此操作?
有两种不同的方法可以做到这一点。
简单的方法:
cmap <esc>q %s/%%ARTICLE_DATE/<C-r>*/c
这没有使用任何花哨的技巧。它只是使用 <C-r>
键来插入一个寄存器的内容。
稳健方式:
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
。这不会直接帮助您解决当前的问题,但可能有助于在将来为您提供反馈和发现错误。
我正在做一项涉及对 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 并有选择地替换匹配的标记。是否有剪贴板内容的功能表示,我可以将其用于
有两种不同的方法可以做到这一点。
简单的方法:
cmap <esc>q %s/%%ARTICLE_DATE/<C-r>*/c
这没有使用任何花哨的技巧。它只是使用
<C-r>
键来插入一个寄存器的内容。稳健方式:
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
。这不会直接帮助您解决当前的问题,但可能有助于在将来为您提供反馈和发现错误。