¿Hay alguna manera de insertar ' ' en la misma columna, ya que todas las líneas no tienen la misma longitud, por lo que la línea 1 podría tener ' ' en la 15a columna, pero la línea 2 tiene '*' en la 25ta columna?
Aman Jain
11
solo hay 1 EOL por línea, por lo que el gindicador no es necesario.
doubleDown
Quería agregar / al inicio de cada línea: 1, $ s / ^ / \ / g funcionó para mí.
farooqsadiq
@dirkgently ¿Cómo puedo pasar una variable de cadena como argumento a este comando (ya sabes, en lugar de *)?
Matheus Rotta
353
Incluso más corto que el: comando de búsqueda:
:%norm A*
Esto es lo que significa:
%=for every line
norm = type the following commands
A*= append '*' to the endof current line
Hombre, no existe un hilo vi o vim del que no aprendo algo. Hoy aprendo sobre la norma. Y como dicen en Cheers, "¡Norma!"
smcameron 01 de
44
Para anteponer, simplemente usaría 0i *, 0 lo lleva al comienzo de la línea, i para el modo de inserción y * para el *. D:
Rob
77
Como VimGolfer, no puedo evitar agregar eso usando en I*lugar de 0i*ahorrarle una pulsación de tecla.
Jedidiah hirió el
24
Otro consejo: esto también funciona para rangos. Solo resalte las líneas en modo visual y presione :, esto completará previamente el comando con el :'<,'>que luego puede hacer:'<,'>norm A*
Ahhh ... El segundo también se puede usar con una selección de líneas. ¡Agradable!
Tim Fletcher el
¿Podría por favor explicar el primer ejemplo?
Cody Poll
@CodyPoll ges un globalcomando que hace algo con cada línea coincidente. $coincide con cada línea. Podría ser también ^o .*. La norma ejecuta comandos que normalmente usa en modo comando. Entonces A*significa agregar *al final de la línea.
defhlt
41
Creo que usar el modo de bloque visual es un método mejor y más versátil para lidiar con este tipo de cosas. Aquí hay un ejemplo:
Thisis the First line.Thisis the second.The third.
Para insertar "Hola mundo". (espacio + portapapeles) al final de cada una de estas líneas:
En un personaje en la primera línea, presione Ctrl-V (o Ctrl-Q si Ctrl-V es pegar).
Presione jj para extender el bloque visual sobre tres líneas.
Presione $ para extender el bloque visual hasta el final de cada línea. Presiona A, luego espacio y escribe Hola mundo. + entonces Esc.
El resultado es:
Thisis the First line.Hello world.Thisis the second.Hello world.The third.Hello world.
En lugar de presionar, jjse puede golpear Gpara pasar a la última línea. Esto es útil en archivos grandes, donde presionar jhasta llegar a la última línea no es práctico.
nash
De acuerdo en que el bloqueo visual es más limpio aquí, más extensible también
Peter Dolan
Tenga en cuenta que esto no parece estar funcionando en todas las líneas al principio, pero después de presionar Esc pasa y lo agrega a todos.
Noumenon
Visual Block causa problemas y errores al usar vim como una extensión para otras cosas, como VS Code. En esos casos, la búsqueda y el reemplazo que solicita el usuario original es la opción confiable.
Brettins
asegúrese de usar mayúscula A, la minúscula "a" no funciona.
Jeff Hoye
14
Si desea agregar Hello world al final de cada línea:
:%s/$/HelloWorld/
Si desea hacer esto para un número específico de línea, por ejemplo, use de 20 a 30:
:20,30s/$/HelloWorld/
Si desea hacer esto al comienzo de cada línea, use:
Esto encontrará cada ancla de final de línea y la sustituirá por *. Digo "sustituto" pero, en realidad, es más un complemento ya que el ancla es una cosa especial en lugar de un personaje normal. Para obtener más información, consulte Poder de g: ejemplos .
¿Qué significa s // en la expresión regular? Conozco un comando similar: g / / / p, (grep). Estoy bastante seguro de que su comando está cerca del mío, al menos en la estructura.
Léo Léopold Hertz 준영
1
El s es un sustituto: reemplaza el ancla de final de línea con el asterisco (bueno, en realidad no lo reemplaza, ya que es un punto de anclaje).
paxdiablo
3
:% s / \ n / * \ r / g
El primero es correcto en cualquier otro lugar, pero Vim tiene que tener un manejo diferente de nueva línea por alguna razón.
:s///
,\n
corresponde a un carácter nulo. La sección:help sub-replace-special
es relevante.Respuestas:
:%s/$/\*/g
Deberia trabajar. Así debería
:%s/$/*/g
como MrWiggles señala correctamente.fuente
g
indicador no es necesario.Incluso más corto que el: comando de búsqueda:
Esto es lo que significa:
fuente
I*
lugar de0i*
ahorrarle una pulsación de tecla.:
, esto completará previamente el comando con el:'<,'>
que luego puede hacer:'<,'>norm A*
I
en su lugar -:%norm I*
También:
También:
fuente
g
es unglobal
comando que hace algo con cada línea coincidente.$
coincide con cada línea. Podría ser también^
o.*
. La norma ejecuta comandos que normalmente usa en modo comando. EntoncesA*
significa agregar*
al final de la línea.Creo que usar el modo de bloque visual es un método mejor y más versátil para lidiar con este tipo de cosas. Aquí hay un ejemplo:
Para insertar "Hola mundo". (espacio + portapapeles) al final de cada una de estas líneas:
El resultado es:
(ejemplo de Vim.Wikia.com )
fuente
jj
se puede golpearG
para pasar a la última línea. Esto es útil en archivos grandes, donde presionarj
hasta llegar a la última línea no es práctico.Si desea agregar Hello world al final de cada línea:
Si desea hacer esto para un número específico de línea, por ejemplo, use de 20 a 30:
Si desea hacer esto al comienzo de cada línea, use:
fuente
Realmente no necesitas el
g
al final. Entonces se convierte en:O si solo desea
*
el final de, diga las líneas 14-18:o
fuente
... y para anteponer (agregar el comienzo de) cada línea con *,
fuente
Una opción es:
Esto encontrará cada ancla de final de línea y la sustituirá por
*
. Digo "sustituto" pero, en realidad, es más un complemento ya que el ancla es una cosa especial en lugar de un personaje normal. Para obtener más información, consulte Poder de g: ejemplos .fuente
El primero es correcto en cualquier otro lugar, pero Vim tiene que tener un manejo diferente de nueva línea por alguna razón.
fuente
esto hará el truco y garantizará que se ignoren los espacios iniciales.
fuente