假设我有一个这样的文档,并且我想搜索所有出现的 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/