原子地交换两个字符,以便可以用“。”重复它。

时间:2013-08-03 15:34:20

标签: vim

在Vim中交换两个字符的习惯用法是xp

请参阅:h 04.5上的帮助,最后一段和Vim: how do I swap two characters?

但偶尔我需要连续两次或多次交换操作。我经常感到惊讶的是,对我来说感觉像是单一操作xp,实际上是Vim的两个操作。这样就无法使用xp重复.。 (或使用u进行原子撤消。)

有没有办法在单个操作中交换两个字符,我可以用.快速重复?

3 个答案:

答案 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

此处显示的映射使用cpcp是新xp,可与.重复,但在其他方面完全相同。

现在剩下的就是习惯它。