Como inverter caracteres ou palavras como a transposição do emacs?

10

Na linha de leitura do bash no modo emacs, descobri recentemente a funcionalidade de transposição , dando-me a oportunidade de corrigir rapidamente um erro de digitação como

dc dir

para

cd dir

pressionando CTRL+ Tno ccaractere.

Existe algo semelhante no Vi / Vim que me permite trocar caracteres e palavras?

k0pernikus
fonte
1
Você certamente poderia criar uma macro / ligação que faça isso. vim.wikia.com/wiki/Reverse_letters é um exemplo
fruglemonkey

Respostas:

13

Para caracteres, é bastante simples: xptrocar a letra sob o cursor pela letra a seguir e Xptrocar a letra sob o cursor pela letra anterior.

O xcomando exclui o caractere abaixo do cursor, deixando o cursor no próximo caractere. O Xcomando exclui o caractere logo antes do cursor, deixando o cursor no mesmo caractere em que estava.

pcoloca (cola) o último texto excluído ou último arrancado logo após a posição atual do cursor. ( Pcoloca-o imediatamente antes da posição atual do cursor, portanto, xPe XPambos deixam o texto como estava antes de você começar.)

Para trocar palavras, não tenho certeza; talvez alguém possa responder isso. Você pode se aproximar dawwP(ou remapear para ser mais curto), mas isso será interrompido em vários casos extremos, por exemplo, perto do final de uma linha.

Curinga
fonte
2
Se as soluções não-essenciais são aceitáveis, então não há github.com/tommcdo/vim-exchange que lhe permite não só trocar palavras, mas também regiões inteiras vimcasts.org/episodes/...
dkns
2

Mapeamentos de troca de palavras para idiomas latinos

Os mapeamentos de troca de palavras do wiki do Vim não funcionarão corretamente em palavras com caracteres acentuados.

Esses mapeamentos são adaptados para trabalhar com caracteres (europeus) ISO / IEC_8859-1 Suplemento latino-1 . Isso é feito substituindo todas as instâncias de \wcom [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]e todas as instâncias de \_Wcom \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Compensação do destaque da pesquisa

Além disso, o realce da pesquisa é limpo quando necessário. Isso é obtido adicionando :nohlsearch<return>ao final de cada mapeamento, quando necessário.

Aqui está o 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
fonte