【问题标题】:Using a register in a .vimrc mapping在 .vimrc 映射中使用寄存器
【发布时间】:2019-07-22 22:03:35
【问题描述】:

我正在做一项涉及对 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 并选择性地替换匹配的标记。是否有剪贴板内容的功能表示可以用于 来执行此操作?

【问题讨论】:

  • &lt;c-r&gt;*&lt;c-r&gt;+?

标签: vim vim-registers


【解决方案1】:

@DJMcMayhem 回答了您的直接问题。但是,这感觉不像 Vim,并且使用 cmap 会很棘手,因为它们会在意想不到的地方扩展(例如 /&lt;esc&gt;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&lt;c-r&gt;*&lt;esc&gt;。现在您可以使用n. 进行替换。

Vimcasts 剧集:Operating on search matches using gn.

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

用 traces.vim 替换预览

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

【讨论】:

  • 这是很好的信息,但为了这个目的,KISS 原则非常严格地适用。我需要将一些包含信息的旧网站页面重新格式化为更现代的 HTML5 格式,并强烈依赖 CSS。这是重复和劳动密集型的。我想在浏览器窗口中突出显示信息,然后在 vim 中运行受控搜索并用突出显示的信息作为替换字符串替换,而无需复制和粘贴。这是简单的信息 - 姓名和日期 - 最简单的解决方案就可以了。我已经完成了大部分工作。
  • 很简单,我正在将我们网站上已经在线的一系列文章转录为由模板定义的格式,该模板具有索引和许多重复部分,每个部分都有标记,%%ARTICLE_SOURCE , %%ARTICLE_DATE, %%ARTICLE_AUTHOR 等。我使用 DJMcMayhem 的“稳健方式”在我的 .vimrc 中设置了一系列 cmap 行 - 至于作者,为日期等。工作流程是1) 突出显示 old 网站上的文本,2) 切换到我的 vim 窗口,3) 进入命令模式并键入正确的序列,以及 4) 按 Enter 并在 vim 中管理替换。速度非常快。
【解决方案2】:

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

  1. 简单的方法:

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

    这不使用任何花哨的技巧。它只是使用&lt;C-r&gt; 键来插入寄存器的内容。

  2. 稳健的方式:

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

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

【讨论】:

  • 为什么不只是%s/%%ARTICLE_DATE/\=getreg("*")/c
  • @melpomene 可以。我只是碰巧真的很喜欢&lt;expr&gt; 映射。它也没有逃脱。
  • 为什么我需要逃避那里的任何东西?
  • @melpomene 因为如果您的寄存器中有斜杠或反斜杠,它将破坏您的:%s 命令。
  • 不,不会。你试过了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多