nmap /c c{here we pending for a motion}/<C-r>"<CR>
该地图应执行以下操作:
激活
c
运算符并收听下一个动作; 例如,我可以在此处键入
t,
来更改下一个逗号之前的所有内容; 进入插入模式,删除光标和逗号之间的所有内容;
删除的文本会自动搜索为图案
因此,简单来说,在删除运动文本后,我将处于插入模式,突出显示了已删除的文本。如果有人帮助我解决这个问题,我将不胜感激。
UPDATE
答案几乎是我想要的。但!当我按
/cw
时,键入一些内容而不是单词,然后按<Esc>
。我希望以后再做同样的事情。但是在设置了n
(转到下一个出现)和.
(重复最后一个命令)之后,它只是在最后键入的文本前面加上了替换而不是替换它。映射的主要目标是将其与n/N
和.
一起重复使用。我错过了什么吗?#1 楼
vim支持操作员映射:h map-operator
。 您需要一个
operatorfunc
和一个映射。根据您的需要,以下代码有效。好吧,这只是一个示例,您可以进一步完善。nmap <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
silent exec 'normal! `[v`]d'
silent exec 'let @/=@"'
startinsert
endfunction
请注意,
exec 'let @/=@"'
仅用于突出显示缓冲区中的代码。如果您不想立即看到突出显示的内容,只需let @/=@"
#2 楼
使用以下功能更容易实现(并记录)复杂的映射:function! DoMagic()
execute "normal! d".input("enter motion: ")
let @/=@"
startinsert
endfunction
然后使您的映射调用该函数:
nmap /c :call DoMagic()<CR>
编辑:
如果要在大量地方执行搜索和替换,则应尝试使用替换命令:
:s
。您可以更改映射以将视觉选择复制到搜索模式:function! DoMagic2()
normal! gv"ay
return @a
endfunction
vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>
评论
即使使用“不错”的UI,它也可以满足OP的需要,并且可以“超出预期”,具体取决于您输入的内容。例如。当看到有人进入运动:时,他给出了:t,ggVGJZZ ^ _ ^这是命令串联的常见问题
–肯特
2015年11月16日15:09
那几乎就是我想要的。例如:我按/ cw键,然后输入一些内容而不是单词,然后按
–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
2015年11月16日15:13
此功能是为了在您遇到复杂映射问题时阐明使用功能的想法。您应该更改它以满足您的需求;尝试按照肯特的建议制作。重复您的命令。
–mMontu
2015年11月16日15:22
谢谢你的回答。它也很有用,但是我接受@Kent的那个,因为它在我键入它们后立即动作(没有input()中待处理的
–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
2015年11月16日15:41
@TimurFayzrakhmanov,您也可以尝试替代产品,如更新中所述。
–mMontu
2015年11月16日15:42
#3 楼
此解决方案适用于“重复最后一个命令”(又名.
):nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@
function! ChangeOccurence(type)
exec 'normal! `[v`]y'
let @/ = @"
call feedkeys('cgn', 'n')
endfunction
重复时甚至不需要使用
n
,只需使用.
即可如果您想更快地运行,则直接获取并替换下一个事件。或者,如果您希望突出显示匹配词,则可以将
'cgn'
替换为'n``cgn'
。
评论
我已经更新了我的问题。看来您的答案是最接近我需要的答案,但下次出现时却没有做到,所以我在问题的那一刻已经解释了。
–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
2015年11月16日15:19
您有两个vim运算符(/ c和i)。重复最后一个。如果要扩展它,请检查重复插件。 @TimurFayzrakhmanov也有:g和:s命令,可能也对您有帮助。
–肯特
2015年11月16日15:20
我的代码中是否有““ let @ / = @”“'”中的奇数?”我认为这是可能的,例如无声exec'normal![v] c',因为c运算符会执行我期望的操作,但不添加更改为搜索模式的文本。
–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
2015年11月16日15:32
@TimurFayzrakhmanov“”是一个错字..修复..我也想出了c,但是它增加了一个空格,因为我想有模式更改n-i-n-i ...做一些测试,您将看到。
–肯特
2015年11月16日15:34
@TimurFayzrakhmanov,您可以通过将d更改为y并通过startinsert调用feedkeys(“ cgn”,'n')使其无需任何插件即可重复执行(请参见下面的答案)
–杰罗姆·达伯特(Jerome Dalbert)
16年7月9日在10:26