如何映射 vim 视觉模式来替换我选择的文本部分?
How to map vim visual mode to replace my selected text parts?
我想替换我的部分文字,因为select在视觉模式下。例如:
我有一个简单的文本文件:
------------------
hello there hehe
She's not here
------------------
我需要将所有 "he" 更改为 "her"。
我想做的不是输入%s
命令,而是在可视模式下:
v
到 select "he"
- 按某个热键,vim提示我输入新文本
- 我输入新文本,按 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>
这y
anks选择的文本,然后构建一个(不完整,光标在替换部分内):%s
命令行。您只需要填写替换项并按Enter。
未决问题
- 破坏默认寄存器。您可以使用@Meninx's answer, or
ingo#selection#Get()
from my ingo-library plugin. 中的函数
- 将所选文本用作正则表达式模式。要用作文字文本,这需要转义(也适用于多行选择中的任何换行符)。同样,我的插件中有一个
ingo#regexp#EscapeLiteralText()
。
我看到你已经选择了一个适合你的答案,只是想在这里也留下这个插件:https://github.com/AndrewRadev/multichange.vim。
它的作用基本相同。默认情况下仅适用于单词,也允许您 select 文本在视觉模式下进行更改。它还具有一些附加功能,例如打印在屏幕外进行了多少次替换。
我想替换我的部分文字,因为select在视觉模式下。例如:
我有一个简单的文本文件:
------------------
hello there hehe
She's not here
------------------
我需要将所有 "he" 更改为 "her"。
我想做的不是输入%s
命令,而是在可视模式下:
v
到 select "he"- 按某个热键,vim提示我输入新文本
- 我输入新文本,按 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>
这y
anks选择的文本,然后构建一个(不完整,光标在替换部分内):%s
命令行。您只需要填写替换项并按Enter。
未决问题
- 破坏默认寄存器。您可以使用@Meninx's answer, or
ingo#selection#Get()
from my ingo-library plugin. 中的函数
- 将所选文本用作正则表达式模式。要用作文字文本,这需要转义(也适用于多行选择中的任何换行符)。同样,我的插件中有一个
ingo#regexp#EscapeLiteralText()
。
我看到你已经选择了一个适合你的答案,只是想在这里也留下这个插件:https://github.com/AndrewRadev/multichange.vim。
它的作用基本相同。默认情况下仅适用于单词,也允许您 select 文本在视觉模式下进行更改。它还具有一些附加功能,例如打印在屏幕外进行了多少次替换。