繁体   English   中英

如何在Vim视觉模式下映射以替换我选择的文本部分?

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

我希望替换视觉模式选择的部分单词。 例如:

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

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

我需要将所有“他”都更改为“她”。

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

  1. v选择“他”
  2. 按一些热键,vim提示我输入新文本
  3. 我输入新文本,按Enter ,完成。

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

要获得解决方案的所有学分转到用户@ xolox从他的回答 ,我发展到获得所需的任务:

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> :s/he/&r/g<cr>

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

需要注意的是,在:在上述映射S CMD仅仅是例子,它取代所有heher ,不管he是其他词的一部分,如She's - > Sher's

我认为您正在寻找这样的东西:

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

y选中文本,然后构建一个(不完整,光标位于替换部分内) :%s命令行。 您只需要填写替换项,然后按Enter即可

开放式问题

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

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

它基本上做同样的事情。 默认情况下,仅对单词起作用,允许您选择要在可视模式下更改的文本。 它还具有一些其他功能,例如在屏幕外打印多少次替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM