Comment changer de mots facilement (en VIM)?

11

Je ne suis pas assez bon à vim pour déterminer si cela était possible ou non (ce qui explique pourquoi je suis venu au superutilisateur et non au bon) ~ y at-il un moyen dans vim de changer facilement deux mots?

par exemple dans def function(param1, param2) Y at-il un moyen rapide / facile de changer cela en def function(param2, param1)???

funk-shun
la source

Réponses:

11

Je ne me souviens pas d'où je l'ai eu à l'origine, mais cela fait au moins quelques années dans mon ~ / .vimrc

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

Une fois que vous avez défini cela, il vous suffit de placer votre curseur quelque part sur "param1" en mode normal et de taper gw

Heptite
la source
3
Je l'ai aussi, ça vient du wiki vim.
romainl
5

+1 pour la réponse de @ Heptite.

Pour plus de complétude, voici ce que j'ai dans mon .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>

La source: le wiki vim .

Je vois mon (et celui du wiki) gw est légèrement différent de celui de Heptite. Je ne sais pas lequel est le meilleur.

romainl
la source
4

Cette longue solution est laide. Supposons que votre curseur se trouve à gauche de la première lettre du premier mot, c'est-à-dire «p». Faire ceci: dwlpldw%p. Cela correspond à votre cas particulier. Que diriez-vous du traitement quotidien? Essayer dwwP, ou dWWP. :RÉ

Conseils: N'écrivez pas toujours une longue expression régulière si vous n'avez pas besoin de le faire souvent. Sinon, votre vimrc gronde. Tous les utilisateurs de vim doivent être familiarisés avec son mouvement de curseur intégré.

user1641838
la source
1

J'ai écrit des cartographies répétables en utilisant une combinaison de vim-exchange , Répétable (qui dépend de repeat.vim ), et 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

L'avantage d'utiliser les plugins d'échange et de répétition pour ces mappages est:

  • Faire une annulation u annulera l'échange (ce sont des changements atomiques)
  • Vous pouvez utiliser le . pour continuer à avancer l'argument gauche / droite.

Je sais que je sais, cela ressemble à un tas de plugins pour une opération simple, mais pensez à quoi autre ces plugins vous donnent:

  • argtextobj vous donne la ia et aa textobj pour supprimer ( dia et daa ) et en tirant ( yia ).
  • vim-repeat et Repeatable pour rendre toutes vos correspondances reproductibles avec ..
  • vim-exchange vous donne un échange de texte répétable et atomique.
dsummersl
la source
1

Echange de mappages pour les langues latines

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

Ces cartographies sont adaptées pour fonctionner avec (européen) ISO / IEC_8859-1 Supplément Latin-1 caractères . Ceci est fait en remplaçant toutes les instances de \w avec [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-] et toutes les instances de \_W avec \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Effacement de la recherche en surbrillance

En outre, la mise en surbrillance de la recherche est effacée si nécessaire. Ceci est réalisé en ajoutant :nohlsearch<return> à la fin de chaque cartographie dans le besoin.

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
0

Eclim Le plugin en fournit un bon. Tous les crédits à eux :)

:SwapWords

.. et si vous ne voulez pas installer le plugin complet, voici leur fonction extraite:

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