在Vim中交换两个字符的习惯用法是xp
。
请参阅:h 04.5
上的帮助,最后一段和Vim: how do I swap two characters?。
但偶尔我需要连续两次或多次交换操作。我经常感到惊讶的是,对我来说感觉像是单一操作xp
,实际上是Vim的两个操作。这样就无法使用xp
重复.
。 (或使用u
进行原子撤消。)
有没有办法在单个操作中交换两个字符,我可以用.
快速重复?
答案 0 :(得分:2)
这不太理想,但如果将xp存储为宏,则在执行宏后它将是可重复的。所以不是xp,而是使用,比如@s(用于交换)。然后@@将重复它。不如。,但确实有效。
编辑:你知道,我确信有一种方法可以通过一些vimscript和tpope的repeat.vim来实现这一点。可悲的是,我的vimscript不适合鼻烟。我做到了这一点 - 也许有人可以纠正我出错的地方?
fun! DoSwap()
:normal xp
silent! call repeat#set("\<Plug>Swap",1)
endfun
nnoremap <silent> <Plug>Swap :call DoSwap()<CR>
nmap <Leader>s <Plug>Swap
问题在于,一旦你输入\s
,它确实会交换你所在的角色,并且当你点击.
时它会重复,但它跳到了{{1}}的开头。先行,这不是你想要的。但我确实认为这可以做到,我不是一直都在那里。
答案 1 :(得分:0)
这是一个想法。假设光标位于单词“oyxgen”的“y”上。
在普通模式下,输入
2sxy<Esc>
现在这个词写着“氧气”。找到拼写错误的下一个实例(fy
)并重复更改(.
)。
太糟糕了,这只适用于特定的交换“yx”到“xy”,所以这不是最终的解决方案。
答案 2 :(得分:0)
Vimcasts.org发布了an episode来解决这个问题。
由于@Jeremy猜测解决方案是使用repeat.vim插件。然后只需将以下<Plug>
映射和键映射添加到您的vimrc。
nnoremap <silent> <Plug>Transpose xp:call repeat#set("\<Plug>Transpose")<CR>
nmap cp <Plug>Transpose
此处显示的映射使用cp
。 cp
是新xp
,可与.
重复,但在其他方面完全相同。
现在剩下的就是习惯它。