Как эмулировать транспонированные слова Emacs в Vim? - PullRequest
14 голосов
/ 26 сентября 2008

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.

Ответы [ 5 ]

7 голосов
/ 27 сентября 2008

Они из моего .vimrc и хорошо работают для меня.

" swap two words
:vnoremap <C-X> <Esc>`.``gvP``P
" Swap word with next word
nmap <silent> gw    "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l> *N*
5 голосов
/ 26 сентября 2008

В середине строки перейдите к первой букве первого слова, затем выполните

dw wP

В конце строки (т. Е. Последние два слова строки), перейдите к пробелу между словами и выполните

2dw bhP

Из удобного Эквивалентность команд VIM & Emacs


Вы можете добавить для них сочетания клавиш, добавив в файл vimrc что-то вроде следующего:

map L dwwP
map M 2dwbhP 

В этом случае SHIFT-L (в командном режиме) будет переключать слова в середине строки, а SHIFT-M - в конце.

Примечание: лучше всего работает со словами, разделенными пробелами, и не очень хорошо обрабатывает конкретный случай ОП.

5 голосов
/ 26 сентября 2008

В зависимости от ситуации вы можете использовать команды W или B, как в dWwP. «Заглавные» версии переходят к следующему / предыдущему пробелу, включая пунктуацию. Команды f и t также могут помочь в определении конца удаленного диапазона.

Существует также обсуждение на Vim Tips Wiki различных методов обмена.

2 голосов
/ 20 сентября 2012

Есть подсказка по http://vim.wikia.com/wiki/VimTip10. Но я выбрал свой собственный. Мой фрагмент имеет два очевидных преимущества перед методом, упомянутым в подсказке: 1) он работает, когда курсор отсутствует в слове. 2) он не выделит весь экран.

Он работает почти как emacs 'transpose-words', за исключением того, что когда транспонирование невозможно, он ничего не делает. (emacs 'transpose-words' будет мигать и изменить позицию курсора на начало текущего слова.)

"transpose words (like emacs `transpose-words')
function! TransposeWords()
    if search('\w\+\%#\w*\W\+\w\+')
    elseif search('\w\+\W\+\%#\W*\w\+')
    endif
    let l:pos = getpos('.')
    exec 'silent! :s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/'
    call setpos('.', l:pos)
    let l:_ = search('\(\%#\w\+\W\+\)\@<=\w\+')
    normal el
endfunction

nmap <silent> <M-right> :call TransposeWords()<CR>
imap <silent> <M-right> <C-O>:call TransposeWords()<CR>
0 голосов
/ 26 сентября 2008

Вы можете использовать dwwP или dWwP, как сказали Марк и CapnNefarious, но у меня есть несколько моих собственных заметок:

  • Если курсор находится на первой букве второго слова, как в приведенном вами примере, вы можете использовать dwbP (или dWbP для обработки знаков препинания);
  • Если курсор находится в середине слова, вы можете использовать dawbP / daWbP.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...