2009-09-05 14 views
9

En ciertos editores de texto como e, puede seleccionar varias ubicaciones y, a medida que escribe, todas las ubicaciones seleccionadas se reemplazan con los caracteres que está escribiendo.vim editar varias ubicaciones simultáneamente

Por ejemplo digamos que tienen

<tag1 class=""></tag1> 
<tag2><tag3 class=""></tag3></tag2> 

en E, que sólo podría seleccionar dos lugares (dentro de conjuntos de comillas), luego comienzan a escribir y ambas localizaciones se actualizarían condiciones simultáneamente. En vim, puede seleccionar varias columnas conectadas a la vez y luego editarlas, pero me pregunto si hay alguna forma de seleccionar varias ubicaciones que no estén alineadas.

+0

Puede explicar más acerca de lo que quiere decir con "todas las ubicaciones seleccionadas"? ¿Todos estos lugares seleccionados tienen la misma forma, como una columna? ¿O todos contienen el mismo texto inicial? –

+0

@Greg - He editado la pregunta para aclarar. Espero que ayude. – Daniel

+0

para mí, esta característica es más parecida a buscar y reemplazar, pero de una manera más elegante – nXqd

Respuesta

2

Tenga una mirada en SnippetsEmu. Debería estar haciendo algo muy similar a lo que necesita.

Emula fragmentos de texto.Debería poder tener un fragmento con la misma etiqueta repetida, y la edición hará lo correcto, actualizando la misma etiqueta en todas las ubicaciones, mientras escribe.

+0

¡Resulta que Ayman eres exactamente correcto! También hay otro script llamado snipMate que hace esto también. Vea el molde de pantalla al que se hace referencia aquí: http://www.vim.org/scripts/script.php?script_id=2540. Es casi idéntico a las funciones de screencast demostradas en e. – Daniel

5

Puede que esté buscando el modo visual en bloque, que permitirá la inserción, eliminación, etc. en varias líneas a la vez.

El modo Bloque permite selecciones cuadradas con la columna y la línea del punto inicial en una esquina, y la posición actual del cursor define la columna y la línea de la otra esquina. Esto, a diferencia de la selección basada en línea que es la predeterminada.

CTRL-v lo ubicará en el modo visual de bloqueo.

Si tiene varias líneas de este modo:

INSERT INTO Users VALUES(1, 'Jim'); 
INSERT INTO Users VALUES(2, 'Jack'); 
INSERT INTO Users VALUES(3, 'Joseph'); 

Y desea introducir "0", después de la identificación para cada línea, a continuación, colocar el cursor después de la coma en la primera línea:

INSERT INTO Users VALUES(1,* 'Jim'); 

Con el asterisco representa el cursor de la secuencia de comandos sería:

CTRL-v # Put into blockwise visual mode 
j  # Down a line 
j  # Down a line 
CTRL-I # Captial I for insert 
0,  # the text to insert 
Esc  # escape 

el sho texto ULD ahora parezca:

INSERT INTO Users VALUES(1, 0, 'Jim'); 
INSERT INTO Users VALUES(2, 0, 'Jack'); 
INSERT INTO Users VALUES(3, 0, 'Joseph'); 

también por bloques modo visual, x va a eliminar una selección, y se tire de éste.

: la ayuda CTRL-V proporcionará más documentación.

+2

La limitación con CTRL-v es que solo hace bloques contiguos, si el el texto que desea editar no está bien alineado en una columna, ¡no puede usarlo! – Daniel

+1

Ah, en ese caso me tienes. Hay un complemento multiselect, pero nunca lo he usado: http://www.vim.org/scripts/script.php?script_id=953 –

+0

¿Es realmente '', no ''? – lindhe

8

Así es como yo probablemente editar esas líneas particulares (hay muchas maneras):

/""<enter> 
aText to replace...<esc> 
n 
. 

En primer lugar, la búsqueda de las frases vacías para poner el cursor en la primera. Usando el comando "a" (adjuntar), escriba el nuevo texto para poner dentro de las comillas. Cuando haya terminado, use "n" (siguiente) para ir a la siguiente instancia y "." (repite el último comando) para insertar el mismo texto nuevamente. Repite la "n". tantas veces como sea necesario.

Este método requiere una preparación menos inicial y le permite comenzar de inmediato sin identificar de antemano todas las ubicaciones donde podría querer agregar el texto.

+0

Definitivamente es una buena forma de enviar el texto rápidamente. Sin embargo, ese no es un ejemplo de edición simultánea de la misma manera que e lo hace. Tal vez esta es la forma 'vim' de hacer las cosas (y como usted indica tiene la ventaja de que no necesita conocer todos los lugares antes de tiempo). – Daniel

+1

Vim no puede hacer ediciones simultáneas (es posible que se pueda emular a través de vimscript). Configurar un comando repetible es un poco más de trabajo de OMI, pero es la manera de hacerlo Vim. – Svend

+0

Quiero agregar que el comando en la segunda línea puede ser cualquier otra acción vim como: 5x, i

2

Para su ejemplo me gustaría utilizar una substitución:

:%s/class=""/class="something"/g 
+0

¡Gracias por la respuesta! Sin embargo, mi pregunta no es sobre encontrar alguna solución al ejemplo admitido artificialmente sino sobre cómo resolver el ejemplo usando edición simultánea. – Daniel

0

también estoy buscando algo así, más específicamente, una funcionalidad muy útil de ST2, donde presiona CTRL + D para seleccionar la siguiente aparición y luego reemplazar ambas ocurrencias simplemente escribiéndola.

Cuestiones relacionadas