如何使用带有的Vim的escape()作为其第一个参数?

如何使用带有的Vim的escape()作为其第一个参数?,vim,vi,neovim,Vim,Vi,Neovim,我的目标是在Vim的视觉模式中选择几个单词,在我的例子中是neovim,按leader+L,让fzf通过:Rg显示所选字符串的搜索结果。我想到了这个: vnoremap <expr> <leader>l 'y:<C-U>Rg '. shellescape(escape('<C-R>"', '()[]><')) .'<CR>' 我得到的是这个: :Rg 'options(:modifier)' 我猜我不能在这种情况下使用,

我的目标是在Vim的视觉模式中选择几个单词,在我的例子中是neovim,按leader+L,让fzf通过:Rg显示所选字符串的搜索结果。我想到了这个:

vnoremap <expr> <leader>l 'y:<C-U>Rg '. shellescape(escape('<C-R>"', '()[]><')) .'<CR>'
我得到的是这个:

:Rg 'options(:modifier)'
我猜我不能在这种情况下使用,但我似乎不明白为什么

更新:感谢用户提供的有用回复,表示我可以放弃并以不同的方式构建映射,最终我解决了我的问题:

vnoremap <leader>l "ky:exec 'Rg '. shellescape(escape(@k, '()[]{}?.'))<CR>

你不需要知道所有的寄存器都是可用的,因为变量的前缀是@all是可读的,除了@,我认为大多数是可写的


因此,现在使用@

@dbenknoble Using@确实正确地应用了转义调用,谢谢。但是,它似乎采用了上一个yank的值而不是当前的值。@DaveLens这是因为求值顺序:当触发expr映射时,求值expr以生成右侧,然后执行该键序列。你有两个选择:退出control-r你需要在@DBenKnoble之前加上双引号和反斜杠在对寄存器的帮助页面进行了过度阅读和一些尝试和错误之后,我成功了!我选择了不使用expr的映射,并提出了vnoremaplky:exec'Rg。shellescapeescape@k, '[]{}?.'. 谢谢你给我指明了正确的方向!
vnoremap <leader>l "ky:exec 'Rg '. shellescape(escape(@k, '()[]{}?.'))<CR>