Comment inverser des caractères ou des mots comme la transposition d'emacs?

10

Sur la ligne de lecture de bash en mode emacs, j'ai récemment découvert la fonctionnalité de transposition , me donnant la possibilité de corriger rapidement une faute de frappe comme

dc dir

à

cd dir

en appuyant sur CTRL+ Tsur le ccaractère.

Y a-t-il quelque chose de similaire dans Vi / Vim qui me permet d'échanger des caractères et des mots?

k0pernikus
la source
1
Vous pouvez certainement créer une macro / liaison qui fait cela. vim.wikia.com/wiki/Reverse_letters est un exemple
fruglemonkey

Réponses:

13

Pour les caractères, c'est assez simple: xpéchanger la lettre sous le curseur avec la lettre suivante, et Xpéchanger la lettre sous le curseur avec la lettre précédente.

La xcommande supprime le caractère sous le curseur, laissant le curseur sur le caractère suivant. La Xcommande supprime le caractère juste avant le curseur, laissant le curseur sur le même caractère qu'il était.

pplace (colle) le dernier texte supprimé ou le dernier texte retiré juste après la position actuelle du curseur. ( PMet juste avant la position du curseur, de sorte xPet à la XPfois laisser le texte tel qu'il était avant de commencer.)

Pour échanger des mots, je ne suis pas sûr; peut-être que quelqu'un d'autre peut y répondre. Vous pouvez vous rapprocher dawwP(ou le remapper pour être plus court) mais cela se cassera sur plusieurs cas de bord, par exemple près de la fin d'une ligne.

Caractère générique
la source
2
Si des solutions non essentielles sont acceptables, il y a github.com/tommcdo/vim-exchange qui vous permet non seulement d'échanger des mots mais aussi des régions entières vimcasts.org/episodes/…
dkns
2

Mappages d'échange de mots pour les langues latines

Les mappages d'échange de mots du wiki Vim ne fonctionneront pas correctement sur les mots avec des caractères accentués.

Ces mappages sont adaptés pour fonctionner avec les caractères du supplément Latin-1 ISO / IEC_8859-1 (européen) . Cela se fait en remplaçant toutes les instances de \wwith [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]et toutes les instances de \_Wwith \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Suppression de la mise en évidence de la recherche

De plus, la mise en évidence de la recherche est effacée si nécessaire. Ceci est réalisé en ajoutant :nohlsearch<return>à la fin de chaque mappage si nécessaire.

Voici le résultat final:

" 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
la source