Como alternar palavras de uma maneira fácil (no VIM)?

12

Não sou bom o suficiente no vim para determinar se isso foi possível ou não (e foi por isso que vim para o superusuário e não é bom) ~ existe uma maneira no vim de alternar facilmente duas palavras?

por exemplo, def function(param1, param2)existe uma maneira rápida / fácil de mudar isso para def function(param2, param1)???

funk-shun
fonte

Respostas:

13

Não me lembro de onde peguei isso originalmente, mas ele está no meu ~ / .vimrc há pelo menos alguns anos:

" Swap the word the cursor is on with the next word (which can be on a
" newline, and punctuation is "skipped"):
nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>:noh<CR>

Depois de definir isso, tudo o que você precisa fazer é colocar o cursor em algum lugar "param1" no modo normal e digite: gw

Heptite
fonte
4
Eu também tenho, vem do wiki do vim.
Romainl 30/05
5

+1 para a resposta de @ Heptite.

Para uma maior abrangência, aqui está o que eu tenho no meu .vimrc:

" push current line up or down
nnoremap <leader><Up> ddkP
nnoremap <leader><Down> ddp

" exchange character under cursor with the next character without moving the cursor
nnoremap gc xph

" exchange word under cursor with the next word without moving the cursor
nnoremap gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the left
nnoremap <leader><Left> "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the right
nnoremap <leader><Right> "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>/\w\+\_W\+<CR><C-l>

Fonte: wiki do vim .

Vejo que o meu (e o wiki) gwé um pouco diferente do de Heptite. Não tenho certeza de qual é o melhor.

romainl
fonte
4

Essa longa solução é feia. Suponha que o cursor esteja à esquerda da primeira letra da primeira palavra, ou seja, 'p'. Faça o seguinte: dwlpldw%p. Isso se encaixa no seu caso especial. Que tal lidar com a edição diária? Tente dwwPou dWWP. : D

Dicas: nem sempre escreva expressões regulares longas, se não precisar fazer isso com frequência. Caso contrário, o seu vimrc cresce. Todos os usuários do vim devem estar familiarizados com o movimento do cursor interno.

user1641838
fonte
1

Escrevi mapeamentos repetíveis usando uma combinação de vim-exchange , Repeatable (que depende de repeat.vim ) e argtextobj .

" Swap function arguments, move the argument under the cursor to the left or to
" the right.
Repeatable map <leader>al cxiaf,cxia
Repeatable map <leader>ah cxiaF,hcxia

A vantagem em usar os plugins de troca e repetíveis para esses mapeamentos é:

  • Fazer um desfazer udesfará a troca (são alterações atômicas)
  • Você pode usar o .para continuar movendo o argumento para a esquerda / direita.

Sei que sei, parece que existem muitos plugins para uma operação simples, mas pense no que mais esses plug-ins oferecem:

  • argtextobj lhe dá a iae aatextobj para apagar ( diae daa), e puxando ( yia).
  • vim-repeat e Repeatable para tornar qualquer um de seus mapeamentos repetível ..
  • O vim-exchange oferece trocas repetitivas e atômicas de texto.
dsummersl
fonte
1

Trocar mapeamentos para idiomas latinos

Os mapeamentos de troca 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 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
0

O plugin Eclim fornece um bom. Todos os créditos para eles :)

:SwapWords

.. e se você não deseja instalar o plugin inteiro, eis a função extraída:

" Swap words:
" taken from Eclim
" https://github.com/ervandew/eclim

function! SwapWords() " {{{
  " Initially based on http://www.vim.org/tips/tip.php?tip_id=329

  " save the last search pattern
  let save_search = @/

  normal! "_yiw
  let pos = getpos('.')
  keepjumps s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/
  call setpos('.', pos)

  " restore the last search pattern
  let @/ = save_search

  silent! call repeat#set(":call SwapWords()\<cr>", v:count)
endfunction " }}}

command! SwapWords :call SwapWords()
iago-lito
fonte