Jak odwracać znaki lub słowa, takie jak transpozycja emacsa?

10

Na readline basha w trybie emacsa niedawno odkryłem funkcjonalność transpozycji , dającą mi możliwość szybkiego poprawienia literówki, takiej jak

dc dir

do

cd dir

naciskając CTRL+ Tna cznak.

Czy w Vi / Vim jest coś podobnego, co pozwala mi zamieniać znaki i słowa?

k0pernikus
źródło
1
Z pewnością możesz zrobić makro / powiązanie, które to robi. vim.wikia.com/wiki/Reverse_letters jest przykładem
fruglemonkey

Odpowiedzi:

13

W przypadku znaków jest to dość proste: xpzamienić literę pod kursorem na następną literę i Xpzamienić literę pod kursorem na poprzednią literę.

xPolecenie usuwa znak pod kursorem, pozostawiając kursor na następnego znaku. XKomenda kasuje znak przed kursorem, pozostawiając kursor na tym samym charakterze to było na.

pwstawia (wkleja) ostatnio usunięty lub ostatnio szarpany tekst tuż za bieżącą pozycją kursora. ( Pumieszcza go tuż przed bieżącą pozycją kursora, więc xPi XPoba pozostawiają tekst taki, jaki był przed rozpoczęciem).

Jeśli chodzi o zamianę słów, nie jestem pewien; może ktoś inny może na to odpowiedzieć. Możesz zbliżyć się do dawwP(lub odwzorować go, aby był krótszy), ale spowoduje to pęknięcie na kilku przypadkach krawędziowych, na przykład pod koniec linii.

Dzika karta
źródło
2
Jeśli nie-podstawowe rozwiązania są akceptowalne, istnieje github.com/tommcdo/vim-exchange, który pozwala nie tylko wymieniać słowa, ale także całe regiony vimcasts.org/episodes/…
dnns
2

Odwzorowania zamiany słów dla języków łacińskich

Odwzorowania zamiany słów z wiki Vima nie będą działać poprawnie na słowach ze znakami akcentowanymi.

Odwzorowania te są przystosowane do pracy ze znakami (europejskimi) ISO / IEC_8859-1 Latin-1 Supplement . Odbywa się to przez zastąpienie wszystkich przypadków \wz [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]i wszystkich przypadków \_Wz \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Usuwanie podświetlenia wyszukiwania

Ponadto podświetlanie wyszukiwania jest usuwane w razie potrzeby. Osiąga się to poprzez dodanie :nohlsearch<return>na końcu każdego mapowania w razie potrzeby.

Oto wynik końcowy:

" 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{
Serge Stroobandt
źródło