多行粘贴 (ctrl-r) 到 ex 或搜索|将 ^M 替换为 \r

Multiline paste (ctrl-r) into ex or search|replace ^M with \r

当我提取几行并将其粘贴到命令行时,每一行都是 ^M 而不是 \r。例如,如果我在可视模式下复制下两行(使用命令 Vjy):

line1
line2

并使用命令 /<c-r>" 将其粘贴到命令行(搜索)模式,我得到:

/line1^Mline2

但我预计:/line1\rline2

我想做的是突出显示粘贴的字符串,当我粘贴代码块时有什么用。 我知道我可以 select 它与

`[v`] 

但我只想突出显示它,无论如何它可以通过将多行代码粘贴到 ex 中来替代或其他有趣的东西来使用。

正在以可视模式复制下一段:

line1
line2
line3

并将其粘贴到命令行(使用 <c-r>")应该得到 line1^Mline2^Mline3^M。如果您希望此文本为 line1\rline2\rline3\r,您可以定义以下函数和映射:

function! Substitute()                                                          
    silent! let g:p=substitute(@", "\n", "\\r", "g")                         
    call feedkeys(":", 'n')                                                     
endfunction                                                                     
nnoremap <silent> : :call Substitute()<cr>                                      

命令let g:p=substitute(@", "\n", "\\r", "g")会在未命名的寄存器(:help quotequote)中找到每个^M,将其替换为\r,并将输出字符串存储在[=19=中].要在命令行中粘贴 p 的内容,请使用 <c-r>=p.

我经常需要 "cast" 将内容注册到某种(按字符/按行/按块)模式,我为此编写了 UnconditionalPaste plugin。它提供了 gcpglp 等替代强制特定模式的内置粘贴命令;一些变体也可用作 命令行模式映射

<C-r><C-q> 映射查询分隔符字符串,然后按字符插入寄存器的内容,每行由它分隔。因此,要达到您想要的结果,那就是 <C-r><C-q>"\r<CR>.

注意:如果要搜索多行文本,实际上必须使用 \n 而不是 \r