4

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

请参阅最后一段的帮助:h 04.5Vim:如何交换两个字符?.

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

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

4

3 回答 3

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,它确实会交换你所在的字符,并且当你点击它时它会重复.,但它会首先跳到行首,这不是你想要的。但我确实认为这是可以做到的,我只是没有完全做到。

于 2013-08-03T15:37:48.267 回答
0

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,可重复使用.但在其他方面完全相同。

现在剩下的就是习惯了。

于 2014-06-14T11:59:03.660 回答
0

这是一个想法。假设光标位于单词“oyxgen”的“y”上。

在正常模式下,键入

2sxy<Esc>

现在这个词读作“氧气”。找到下一个拼写错误 ( fy) 并重复更改 ( .)。

太糟糕了,这只适用于特定的交换“yx”到“xy”,所以这不是最终的解决方案。

于 2013-08-03T17:14:24.970 回答