我试图了解如何在映射内的后续运动中使用运算符。例如:

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 @/=@"

评论


我已经更新了我的问题。看来您的答案是最接近我需要的答案,但下次出现时却没有做到,所以我在问题的那一刻已经解释了。

–蒂莫尔·法兹拉赫曼诺夫(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

#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键,然后输入一些内容而不是单词,然后按键。之后,我想对下一次出现做同样的事情。但是,先按n(转到下一个出现)和。 (重复最后一个命令),它只是在最后键入的文本之前添加而不是替换它。映射的主要目标是将其与n / N和一起使用。重复。我错过了什么吗?

–蒂莫尔·法兹拉赫曼诺夫(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'