如何映射 vim 视觉模式来替换我选择的文本部分?

How to map vim visual mode to replace my selected text parts?

我想替换我的部分文字,因为select在视觉模式下。例如:

我有一个简单的文本文件:

------------------
hello there hehe
She's not here
------------------

我需要将所有 "he" 更改为 "her"。

我想做的不是输入%s命令,而是在可视模式下:

  1. v 到 select "he"
  2. 按某个热键,vim提示我输入新文本
  3. 我输入新文本,按 Enter,完成。

我想我们可以用 vmap 来做吗?但是如何实现呢?谢谢!

您可以添加此映射:

vnoremap <F7> :s/he/&r/g<cr>

然后当您在可视模式下按 <F7> 时,vim 将在选定的行上进行文本替换。

请注意,上面映射中的:s命令只是示例,它将所有he替换为her,无论he是否是其他单词的一部分,例如She's -> Sher's

要获得解决方案,所有学分都归功于我为完成所需任务而开发的用户@xolox from his answer

vnoremap ; :call Get_visual_selection()<cr>


function! Get_visual_selection()
  " Why is this not a built-in Vim script function?!
  let [lnum1, col1] = getpos("'<")[1:2]
  let [lnum2, col2] = getpos("'>")[1:2]
  let lines = getline(lnum1, lnum2)
  let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)] 
  let lines[0] = lines[0][col1 - 1:] 
  let selection = join(lines,'\n')
  let change = input('Change the selection with: ')
  execute ":%s/".selection."/".change."/g"
endfunction

您可以将映射 ; 更改为您想要的任何热键。

我想你正在寻找这样的东西:

:vnoremap <F7> y:%s/<C-r><C-r>"//g<Left><Left>

yanks选择的文本,然后构建一个(不完整,光标在替换部分内):%s命令行。您只需要填写替换项并按Enter

未决问题

  • 破坏默认寄存器。您可以使用@Meninx's answer, or ingo#selection#Get() from my ingo-library plugin.
  • 中的函数
  • 将所选文本用作正则表达式模式。要用作文字文本,这需要转义(也适用于多行选择中的任何换行符)。同样,我的插件中有一个 ingo#regexp#EscapeLiteralText()

我看到你已经选择了一个适合你的答案,只是想在这里也留下这个插件:https://github.com/AndrewRadev/multichange.vim

它的作用基本相同。默认情况下仅适用于单词,也允许您 select 文本在视觉模式下进行更改。它还具有一些附加功能,例如打印在屏幕外进行了多少次替换。