Как мне перевернуть символы или слова, такие как транспонирование в Emacs?

10

На readline bash в режиме emacs я недавно обнаружил функцию транспонирования , которая дала мне возможность быстро исправить опечатку наподобие

dc dir

в

cd dir

нажав CTRL+ Tна cперсонаже.

Есть ли что-то похожее в Vi / Vim, которое позволяет мне менять символы и слова?

k0pernikus
источник
1
Вы, конечно, можете сделать макрос / привязку, которая делает это. vim.wikia.com/wiki/Reverse_letters является примером
fruglemonkey

Ответы:

13

Для символов это довольно просто: xpпоменять букву под курсором следующей буквой и Xpпоменять букву под курсором предыдущей буквой.

Команда xудаляет символ под курсором, оставляя курсор на следующем символе. Команда Xудаляет символ непосредственно перед курсором, оставляя курсор на том же символе, на котором он был.

pпомещает (вставляет) последний удаленный или последний восстановленный текст сразу после текущей позиции курсора. ( Pпомещает его непосредственно перед текущей позицией курсора, xPи XPоба оставляют текст таким, каким он был до начала.)

В обмене словами я не уверен; возможно, кто-то еще может ответить на это. Вы можете приблизиться dawwP(или переназначить его, чтобы он был короче), но это сломается в нескольких крайних случаях, например, ближе к концу строки.

Wildcard
источник
2
Если неосновные решения приемлемы, то есть github.com/tommcdo/vim-exchange, который позволяет вам обмениваться не только словами, но и целыми регионами vimcasts.org/episodes/…
dkns
2

Сопоставление слов для латинских языков

Отображения подстановки слов из вики Vim не будут корректно работать со словами с акцентированными символами.

Эти сопоставления адаптированы для работы с (европейскими) символами дополнения Latin-1 ISO / IEC_8859-1 . Это делается путем замены всех экземпляров \wwith [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]и всех экземпляров \_Wwith \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Очистка поисковой подсветки

Кроме того, подсветка поиска очищается при необходимости. Это достигается путем добавления :nohlsearch<return>в конце каждого отображения при необходимости.

Вот конечный результат:

" Use gc to swap the current CHARACTER with the next, WITHOUT changing the cursor position.
nnoremap <silent> gc xph

" Use gw to swap the current WORD with the next, WITHOUT changing the cursor position.
nnoremap <silent> gw "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>

" Disable Alt+[menukey] menu keys (i.e. Alt+h for help)
set winaltkeys=no

" Use Alt + ← or Alt + h to swap the current WORD with the previous, keeping the cursor on the current word. This feels like "PUSHING" the word to the left.
nnoremap <silent> <A-Left> "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
nnoremap <silent> <A-h>    "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
" <A-h> corresponds to è

" Use Alt + → or Alt + l to swap the current WORD with the next, keeping the cursor on the current word. This feels like "PUSHING" the word to the right.
nnoremap <silent> <A-Right> "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
nnoremap <silent> <A-l>     "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
" <A-l> corresponds to ì

" Use g{ to swap the current PARAGRAPH with the next.
nnoremap g{ {dap}p{
Серж Строобандт
источник