Domanda

Emacs ha un utile comando transpose-words che permette di scambiare la parola prima del cursore con la parola dopo il cursore, preservando la punteggiatura.

Ad esempio, & # 8216; stack | overflow & # 8217; + M-t = & # 8216; stack di overflow | & # 8217; (& # 8216; | & # 8217; è la posizione del cursore).

< a > | < p > diventa < p > < a | > .

È possibile emularlo in Vim? So che posso usare dwwP , ma non funziona bene con la punteggiatura.

Aggiornamento: No, dwwP non è veramente una soluzione. Immaginate:

SOME_BOOST_PP_BLACK_MAGIC( (a)(b)(c) )
//             with cursor here ^

Emacs & # 8217; M-t avrebbe scambiato b e c , risultando in (a) (c) (b) .

Ciò che funziona è / \ w yiwNviwpnviwgp . Ma rovina " " e " / . Esiste una soluzione più pulita?

Aggiornamento & # 178;

Risolto

:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>

Imperfetto, ma funziona.

Grazie a Camflan per aver portato alla mia attenzione l'elemento % # . Certo, è tutto sul wiki , ma non me ne sono reso conto potrebbe risolvere il problema della duplicazione esatta (Emacs ha perfettamente ragione) della funzione transpose-words .

È stato utile?

Soluzione

Questi sono dal mio .vimrc e funzionano bene per me.

" swap two words
:vnoremap <C-X> <Esc>`.``gvP``P
" Swap word with next word
nmap <silent> gw    "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l> *N*

Altri suggerimenti

A seconda della situazione, è possibile utilizzare i comandi W o B, come in dWwP. Il "capitale" le versioni passano allo spazio successivo / precedente, inclusa la punteggiatura. I comandi f e t possono anche aiutare a specificare la fine dell'intervallo eliminato.

C'è anche una discussione sul Vim Tips Wiki su varie tecniche di scambio.

Nel mezzo di una riga, vai alla prima lettera della prima parola, quindi fai

dw wP

Alla fine di una riga (ovvero le ultime due parole della riga), vai nello spazio tra le parole e fai

2dw bhP

Dal pratico Equivalenza di VIM & amp; Comandi Emacs


Puoi aggiungere tasti di scelta rapida per quelli aggiungendo qualcosa di simile al seguente nel tuo file vimrc:

map L dwwP
map M 2dwbhP 

In tal caso, SHIFT-L (in modalità comando) cambierebbe le parole nel mezzo della linea e SHIFT-M lo farebbe alla fine.

NB: funziona meglio con parole separate da spazio e non gestisce molto bene il caso specifico dell'OP.

C'è un suggerimento su http://vim.wikia.com/wiki/VimTip10 . Ma ho scelto di fare il mio. Il mio frammento presenta due ovvi vantaggi rispetto al metodo menzionato nel suggerimento: 1) funziona quando il cursore non è in una parola. 2) non illuminerà l'intero schermo.

Funziona quasi come le 'parole-trasposizione' di emacs, tranne che quando la trasposizione è impossibile, non fa nulla. (le "parole transpose" di emacs lampeggiano e cambiano la posizione del cursore all'inizio della parola corrente.)

"transpose words (like emacs `transpose-words')
function! TransposeWords()
    if search('\w\+\%#\w*\W\+\w\+')
    elseif search('\w\+\W\+\%#\W*\w\+')
    endif
    let l:pos = getpos('.')
    exec 'silent! :s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/'
    call setpos('.', l:pos)
    let l:_ = search('\(\%#\w\+\W\+\)\@<=\w\+')
    normal el
endfunction

nmap <silent> <M-right> :call TransposeWords()<CR>
imap <silent> <M-right> <C-O>:call TransposeWords()<CR>

Puoi usare dwwP o dWwP come hanno detto Mark e CapnNefarious, ma ho alcune mie note:

  • Se il cursore si trova sulla prima lettera della seconda parola, come nell'esempio che hai fornito, puoi usare dwbP (o dWbP per gestire la punteggiatura);
  • Se il cursore si trova nel mezzo della parola, è possibile utilizzare dawbP / daWbP.

C'è un script di trasposizione di parole su vim.org che funziona magnificamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top