Come capovolgere i caratteri o le parole come trasporre emacs?


10

Sulla readline di bash in modalità emacs, ho scoperto di recente la funzionalità di trasposizione , dandomi l'opportunità di correggere rapidamente un errore di battitura come

dc dir

per

cd dir

premendo CTRL+ Tsul ccarattere.

C'è qualcosa di simile in Vi / Vim che mi permette di scambiare personaggi e parole?


1
Si potrebbe certamente fare una macro / associazione che fa questo. vim.wikia.com/wiki/Reverse_letters è un esempio
fruglemonkey

Risposte:


13

Per i personaggi, è abbastanza semplice: xpscambiare la lettera sotto il cursore con la lettera seguente e Xpscambiare la lettera sotto il cursore con la lettera precedente.

Il xcomando cancella il carattere sotto il cursore, lasciando il cursore sul carattere successivo. Il Xcomando elimina il carattere appena prima del cursore, lasciando il cursore sullo stesso carattere su cui si trovava.

pmette (incolla) l'ultimo testo cancellato o l'ultimo strappato subito dopo la posizione corrente del cursore. (lo Pmette appena prima della posizione corrente del cursore, quindi xPed XPentrambi lasciano il testo com'era prima di iniziare.)

Per scambiare parole, non ne sono sicuro; forse qualcun altro può rispondere a questo. Puoi avvicinarti dawwP(o rimappare per essere più corto) ma ciò si interromperà su diversi casi limite, ad esempio vicino alla fine di una linea.


2
Se le soluzioni non core sono accettabili, allora c'è github.com/tommcdo/vim-exchange che ti permette non solo di scambiare parole ma anche intere regioni vimcasts.org/episodes/…
dkns

2

Mappature di scambio di parole per le lingue latine

I mapping di scambio di parole dal wiki di Vim non funzioneranno correttamente su parole con caratteri accentati.

Queste mappature sono adattate per funzionare con i caratteri (europei) ISO / IEC_8859-1 Latin-1 Supplement . Questo viene fatto sostituendo tutte le istanze di \wcon [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]e tutte le istanze di \_Wcon \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Cancellazione dell'evidenziazione della ricerca

Inoltre, l'evidenziazione della ricerca viene cancellata dove necessario. Ciò si ottiene aggiungendo :nohlsearch<return>alla fine di ogni mappatura quando necessario.

Ecco il risultato finale:

" 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{
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.