Tengo bloques de la siguiente forma:
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
Necesito poner las líneas que indican que se supone que deben estar entre comillas entre comillas:
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
¿Existe una forma semiautomática de hacer esto con Vim? Pensé que una posible solución podría implicar el g
comando.
Respuesta1
Usando expresiones regulares:
:%s/.*is supposed.*/"&"/
Si por "semiautomático" quiere decir que le gustaría que se le pregunte antes de cada sustitución, simplemente agregue el /c
modificador al patrón de sustitución:
:%s/.*is supposed.*/"&"/c
Explicación
:%s
significa aplicar esta sustitución a todas las líneas en el buffer actual- El patrón que emparejamos es cualquier línea que contenga las palabras
is supposed
(si algunas otras líneas contienen las palabras "se supone" sin "debe estar entre comillas" a continuación, siempre puede cambiar el patrón a.*is supposed to be enclosed in quotes.*
- La cadena que utilizamos para reemplazar el patrón coincidente es
"&"
, donde&
representa lo que coincidió con el patrón.
Respuesta2
El famosocomplemento envolventeproporciona varias asignaciones que hacen que esto sea rápido y fácil. Para citar una línea completa (sin sangría), simplemente use yss"
. Puede aplicar esto a todas las líneas coincidentes de su texto de ejemplo automáticamente mediante el :global
comando y :normal
:
:g/is supposed/normal yss"
O simplemente busque líneas coincidentes y repita vía n
y.
Respuesta3
Casi siempre prefiero las macros para buscar y sustituir porque son más poderosas y menos difíciles de memorizar y, al mismo tiempo, conservan la opción de verificar interactivamente antes de saltar. Pruebe esto en la primera línea que le gustaría cambiar (no escriba los espacios que puse alrededor de ESC y ENTER para facilitar la lectura):
qqI" ESC $bea" ESC /is supposed ENTER zzq
Que hace:
qq
inicia una macro llamada "q" (qa iniciaría la macro "a")I" ESC
Inserta un "antes de la primera palabra, no al principio de la línea como lo haría "0", preservando así el espacio en blanco que suele ser valioso allí.$bea" ESC
Va al final de la línea ($), pero luego retrocede una palabra (b) y avanza nuevamente hasta el final de la misma (e), y finalmente agrega (a) el ". Esta maniobra se agrega después de la última palabra de la línea incluso si va seguido de espacios en blanco finales, normalmente inútiles./is supposed
Una vez realizada la edición, busca la siguiente instancia de "se supone", que podría estar muchas páginas más abajo, y coloca muy bien el cursor allí para que usted pueda mirar y decidir si continúa con las ediciones. Si no se encuentra ningún "se supone", la macro se cierra sin sufrir daños.zzq
centra muy bien la línea en la página (zz) para que pueda ver algunas líneas más allá de la actual. Útil cuando aplicas rápidamente la macro y quieres echar un vistazo a un par de movimientos hacia adelante. "q" finaliza la definición de la macro, que también se llama "q".
Cómo utilizar:
- La primera línea ya se cambió cuando terminó de definir la macro anterior.
- Si hay un error, simplemente puede deshacer esta línea e intentarlo nuevamente.
- El cursor ahora está posicionado en la segunda coincidencia, si la hay, y bien centrado en la página.
- Puedes aplicar la macro si quieres (¡u otras macros similares!), con @q, lo que editará la línea y te posicionará en la tercera coincidencia.
- Puede volver a aplicar la última macro con @@ (más rápido que @q).
- Puedes hacer varios a la vez, como: 111@@. Recuerda que si hay CUALQUIER error al aplicar la macro no hay más repeticiones.
- O puede saltar manualmente con PageDown y amigos y volver a aplicar la macro.
- Y puedes intercalar las macros con cualquier otra edición.
- Y puede :tab al lado para aplicar esta macro a otros buffers o archivos.
- Cereza del pastel: ¡la macro se recuerda incluso después de salir de vim!
¡Una vez que te sientas cómodo con las macros, tendrás poderes increíbles!
Respuesta4
La versión de expresión regular funciona si sus líneas realmente son así y hay una cadena distinguida que identifica qué líneas son cuáles. De lo contrario, podemos grabar unmacropara hacer lo que quieras.
Para hacer eso, vaya al inicio de la línea 2 y presione:
qq I" Escape A" Escape 3j q
Eso citará la primera línea y nos llevará a la siguiente para verla. Luego puedes presionar @q
para reproducir todas las acciones que acabas de realizar o, digamos, 5@q
hacerlo cinco veces.
Cómo funciona eso: q
es el comando para comenzar a grabar una macro, a la que también llamamos q
(puedes elegir cualquier letra). En esa macro, insertamos una comilla doble al inicio de la línea ( I"
), salimos del modo de inserción (Escape), agregamos una comilla doble al final de la línea ( A"
) y salimos del modo de inserción nuevamente. Bajamos tres líneas ( 3j
) hasta la siguiente línea a citar. q
deja de grabar la macro.
Después de eso, volvemos al lugar donde comenzamos, por lo que podemos ejecutar la macro ( @
) que guardamos para q
hacerlo nuevamente en el siguiente par de líneas. Con un conteo antes del @
, como en 5@q
, lo hacemos tantas veces.
En lugar de 3j
, si el espacio es irregular, puedes usar }}k
: bajar dos párrafos hasta la línea en blanco después de la siguiente (}}
) y retroceder ( k
). De cualquier manera, ejecutar la macro es lo mismo.
De hecho, puedes grabar cualquier serie de acciones que hagan lo que quieras y te lleven de regreso a donde querías estar. Siempre que los pasos que siga tengan sentido en cada contexto en el que vaya a ejecutarla, puede iniciar una macro, realizar todos los cambios necesarios y pasar a la siguiente ubicación, luego detener la macro y repetir.