Emacs有一个实用的transpose-words
命令,它允许用户交换光标前面的单词和后面的单词,并保留标点符号。
例如,‘stack |overflow
’ + M-t = ‘overflow stack|
’(‘|
’是光标位置)。
<a>|<p>
变成了<p><a|>
。
在Vim中是否可能模拟这个功能?我知道我可以使用dwwP
,但它在处理标点方面效果不佳。
更新:不,dwwP
真的不是一个解决方案。想象一下:
SOME_BOOST_PP_BLACK_MAGIC( (a)(b)(c) )
// with cursor here ^
Emacs的M-t会交换b
和c
,导致结果是(a)(c)(b)
。
可行的方法是/\w yiwNviwpnviwgp
。但它破坏了""
和"/
。有更简洁的解决方案吗?
更新²:
已解决
:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>
还有不足之处,但是能用。
感谢Camflan提醒我%#
这个东西。当然,这都写在维基上了,但我并没有意识到它可以解决精确地(Emacs做到了完全正确)复制transpose-words
功能的问题。