Intercambiar argumentos de función

19

Al refactorizar el código, sería útil poder intercambiar argumentos de función.

Cambio por ejemplo:

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

dentro

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

¿Hay alguna manera de intercambiar argumentos a la izquierda / derecha, manteniendo los paréntesis y las comas en su lugar?


Tenga en cuenta que esto podría ser bastante complicado si desea tener en cuenta los argumentos que son llamadas a funciones con sus propios argumentos, por ejemplo: func(baz->spam, foo[0], bar(a, b, c))apoyar estos casos probablemente implicaría un análisis más completo.

ideasman42
fuente

Respuestas:

23

Sin complementos

El | indica la posición del cursor

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

Pasos:

  1. dt) borrará baz.spam
  2. Ff moverá el cursor al carácter f en foo[0]
  3. vt,p eliminará foo [0] y lo reemplazará con baz.spam
  4. $P pegará el foo [0] antes de los parens
  5. Repita los pasos 1-4 para cualquier otro.

Con complementos

  • vim-argumentativo de Peter Rincker : proporciona objetos de texto para moverse por argumentos de función (asignaciones predeterminadas: <,y >,).
  • vim-exchange de Tom McDonald : proporciona asignaciones prácticas para intercambiar dos selecciones (asignaciones predeterminadas: cxen modo normal y Xen modo visual).
  • vim-sideways de Andrew Radev : Mover argumentos de función (y otros elementos delimitados por algo) hacia la izquierda y hacia la derecha (Asignaciones predeterminadas:) NA.
  • vim-swap por machakann : reordenar elementos delimitados (asignaciones predeterminadas: g<y g>).
akshay
fuente
66
la solución no-plugin es muy específico para el caso ...
Elyashiv
3
@elyashiv la idea es que puede usar una técnica similar para cualquier argumento de función. Básicamente, tira de una palabra, selecciona visualmente otra palabra, pega, que Vim tirará el carácter eliminado al registro, y luego pega desde donde primero sacaste.
akshay
1
¡+1 para vim-sideways! La última sección describe una característica muy agradable: cia "cambiar de argumento". ❤️
Martijn Courteaux
5

Les presento 3 métodos. Los dos primeros son casos particulares, que requieren menos pulsaciones de teclas. El último es genérico. |representa la posición del cursor.


Intercambie argumentos adyacentes (no funciona para los últimos dos)

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

Pasos:

  1. dW eliminar la palabra actual (argumento)
  2. W ir al primer char del siguiente argumento
  3. P pegar antes del cursor

Intercambia los dos últimos argumentos

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

Pasos:

  1. dt, eliminar hasta la próxima coma
  2. E ir al último personaje del siguiente argumento
  3. P pegar antes del cursor

Intercambia dos argumentos

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

Pasos:

  1. vt,d eliminar visualmente hasta coma
  2. W varias veces hasta llegar al argumento con el que desea intercambiar
  3. gP pegue antes del cursor y coloque el cursor en el carácter después del contenido pegado
  4. dt,eliminar hasta la próxima coma. reemplazar ,por )si este es el último argumento
  5. `< volver al comienzo de la última área visual (el cursor se colocará en la coma)
  6. P pegar antes del cursor

Editar: como señaló @ aharris88, el OP quiere que el último argumento sea el primero y mover todos los demás a la derecha.

Rotar argumentos a la derecha

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

Pasos:

  1. dw Eliminar ,␣
  2. dt) eliminar el último argumento
  3. %p saltar a paréntesis de apertura y pegar el último argumento
  4. a,␣ inserte una coma y espacio
  5. <Esc> volver al modo normal

O, si no quieres salir del modo normal:

  1. "rdweliminar ,␣en un registror
  2. dt) eliminar el último argumento
  3. %p saltar a paréntesis de apertura y pegar el último argumento
  4. "rp pegar contenido del registro r

Bonificación: un GIF para cada caso: intercambio1 , intercambio2 , intercambio3 y rotación

Gonçalo Ribeiro
fuente
Si bien esta respuesta intercambia argumentos, no responde la pregunta, que es cómo mover el último argumento al principio.
aharris88
@ aharris88, tienes razón. Edité mi respuesta.
Gonçalo Ribeiro