2010-08-16 9 views
11

Por ejemplo si tienen algún código como:¿Hay un buen comando Vi (m) para transponer argumentos en una llamada a función? Los puntos de bonificación para Emacs

foo = bar("abc", "def", true, callback); 

¿Hay un buen comando para mover fiel a la primera o segunda posición dejando intactas las comas?

P.S como una ventaja, mi amigo quiere saber si esto también funciona en Emacs.

+1

Aunque este es un duplicado de http: // desbordamiento de pila.com/q/1270278/719547, aquí hay respuestas diferentes y buenas, y tiene años de antigüedad, así que no estoy seguro de qué es la etiqueta de voto a favor. En cualquier caso, verifique esa pregunta. Publiqué [una respuesta] (http://stackoverflow.com/a/21487681/719547) allí sobre un complemento que maneja esto. –

Respuesta

19

En Vim, si coloca el cursor al comienzo de la primera palabra y lo hace dWWP, tendrá el efecto deseado. Esta es una composición:

dW delete the current word, including the comma and the following whitespace 
W move to the start of the next word 
P insert the deleted text before the cursor 

Esto funcionará si hay otros parámetros después de que ambos se va a intercambiar - que tendrá que ser modificado si sólo hay dos parámetros o si desea cambiar los dos últimos parámetros, ya pegará el texto después del corchete de cierre.

otra posibilidad es utilizar una sustitución de expresiones regulares:

:%s/(\([^,]\+\),\s*\([^,)]\+\)/(\2, \1/ 

Este se encuentran los dos primeros argumentos después del paréntesis abierto e intercambiarlos. actualización

:

Una búsqueda de vim.org encontró el plugin swap parameters, lo que debería hacer exactamente lo que quiere y puede manejar situaciones que cualquiera de los métodos anteriores no pueden.

+0

Muy bien, pero esto no funcionará en la 2 ª al último argumento. – carl

+0

Si desea intercambiar con el último argumento, debe tomar la coma que tiene delante. P.ej. con el cursor en la coma que sigue a '" def "', escriba 'dt,' para eliminar la segunda coma y la tercera arg y luego 'ep' o' t) p' para ir al final del último argumento y pegar. Sin embargo, me encantaría saber una forma fácil de cambiar los parámetros primero y último, ese es el caso molesto que estoy buscando en este momento, así que gracias por la referencia del complemento. –

18

no sé la respuesta para vi, pero en Emacs, transpose-sexps (C-M-t) se intercambiar dos argumentos a cada lado del cursor. En realidad, transpose-words (M-t) fue mi primera suposición, pero eso deja las citas atrás.

+1

transpose-sexps también funcionará para argumentos como bar ((1 + 2), "hola"), pero aún no puede manejar la barra (1 + 2, "hola"). Por supuesto, dudo que algo simple pueda resolver el caso general de listas de argumentos arbitrariamente complejas. –

1

Necesita un comando transpose emacs. Pero se limita a no adivinar que está transpuesta en listas, solo considera texto (no puede adivinar la primera, segunda palabra de la lista). Prueba esto.

Mantenga el cursor después de la coma de verdadero. Use M-x transpose-words. Por defecto, se transpondrá con la siguiente palabra del punto. El atajo es M-t.

Puede usar C-u 2 M-t para transponer con la siguiente segunda palabra.

Ahora viene su pregunta. Si desea mover true, hacia atrás 1 palabra, use C-u -1 M-t, y para 2 palabras hacia atrás C-u -2 M-t.

No soy un tipo VIM. Lo siento por eso.

0

Si desea hacer esto como una refactorización, no solo como manipulación de texto, le sugiero que busque en Xrefactory, una herramienta de refactorización para Emacsen (gratis para C/Java, comercial para C++).

0

transposición anterior (Ctrl-t p) y el próximo (Ctrl-t n) argumento ... añadir el siguiente en su archivo .vimrc:

map <C-t>p ?,\\|(<CR>wd/,\\|)<CR>?,\\|(<CR>"_dw?,\\|(<CR>a, <C-c>?,<CR>P/,<CR>w 
map <C-t>n ?,\\|(<CR>wv/,<CR>d"_dw/\\,\\|)<CR>i, <C-r>"<C-c>?,<CR>?,\\|(<CR>w 
Cuestiones relacionadas