Vim 以原子方式交换两个字符,以便可以使用“重复”&引用;
在Vim中交换两个字符的习惯用法是Vim 以原子方式交换两个字符,以便可以使用“重复”&引用;,vim,Vim,在Vim中交换两个字符的习惯用法是xp 请参见帮助,最后一段和 但有时我需要连续做两个或更多的交换操作。我经常感到惊讶的是,对我来说感觉像是一个操作的东西,xp,实际上是对Vim的两个操作。这样就不可能用重复xp。(或使用u进行原子撤消) 有没有一种方法可以在一个操作中交换两个字符,我可以用快速重复?这并不理想,但如果您将xp存储为宏,则在执行宏后可以重复。因此,您使用的不是xp,而是@s(用于交换)。那么@@将重复它。没有…那么好,但它确实有效 编辑:你知道,我相信有一种方法可以通过一些vim
xp
请参见帮助,最后一段和
但有时我需要连续做两个或更多的交换操作。我经常感到惊讶的是,对我来说感觉像是一个操作的东西,xp
,实际上是对Vim的两个操作。这样就不可能用
重复xp
。(或使用u
进行原子撤消)
有没有一种方法可以在一个操作中交换两个字符,我可以用
快速重复?这并不理想,但如果您将xp存储为宏,则在执行宏后可以重复。因此,您使用的不是xp,而是@s(用于交换)。那么@@将重复它。没有…那么好,但它确实有效
编辑:你知道,我相信有一种方法可以通过一些vimscript和tpope实现这一点。遗憾的是,我的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
有趣!DoSwap()
:正常xp
安静!呼叫重复设置(“\Swap”,1)
结束
nnoremap交换:调用DoSwap()
nmap交换
问题是,一旦您输入
\s
,它确实会交换您所使用的字符,当您点击
时,它会重复,但它会首先跳到行的开头,这不是您想要的。但我确实认为这是可以做到的,我只是没有完全做到。这里有一个想法。假设光标位于单词“oyxgen”的“y”上
在正常模式下,输入
2sxy<Esc>
2sxy
现在这个词读作“氧气”。找到打字错误的下一个实例(fy
)并重复更改(
)
糟糕的是,这只适用于从“yx”到“xy”的特定交换,因此这不是最终的解决方案。Vimcasts.org已经发布了解决这个问题的方法 正如@Jeremy猜测的那样,解决方案是使用插件。然后只需将以下映射和键映射添加到vimrc
nnoremap <silent> <Plug>Transpose xp:call repeat#set("\<Plug>Transpose")<CR>
nmap cp <Plug>Transpose
nnoremap Transpose xp:调用repeat#set(“\Transpose”)
nmap-cp转置酶
此处显示的映射使用cp
cp
是新的xp
,可与
重复,但在其他方面完全相同
现在剩下的就是习惯了。。将只重复最后一个操作(p),而不是整个宏(@s)顺便说一句,我认为注册宏确实是在这里可以做的最好的事情。只要从你的答案中删除“然后。我会重复”,我很乐意投上一票。@Bolo你完全正确。我不知道我是从哪里得到这个主意的。重复一个宏。如果宏的工作方式是通过重复击键,那就没有意义了。更正为建议改为使用@来重复。类似地,您可以第一次执行
:norm xp
,然后执行:
和@
来重复。同样的想法-没有什么“乐趣!”。在我看来,@
并不比xp
短,但是设置宏需要时间,所以最终的结果是它只是为了使用一个宏而使用一个宏,没有任何节省或节省的时间。我可以理解人们希望能够重复使用
。我经常有我想要的类似的宠物脾气,但是xp
并不比
慢多少,当你找到一个可行的解决方案时,你只想删除你的vimrc中的一个非常丑陋的功能,你会学到一些东西,但浪费了净工作时间——至少这是我个人在这类事情上的经验。