Come scambiare le parole in modo semplice (in VIM)?


12

Non sono abbastanza bravo in Vim per determinare se questo è stato possibile o meno (motivo per cui sono arrivato a superutente e non buono) ~ c'è un modo in Vim per cambiare facilmente due parole?

per esempio def function(param1, param2)c'è un modo semplice / veloce per cambiarlo in def function(param2, param1)???

Risposte:


13

Non ricordo dove l'ho preso in origine, ma è stato nel mio ~ / .vimrc da almeno alcuni anni:

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

Dopo averlo definito, tutto ciò che devi fare è posizionare il cursore da qualche parte su "param1" in modalità normale e digitare: gw


4
Ho anche, viene dal wiki di VIM.
Romainl,

5

+1 per la risposta di @ Heptite.

Per maggiore completezza, ecco cosa ho nel mio .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: il wiki di vim .

Vedo che il mio (e il wiki) gwè leggermente diverso da quello di Heptite. Non sono sicuro di quale sia la migliore.


4

Quella lunga soluzione è brutta. Supponiamo che il cursore sia a sinistra della prima lettera della prima parola, che è 'p'. Fate questo: dwlpldw%p. Questo si adatta al tuo caso speciale. Che ne dici di gestire il montaggio quotidiano? Prova dwwP, oppure dWWP. : D

Suggerimenti: non sempre scrivere lunghe espressioni regolari, se non è necessario farlo spesso. Altrimenti il ​​tuo boom vimrc. Tutti gli utenti di VIM devono avere familiarità con il movimento del cursore incorporato.


1

Ho scritto mappature ripetibili usando una combinazione di vim-exchange , Repeatable (che dipende da 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

Il vantaggio nell'uso dei plug-in intercambiabili e ripetibili per questi mapping è:

  • Fare un annullamento uannullerà lo scambio (sono cambiamenti atomici)
  • Puoi usare il tasto .per continuare a spostare l'argomento a sinistra / a destra.

So che lo so, sembra un sacco di plugin per una semplice operazione, ma pensa cos'altro ti danno quei plugin:

  • argtextobj ti dà iae aatextobj per cancellare ( diae daa) e yanking ( yia).
  • vim-repeat e ripetibile per rendere ripetibili i tuoi mapping con ..
  • vim-exchange ti offre uno scambio atomico e ripetibile di testo.

1

Scambia mappature per le lingue latine

I mapping di scambio dal wiki di Vim non funzioneranno correttamente su parole con caratteri accentati.

Queste mappature sono adattate per funzionare con i caratteri (europei) ISO / IEC_8859-1 Latin-1 Supplement . Questo viene fatto sostituendo tutte le istanze di \wcon [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]e tutte le istanze di \_Wcon \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Cancellazione dell'evidenziazione della ricerca

Inoltre, l'evidenziazione della ricerca viene cancellata dove necessario. Ciò si ottiene aggiungendo :nohlsearch<return>alla fine di ogni mappatura necessaria.

Ecco il risultato finale:

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

0

Il plug-in Eclim ne offre una buona. Tutti i crediti a loro :)

:SwapWords

.. e se non vuoi installare l'intero plugin, ecco la loro funzione estratta:

" 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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.