¿Cómo volteo caracteres o palabras como la transposición de emacs?

10

En la línea de lectura de bash en modo emacs, recientemente descubrí la funcionalidad de transposición , dándome la oportunidad de corregir rápidamente un error tipográfico como

dc dir

a

cd dir

presionando CTRL+ Ten el cpersonaje.

¿Hay algo similar en Vi / Vim que me permita intercambiar caracteres y palabras?

k0pernikus
fuente
1
Ciertamente, podría hacer una macro / enlace que haga esto. vim.wikia.com/wiki/Reverse_letters es un ejemplo
fruglemonkey

Respuestas:

13

Para los caracteres, es bastante simple: xpintercambiar la letra debajo del cursor con la siguiente letra e Xpintercambiar la letra debajo del cursor con la letra anterior.

El xcomando elimina el carácter debajo del cursor, dejando el cursor en el siguiente carácter. El Xcomando elimina el carácter justo antes del cursor, dejando el cursor en el mismo carácter en el que estaba.

pcoloca (pega) el último texto eliminado o el último texto retirado justo después de la posición actual del cursor. ( PPone justo antes de la posición actual del cursor, de modo xPy XPtanto dejar el texto tal como estaba antes de empezar.)

Para intercambiar palabras, no estoy seguro; Quizás alguien más pueda responder eso. Puede acercarse dawwP(o reasignarlo para que sea más corto), pero eso se romperá en varios casos extremos, por ejemplo, cerca del final de una línea.

Comodín
fuente
2
Si las soluciones no básicas son aceptables, entonces hay github.com/tommcdo/vim-exchange que le permite no solo intercambiar palabras sino también regiones enteras vimcasts.org/episodes/…
dkns
2

Asignaciones de intercambio de palabras para idiomas latinos

Las asignaciones de intercambio de palabras de la wiki de Vim no funcionarán correctamente en palabras con caracteres acentuados.

Estas asignaciones están adaptadas para trabajar con caracteres (europeos) ISO / IEC_8859-1 Latin-1 Supplement . Esto se realiza sustituyendo todas las instancias de \wwith [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]y todas las instancias de \_Wwith \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Borrado de resaltado de búsqueda

Además, el resaltado de búsqueda se borra donde sea necesario. Esto se logra agregando :nohlsearch<return>al final de cada mapeo cuando sea necesario.

Aquí está el resultado 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
fuente