动作映射


12

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

nmap /c c{here we pending for a motion}/<C-r>"<CR>

该地图应执行以下操作:

  1. 激活c操作员并收听下一个动作;
  2. 例如,我可以在此处键入t,以在下一个逗号之前更改所有内容;
  3. 进入插入模式,删除光标和逗号之间的所有内容;
  4. 删除的文本会自动搜索为图案

简而言之,删除运动文本后,我将处于插入模式,突出显示了已删除的文本。如果有人帮助我解决这个问题,我将不胜感激。

更新

答案几乎是我想要的。但!当我按时/cw,键入一些东西而不是单词,然后按<Esc>。我希望以后再做同样的事情。但是,在n(转到下一个出现)和.(重复上一个命令)之后,它只是在最后键入的文本之前加上了替换而不是替换它。映射的主要目标是将其与n/N.重复使用。我错过了什么吗?

Answers:


9

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

您有两个运算符(the /ci)vim .只是重复最后一个。如果要扩展它,请检查repeat插件。@TimurFayzrakhmanov也有:g:s命令,可能也对您有帮助。
肯特2015年

"您的代码中有奇数'let @/=@""'吗?我认为这是可能的,例如silent exec 'normal! [v ]c',因为c运算符可以按照我的期望进行,但不会将更改的文本添加到搜索模式中。
Timur Fayzrakhmanov

1
@TimurFayzrakhmanov这"" 是一个错字..修复..我也想出了c,但是它增加了一个空格,因为n-i-n-i我想有模式改变...做一些测试,您会看到的。
肯特

@TimurFayzrakhmanov,您可以通过更改dystartinsert来使其可重复使用而无需任何插件call feedkeys("cgn", 'n')(请参阅下面的答案)
Jerome Dalbert

4

通过使用函数,更容易实现(和记录)复杂的映射:

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>

1
即使使用“不错”的UI,它也可以满足OP的需要,并且可以比预期的“更多”,这取决于您输入的内容。例如,当有人看到时enter motion:,他给出了:t,ggVGJZZ ^ _ ^这是命令连接的一个常见问题
肯特

那几乎就是我想要的。例如:我按,/cw然后键入一些东西而不是单词,然后按<Esc>。之后,我想对下一次出现做同样的事情。但是,在n(转到下一个出现)和.(重复上一个命令)之后,它只是在最后键入的文本之前加上了替换而不是替换它。映射的主要目标是将其与n/N.重复使用。我错过了什么吗?
Timur Fayzrakhmanov

1
此功能是为了在您遇到复杂映射问题时阐明使用功能的想法。您应该更改它以满足您的需求;尝试按照Kent的建议.重复执行命令。
mMontu 2015年

谢谢你的回答。它也很有用,但我接受@Kent的那个,因为它会在我键入它们后立即动作(没有<CR>从中挂起input())。
Timur Fayzrakhmanov

1
@TimurFayzrakhmanov,您也可以尝试替代产品,如更新中所述。
mMontu 2015年

1

此解决方案适用于“重复最后一个命令”(又名.):

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'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.