Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 以原子方式交换两个字符,以便可以使用“重复”&引用;_Vim - Fatal编程技术网

Vim 以原子方式交换两个字符,以便可以使用“重复”&引用;

Vim 以原子方式交换两个字符,以便可以使用“重复”&引用;,vim,Vim,在Vim中交换两个字符的习惯用法是xp 请参见帮助,最后一段和 但有时我需要连续做两个或更多的交换操作。我经常感到惊讶的是,对我来说感觉像是一个操作的东西,xp,实际上是对Vim的两个操作。这样就不可能用重复xp。(或使用u进行原子撤消) 有没有一种方法可以在一个操作中交换两个字符,我可以用快速重复?这并不理想,但如果您将xp存储为宏,则在执行宏后可以重复。因此,您使用的不是xp,而是@s(用于交换)。那么@@将重复它。没有…那么好,但它确实有效 编辑:你知道,我相信有一种方法可以通过一些vim

在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中的一个非常丑陋的功能,你会学到一些东西,但浪费了净工作时间——至少这是我个人在这类事情上的经验。