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

7nbnzgx9  于 2023-04-06  发布在  其他
关注(0)|答案(5)|浏览(147)

我希望替换我的部分文字,如视觉模式所选。例如:
我有一个简单的文本文件:

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

我需要把所有的“他”都改成“她”。
我想做的不是输入%s命令,而是在可视模式下:

  1. v选择“他”
    1.按下某个热键,Vim提示我输入新文本
    1.我键入新文本,按Enter,完成。
    我想我们可以用vmap来实现它?但是如何实现呢?谢谢!
mbyulnm0

mbyulnm01#

要获得解决方案,所有学分都要转到User@xolox,他的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

您可以将;Map更改为所需的任何热键。

n6lpvg4x

n6lpvg4x2#

您可以添加此Map:

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

然后当你在可视模式下按下<F7>时,vim将在选定的行上进行文本替换。
请注意,上面Map中的:s cmd只是示例,它将所有he替换为her,无论he是否是其他单词的一部分,例如She's-〉Sher's

fxnxkyjh

fxnxkyjh3#

我觉得你在找这样的东西:

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

这个y返回选中的文本,然后构建一个(不完整,光标在替换部分):%s命令行。您只需要填写替换部分并按Enter键。

开放问题

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

4si2a6ki4#

我看到你已经选择了一个适合你的答案,只是想也离开这个插件在这里:https://github.com/AndrewRadev/multichange.vim .
它基本上做同样的事情。默认情况下只对单词起作用,也允许您选择要在视觉模式下更改的文本。它还具有一些额外的功能,例如打印出在屏幕外进行了多少次替换。

gkl3eglg

gkl3eglg5#

下面是一个键绑定,用于组合leader键和s键以实现您想要的功能。
使用lua:

vim.keymap.set("x", "<leader>s", '"zy<Esc>:%s/<C-R>z//g<Left><Left>')

在Vimscript中:

xnoremap <leader>s '"zy<Esc>:%s/<C-R>z//g<Left><Left>

这会将所选内容拉到z寄存器,退出可视模式,并准备一个替换命令,将所选内容作为要替换的文本。
使用以下命令设置引线键,在本例中为空格键:
使用lua:

vim.g.mapleader = " "

使用Vimscript:

let mapleader = " "

相关问题