Incluya varias líneas entre comillas Vim

Incluya varias líneas entre comillas Vim

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 gcomando.

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 /cmodificador al patrón de sustitución:

:%s/.*is supposed.*/"&"/c

Explicación

  • :%ssignifica 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 :globalcomando y :normal:

:g/is supposed/normal yss"

O simplemente busque líneas coincidentes y repita vía ny.

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:

  • qqinicia una macro llamada "q" (qa iniciaría la macro "a")
  • I" ESCInserta 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" ESCVa 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 supposedUna 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.
  • zzqcentra 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 @qpara reproducir todas las acciones que acabas de realizar o, digamos, 5@qhacerlo cinco veces.

Cómo funciona eso: qes 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. qdeja de grabar la macro.

Después de eso, volvemos al lugar donde comenzamos, por lo que podemos ejecutar la macro ( @) que guardamos para qhacerlo 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.

información relacionada