Argomenti della funzione di scambio


19

Nel refactoring del codice sarebbe utile poter scambiare gli argomenti delle funzioni.

Cambiando ad esempio:

func(foo[0], bar(), baz.spam)

in

func(baz.spam, foo[0], bar())

Esiste un modo per scambiare gli argomenti a sinistra / a destra, mantenendo le parentesi e le virgole di funzione in atto?


Si noti che ciò potrebbe diventare piuttosto complicato se si desidera spiegare argomenti che a loro volta sono chiamate di funzione con i propri argomenti - ad esempio: func(baz->spam, foo[0], bar(a, b, c))- il supporto di questi casi comporterebbe probabilmente un'analisi più completa.

Risposte:


23

Senza plugin

| indica la posizione del cursore

func(foo[0], bar(), |baz.spam)

passi:

  1. dt) cancellerà baz.spam
  2. Ff sposta il cursore sul carattere f in foo[0]
  3. vt,p cancellerà foo [0] e lo sostituirà con baz.spam
  4. $P incollerà il foo [0] prima delle parentesi
  5. Ripeti i passaggi 1-4 per tutti gli altri.

Con plugin

  • vim-argomentativo di Peter Rincker : fornisce oggetti di testo per spostarsi tra gli argomenti delle funzioni (Mappature predefinite: <,e >,).
  • vim-exchange di Tom McDonald : fornisce utili mappature per scambiare due selezioni (Mappature predefinite: cxin modalità normale e Xvisiva).
  • vim-sideways di Andrew Radev : sposta gli argomenti della funzione (e altri elementi delimitati da qualcosa) a sinistra ea destra (Mappature predefinite:) NA.
  • vim-swap di machakann : riordina elementi delimitati (mappature predefinite: g<e g>).

6
la soluzione non plug-in è molto specifica per il caso ...
elyashiv

3
@elyashiv l'idea è che puoi usare una tecnica simile per qualsiasi argomento di funzione. Fondamentalmente, strappa una parola, seleziona visivamente un'altra parola, incolla, dal quale Vim trascina il carattere cancellato nel registro, quindi incolla da dove l'hai strappato per la prima volta.
akshay,

1
+1 per vim-sideways! L'ultima sezione descrive una funzione molto bella: cia "cambiare argomento". ❤️
Martijn Courteaux,

5

Vi presento 3 metodi. I primi due sono casi particolari, che richiedono meno tasti. L'ultimo è generico. |rappresenta la posizione del cursore.


Scambia argomenti adiacenti (non funziona per gli ultimi due)

function func(foo[0], |bar(), baz.spam, qux->norf)

passi:

  1. dW elimina la parola corrente (argomento)
  2. W vai al primo carattere del prossimo argomento
  3. P incolla prima del cursore

Scambia gli ultimi due argomenti

function func(foo[0], bar()|, baz.spam, qux->norf)

passi:

  1. dt, elimina fino alla virgola successiva
  2. E vai all'ultimo carattere del prossimo argomento
  3. P incolla prima del cursore

Scambia due argomenti qualsiasi

function func(|foo[0], bar(), baz.spam, qux->norf)

passi:

  1. vt,d elimina visivamente fino alla virgola
  2. W più volte fino a raggiungere l'argomento con cui si desidera scambiare
  3. gP incolla prima del cursore e posiziona il cursore sul carattere dopo il contenuto incollato
  4. dt,elimina fino alla virgola successiva. sostituire ,con )se questo è l'ultimo argomento
  5. `< tornare all'inizio dell'ultima area visiva (il cursore verrà posizionato sulla virgola)
  6. P incolla prima del cursore

Modifica: come sottolineato da @ aharris88, l'OP vuole che l'ultimo argomento sia il primo e sposta tutti gli altri a destra.

Ruota gli argomenti a destra

function func(foo[0], bar(), baz.spam|, qux->norf)

passi:

  1. dw Elimina ,␣
  2. dt) elimina l'ultimo argomento
  3. %p passa all'apertura delle parentesi e incolla l'ultimo argomento
  4. a,␣ inserire una virgola e uno spazio
  5. <Esc> tornare alla modalità normale

Oppure, se non vuoi mai uscire dalla modalità normale:

  1. "rdwcancellare ,␣in un registror
  2. dt) elimina l'ultimo argomento
  3. %p passa all'apertura delle parentesi e incolla l'ultimo argomento
  4. "rp incolla il contenuto del registro r

Bonus: una GIF per ogni caso: swap1 , swap2 , swap3 e rotazione


Mentre questa risposta scambia argomenti, non risponde alla domanda, che è come spostare l'ultimo argomento all'inizio.
aharris88,

@ aharris88, hai ragione. Ho modificato la mia risposta.
Gonçalo Ribeiro,
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.