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 ^
M-t Emacs заменил бы b
и c
, что привело бы к (a)(c)(b)
.
Что работает, это /\w
yiwNviwpnviwgp
. Но это портит ""
и "/
. Есть ли более чистое решение?
Update²:
решаемые
:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>
Несовершенно, но работает.
Спасибо Camflan за то, что привлекли мое внимание к предмету %#
. Конечно, все это в wiki , но я не осознавал, что это может решить проблему точного (Emacs понял это правильно) дублирования функции transpose-words
.