Ocultar todas las líneas (no) coincidentes en Vim

87

¿Es posible mostrar / ocultar todas las líneas coincidentes en vi o Vim? No resaltar sino mostrar solo esas líneas.

Por ejemplo, tengo un texto con la palabra la palabra ERROR. ¿Cómo hago que muestre solo líneas que contienen ERRORy cómo mostrar solo líneas sin ERROR?

¿Existe una solución sin eliminar todas las líneas coincidentes y luego simplemente deshacerlo?

Alex Bolotov
fuente

Respuestas:

109

¿Conoce el :globalcomando? ¿Hace esto lo que quieres?

:g/ERROR

y por lo contrario:

:g!/Error

o equivalente:

:v/Error
usuario55400
fuente
19
Esto no es muy bueno. Una vez que se desplaza hacia la parte inferior, el comando finaliza y todo vuelve a aparecer. Realmente no esconde esos contenidos.
Kan Li
@KanLi presiona g<para ver de nuevo, o @:si no has ejecutado y comandos.
D. Ben Knoble
53

Otro enfoque, dependiendo de su caso de uso, sería usar vimgrep y sus resultados en quickfix . Puede hacer lo siguiente:

:vimgrep pattern %buscará el archivo actual y lo llevará al primer resultado de búsqueda. Más importante aún, también coloca los resultados en la "lista de arreglos rápidos".

:copenluego abrirá la lista de arreglos rápidos en una ventana separada de arreglos rápidos. Entonces tendrá una ventana separada con todas las líneas de su último vimgrep. Dentro de la ventana de corrección rápida, puede presionar Enter o hacer doble clic en una línea para saltar a la línea correspondiente en su archivo original.

:colderle permitirá volver a las listas de correcciones rápidas más antiguas (resultados de vimgrep más antiguos). Y :cneweravanza a resultados de búsqueda más nuevos.

Tenga en cuenta que la lista de correcciones rápidas también se actualiza cuando se ejecuta :make(por eso se llama corrección rápida para corregir errores). Debido a esto, también existe una alternativa a la lista de arreglos rápidos llamada "lista de ubicaciones". Para usarlo en lugar de utilizar :lvimgrep, a continuación, utilizar comandos l-prefijado en lugar de comandos c-prefijo - :lopen, :lolder, :lnewer.

Por supuesto, hay mucho más que puede hacer. Consulte :help quickfixpara obtener más información.

PD: Dijiste que no querías un enfoque que borra líneas y luego las deshace. Pero ya que marcó g/ERRORcomo la respuesta, pensé en señalar que una forma rápida y sucia es hacerlo g!/ERROR/d. A continuación, puede deshacerlo fácilmente usando u. También para su información, puede hacer :set hlsearchpara resaltar patrones que coincidan con :gcomandos.

studgeek
fuente
1
Gracias por el consejo sobre ": g! / ERROR / d" mejor que la respuesta aceptada.
VinGarcia
¿Puedes hacer esto con líneas que no coincidan con el patrón?
Jacktose
26

La mejor forma de hacer esto es->

:vimgrep /something/g % | copen

Esto abrirá la lista de coincidencias para su palabra clave y también mostrará solo las líneas coincidentes en la ventana de corrección rápida.

Reemplace% con la ruta al archivo si no está considerando el archivo actual.

Shivendra
fuente
1
Reemplace% con la ruta del archivo si no está considerando el archivo actual.
Shivendra
¿Puedes hacer esto con líneas que no coincidan con el patrón?
Jacktose
1

:vimgrep /something/g % | copenfunciona increíble. También :g/<pattern>/dse puede utilizar para eliminar líneas con el patrón.

sevvalai
fuente
Esta es exactamente otra respuesta a esta pregunta.
Shivendra
1

en caso de que lo use fzf, puede usar:

  • :Lines en todos los archivos abiertos
  • :BLines solo en búfer abierto
  • :Rg [pattern] utilizando ripgrep
minusf
fuente
1

Alguna forma sucia hackish de hacer esto:

:w (save)
ggdG (deletes everything)
:.!grep something % (replace current line with grep output)
Boris Churzin
fuente
0

Probablemente te refieres al comando en menos vi vim & / patrón / que muestra líneas que contienen / patrón / (como grep).

charkh
fuente