在vim中搜索和替换被拔出的文本的内容

Inv*_*rch 3 vim clipboard search replace

在我的vimrc中,我有一个快捷方式来复制文件名及其路径到剪贴板.

:nmap cp :let @* = expand("%")
Run Code Online (Sandbox Code Playgroud)

这很好用.现在,我想将此抽出的文本的内容替换为

1) replace \ with /  
2) remove certain words from the yanked text.
Run Code Online (Sandbox Code Playgroud)

我熟悉常规文本的搜索和替换,但是当我使用快捷方式时,我不知道如何更改我的vimrc条目以便每次在被拉动的文本上执行此操作.

那么,这样的事情呢?

:nmap cp :let @* = expand("%") || %s/\\/\/ || %s/<word>//
Run Code Online (Sandbox Code Playgroud)

我在windows上使用gvim.

Ing*_*kat 6

:substitute命令适用于缓冲区内容本身; 那里没那么有用.(您可以暂时:put使用寄存器/文件名,将其转换,然后将其转换:delete回寄存器.)幸运的是,有一个等效的低级:help substitute()函数可以应用于字符串:

:nnoremap cp :let @* = substitute(expand("%"), '\\', '/', 'g')<CR>
Run Code Online (Sandbox Code Playgroud)

事实上,expand()直接支持特殊替换:help filename-modifiers,所以这也是一个(相当模糊)的解决方案:

:nnoremap cp :let @* = expand("%:gs?\\?/?")<CR>
Run Code Online (Sandbox Code Playgroud)

对于额外删除<word>,您可以使用substitute()/追加另一层:gs???.我会留给你的.

额外的批评

  • 您的映射缺少尾随<CR>结束命令行模式.
  • 你应该使用:noremap ; 它使映射不受重映射和递归的影响.
  • %是相对于当前工作的目录.如果你需要完整的绝对路径,你可以通过它获得%:p.
  • 开始您的映射c是非常规的.这里很好,因为change命令需要a {motion},而p不是有效的.一般来说,我宁愿避免这种聪明的重载(只要你还有其他未使用的映射前缀仍然可用).