vim - 为 Vim 命令行创建一个映射,在插入寄存器之前转义寄存器的内容

标签 vim escaping

假设我有一个这样的文档,并且我想搜索所有出现的 URL:

Vim resources: [http://example.com/search?q=vim][q]
...
[q]: http://example.com/search?q=vim

我不想完整地输入它,所以我将光标放在第一个 URL 上,然后运行 ​​"uyi[将其拉入“u”寄存器。现在要搜索它,我想通过运行以下命令将该寄存器的内容粘贴到搜索字段中:

/\V<c-r>u<CR> 

这会导致 Vim 搜索字符串 'http:' - 因为 '/' 字符终止搜索字段。

我可以通过运行这个来解决这个问题:

/\V<c-r>=escape(@u, '\/')<CR><CR>

但是打字太多了!

如何为 Vim 命令行创建映射来简化此工作流程?

我理想的工作流程是这样的:

  • /\V调出搜索提示,并使用非常 nomagic 模式
  • 按 ctrl-x 触发自定义映射(ctrl-x 可用)
  • Vim 监听下一个按键...(按 <Esc> 将取消)
  • 按“u”将转义“u”寄存器的内容,并插入到命令行

最佳答案

试试这个:

cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr>
function! s:PasteEscaped()
  " show some kind of feedback
  echo ":".getcmdline()."..."

  " get a character from the user
  let char = getchar()

  if char == "\<esc>"
    return ''
  else
    let register_content = getreg(nr2char(char))
    return escape(register_content, '\/')
  endif
endfunction

顺便说一句,了解一下(如果您还不知道的话)可能有用的是,您可以使用 ? 作为 :s 的分隔符。这意味着您可以为 URL 编写搜索和替换,如下所示:

:s?http://foo.com?http://bar.com?g

关于vim - 为 Vim 命令行创建一个映射,在插入寄存器之前转义寄存器的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7400743/

相关文章:

powershell - 通过 '@' 提供输入文件会出现错误 : The splatting operator '@' cannot be used to reference variables in an expression

PHP ldap_add 函数转义 DN 语法中的 ldap 特殊字符

linux - 使用控制台作为选项卡

ruby - 这个 vim 自定义 map 在做什么?

vim 着色特定文本

python - 从字符串中获取转义的 unicode 代码

javascript - Javascript 字符串中的单转义符和双转义符(反斜杠)有什么区别?

iframe - 如何正确转义过滤后的内容变量?

vim - 使用 Vim 设置 Rust 的正确方法

configuration - 所有窗口的单个 vim 状态行