在 Vim 中交换两个字符的习惯用法是xp
.
请参阅最后一段的帮助:h 04.5
和Vim:如何交换两个字符?.
但偶尔我需要连续执行两个或多个交换操作。我经常感到惊讶的是,在我看来,一个操作xp
实际上是对 Vim 的两个操作。这使得无法重复xp
使用.
. (或使用 . 进行原子撤消u
。)
有没有办法在一个操作中交换两个字符,我可以快速重复.
?
在 Vim 中交换两个字符的习惯用法是xp
.
请参阅最后一段的帮助:h 04.5
和Vim:如何交换两个字符?.
但偶尔我需要连续执行两个或多个交换操作。我经常感到惊讶的是,在我看来,一个操作xp
实际上是对 Vim 的两个操作。这使得无法重复xp
使用.
. (或使用 . 进行原子撤消u
。)
有没有办法在一个操作中交换两个字符,我可以快速重复.
?
这并不理想,但是如果您将 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
,它确实会交换你所在的字符,并且当你点击它时它会重复.
,但它会首先跳到行首,这不是你想要的。但我确实认为这是可以做到的,我只是没有完全做到。
Vimcasts.org 已经发布了一集来解决这个问题。
正如@Jeremy 猜测的那样,解决方案是使用repeat.vim插件。然后只需将以下<Plug>
映射和键映射添加到您的 vimrc。
nnoremap <silent> <Plug>Transpose xp:call repeat#set("\<Plug>Transpose")<CR>
nmap cp <Plug>Transpose
此处显示的映射使用cp
. cp
是新的xp
,可重复使用.
但在其他方面完全相同。
现在剩下的就是习惯了。
这是一个想法。假设光标位于单词“oyxgen”的“y”上。
在正常模式下,键入
2sxy<Esc>
现在这个词读作“氧气”。找到下一个拼写错误 ( fy
) 并重复更改 ( .
)。
太糟糕了,这只适用于特定的交换“yx”到“xy”,所以这不是最终的解决方案。