2011-09-29 15 views
22

Supongamos que tengo el trozo de texto de abajo con el cursor se aloja en la primera A Actualmente,Cómo insertar un bloque de espacios en blanco comenzando en la posición del cursor en vi?

AAAA 
BBB 
CC 
D 

¿Cómo puedo añadir espacios delante de cada línea para que sea igual, y sería grande si el número de columnas de espacios se pueden especificar sobre la marcha, por ejemplo, dos aquí.

AAAA 
    BBB 
    CC 
    D 

Me imagino que hay una manera de hacerlo rápidamente en modo visual, pero ¿alguna idea?

Actualmente estoy copiando la primera columna de texto en modo visual dos veces, y reemplazo las dos columnas completas en espacios, lo que implica> 5 pulsaciones de teclas, demasiado engorroso.

Restricción:

Lo siento que no indicaba claramente la pregunta y podría crear algunas confusiones.

El destino es solo una parte de un archivo más grande, por lo que sería genial si se puede especificar el número de filas y columnas a partir del primer A.

Editar:

agradecer tanto @DeepYellow y @Johnsyweb, al parecer >} y >ap son todos los grandes consejos que yo no era consciente de, y ambos podrían ser respuestas válidas antes de que yo aclaré en el requisito específico para la respuesta a mi pregunta, pero en cualquier caso, la respuesta de @luser droog se destaca como la única respuesta viable. ¡Gracias a todos!

Respuesta

42

que haría uso de :%s/^/ /

También puede especificar un rango de líneas :10,15s/^/ /

O un rango relativo :.,+5s/^/ /

O utilizar expresiones regulares para determinar las ubicaciones :/A/,/D/>.

Para copiar el código para pegar en el SO, por lo general usar sed desde el terminal sed 's/^/ /' filename


acceso directo

I just learned un nuevo truco para esto. Entras en modo visual v, seleccione la región (con el movimiento regular de los comandos), después haga clic en : que le da esto:

:'<,'> 

listo para que escriba sólo el comando parte de los comandos anteriores, la las marcas '< y '> se ajustan automáticamente a los límites de la selección visual.

Para seleccionar y guión del párrafo actual:

vip> 

o

vip:> 

seguido por entrar.

Editar:

a lo solicitado en los comentarios, también se puede añadir espacios para el medio de una línea usando un cuantificador de expresiones regulares \{n} en el cualquier meta-carácter ..

:%s/^.\{14}/&/

Esto agrega un espacio de 14 caracteres a la izquierda en cada línea. Por supuesto, % podría reemplazarse por cualquiera de las opciones anteriores para especificar el rango de un ex comando.

+0

¡Encantador, gracias! – nye17

+0

vim es genial \ o/ –

+0

¿Y para agregar espacio en blanco después de 14 caracteres en todas las líneas del archivo? – HenioJR

12

que haría uso de >}.

Dónde ...

  • >: desplaza a la derecha y
  • }: significa que hasta el final del párrafo

Espero que esto ayude.

+0

te refieres al modo visual ¿no? Solo uso esto cuando el número de espacios es el mismo que el especificado en vimrc para la sangría ... – nye17

+1

Esto está en [modo normal] (http://vimdoc.sourceforge.net/htmldoc/intro.html# Normal). No especificó el ancho de desplazamiento (o al menos no lo hizo cuando respondí). – Johnsyweb

+0

@ nye17: no 'establece shiftwidth = 4 softtabstop = 4 expandtab'? –

4

Puede seleccionar las líneas en modo visual y escribir >. Esto supone que usted ha fijado sus pestañas hacia arriba para insertar espacios, por ejemplo:

setl expandtab 
setl shiftwidth=4 
setl tabstop=4 

(4 sustituir con su preferencia en la muesca)

Si las líneas forman un párrafo, >ap en modo normal cambiará la párrafo entero arriba y debajo de la posición actual.

18

Cuando en la primera A, iría en modo visual bloque ctrl-v, seleccione las líneas que desea modificar, pulse I (modo de inserción con el capital i), y aplicar los cambios que quiero para la primera línea. Al salir del modo visual esc se aplicarán todos los cambios en la primera línea a todas las líneas.

Probablemente no sea el más eficiente en el número de golpes de tecla, pero le da toda la libertad que desea antes de salir del modo visual. No me gusta cuando tengo que especificar a mano el rango de línea y columna en un comando de expresión regular.

+2

¡Oh! ¡Este es realmente un gran truco! ¡Cualquier cambio para la primera línea terminará siendo aplicado al resto del bloque seleccionado! ¡Gracias por compartir! – nye17

+0

Eso es lo divertido de VIM, siempre hay algo por descubrir. Esto era nuevo para mí. –

2

Me gustaría hacer como Nigu.Otra solución es utilizar :normal:

  1. <S-v> para acceder al modo VISUAL-LINE
  2. 3j o jjj o /D<CR> para seleccionar las líneas
  3. :norm I<Space><Space>, el rango correcto ('<,'>) que se inserta automáticamente

:normal es probablemente un poco exagerado para este caso específico, pero a veces es posible que desee realizar ab unidad de operaciones complejas en un rango de líneas.

+0

¡Wow, ya nos has contado sobre esto! I + 1-ed it, pero no debo haberlo leído muy de cerca. ': normal' es mi nuevo amigo. –

+0

': normal' será tu amigo para siempre. – romainl

9
  1. Ctrl + V (para entrar en el modo visual)
  2. Use las teclas de flecha para seleccionar las líneas
  3. Shift + i (le lleva al modo de inserción)
  4. teclas de espacio Hit o como se quiera para escribir delante de las líneas seleccionadas.
  5. Guarde los cambios (Uso: w) y verá los cambios en todas las líneas seleccionadas.
1

Otra cosa que podría intentar es una macro. Si aún no lo sabe, inicie una macro con q y seleccione el registro para guardar la macro ... para guardar su macro en el registro a, escribiría qa en modo normal.

En la parte inferior debe haber algo que diga la grabación. Ahora haz tu movimiento como quieras.

Por lo tanto, en este caso, quería 2 espacios delante de cada línea, de modo que con el cursor ya al principio de la primera línea, vaya al modo insertar y pulse espacio dos veces. Ahora pulse escape para ir al modo normal, luego a la siguiente línea, luego al principio de esa línea, y presione q. Esto finaliza y guarda el macro

(para que todo esté en un lugar, esta es la lista completa de combinaciones de teclas que haría, donde <esc> es cuando presiona la tecla Escape, y <space> es donde golpea el espacio bar: qai<space><space><esc>j0q esto ahorra la macro en el registro a)

Ahora jugar la parte posterior macro haces @ seguido por el registro que guardó en ... por lo que en este ejemplo @a. Ahora la segunda línea también tendrá 2 espacios en frente de ellos.

Las macros también se pueden ejecutar varias veces, por lo que si lo hiciera [email protected] la macro se ejecutará 3 veces, y ya terminaría con esto.

Me gusta usar macros para esto porque es más intuitivo para mí, porque puedo hacer exactamente lo que quiero que haga y simplemente repetirlo varias veces.

Cuestiones relacionadas