Suprime la salida de un comando automático vim


13

Tengo un autocomando definido en mi vimrc:

au BufWritePost * !./make.sh

El script make.shcompila un .texarchivo 3 veces y no quiero que se muestre el resultado.

¿Hay alguna forma de suprimir la salida?

Intenté agregar silentuna línea antes del aucomando, pero no funcionó. También intenté de esta manera sin éxito.

Respuestas:


20

El silencio debe ir antes !./make.sh, no antes au. Poner silentantes ausolo significa que registrará el autocomando en silencio. Debería verse así en su lugar:

au BufWritePost * silent! !./make.sh

Un problema al ejecutar un comando externo como este con el :silentcomando es que la pantalla no se vuelve a dibujar, dejándolo con una pantalla en blanco. Sin embargo, vim tiene un comando que vuelve a dibujar la pantalla, que puede usarse así:

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

La razón por la que necesito usar el comando de ejecución es porque el :!comando usa cualquier carácter que se encuentre después de él, lo que significa que no podría hacerlo silent! !./make.sh | redraw!porque bash intentaría interpretar todos los caracteres después !.

Notas

Tenga en cuenta que :silent!ignora los mensajes de error, mientras :silentque no. Además, la >/dev/null 2>&1parte redirige toda la salida de !./make.sha /dev/null. Puede leer más sobre la redirección de E / S en bash aquí .

Temas de ayuda relevantes

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar

El segundo comando funcionó, aunque todavía imprime la salida en la pantalla. Además, no necesito presionar Enter cuando el script termina más, lo cual es bueno. Pero me pregunto si hay alguna forma de suprimir totalmente la salida.
Andre Herman Bezerra

1
¿Reemplazar execute "!./make.sh"con execute "!./make.sh >/dev/null 2>&1"ayuda? Esto redirige toda la salida del comando a /dev/null. Lea tldp.org/LDP/abs/html/io-redirection.html para obtener más información sobre la redirección en bash.
EvergreenTree

¡Debería haber pensado en eso! Funciona. ¡Gracias!
Andre Herman Bezerra

7

La respuesta a su pregunta directa es tal como lo publicó @EvergreenTree. Sin embargo, siento que te falta alguna herramienta incorporada de Vim para construir / compilar / linting proyectos. Lo más notable :makey la lista de soluciones rápidas.

¿Qué nos hace usar el uso :make?

El uso le :makepermite recopilar sus errores en una lista conocida como la lista de soluciones rápidas. Usando la solución rápida, puede navegar entre los errores en sus archivos, por lo que salta directamente a donde el compilador dice que el error es (¿útil, verdad?).

:hacer

Correr :makeejecutará el programa make, 'makeprg'. Luego analice la salida con 'errorformat'y ponga cada entrada en la lista de soluciones rápidas.

Por lo general, 'makeprg'el makecomando predeterminado que ejecuta a Makefile. Sin embargo, puede cambiar su a 'makeprg'través del :compilercomando o configurarlo directamente.

También puede pasar argumentos adicionales a :make. p.ej:make clean

Nota: la ejecución :makea menudo mostrará el resultado del comando en la parte inferior de la pantalla con un mensaje que le pide que presione enter. Simplemente presione Intro ya que toda la salida estará disponible en la lista de soluciones rápidas. Puede suprimir esto mediante :silent, por ejemplo :silent make.

Un comando personalizado común para una marca silenciosa es:

command -nargs=* -bar Smake silent make <args> <bar> cwindow

lista de soluciones rápidas

Después de ejecutar :makesu lista de soluciones rápidas, se guardará la salida del compilador.

Use el siguiente comando para navegar por la lista de soluciones rápidas.

  • :copen para abrir la ventana de revisión rápida
  • :cclose para cerrar la ventana de revisión rápida
  • :cnext/ :cprevpara pasar al elemento siguiente / anterior
  • :ccimprimir en la parte inferior el error actual o :cc 3mostrar un error específico en este ejemplo 3

Personalmente, uso el complemento intacto de Tim Pope para navegar por la lista de soluciones rápidas.

¿Qué pasa con la ejecución :makeautomática y silenciosa?

Puedes hacer esto con un lugar :autocmdcomo tú.

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

Como beneficio adicional, agregué al abrir la ventana de revisión rápida a través de :cwindowsi hay algún error presente.

Nota: Debe ser más específico con ese patrón de archivo en el BufWritePostautocmd para que no se generen archivos no relacionados.

¿Hay aún más?

Esto está usando solo algunos de los comandos incorporados de Vim más algunos autocmd para convencer. Por supuesto, hay complementos y herramientas que pueden ayudarte

  • Dispatch.vim se puede usar para ejecutar :maketrabajos de forma asincrónica.
  • Syntax plugin fantástico comprueba el archivo después :write.
  • Ale.vim (Asynchronous Lint Engine) es un complemento para proporcionar linting en NeoVim y Vim 8 mientras edita sus archivos de texto.
  • Unimpaired.vim facilita la administración de la lista de soluciones rápidas.
  • Llanos viejos Makefiles. A menos que ./script.shsea ​​muy complicado, es posible que desee considerar el uso de make. Puede escalar para hacer más tareas más tarde y es una herramienta de construcción común.
  • Puede usar Vim Awesome para buscar más complementos que puedan ayudar.

Conclusión

Personalmente, integro :makey la solución rápida en mi propio flujo de trabajo. Creo que capturar el resultado de su proceso de compilación y capturar los errores para que valga la pena la inversión. Como una ventaja adicional, posiblemente te sientas más cómodo con la lista de soluciones rápidas y puedas usar la lista para otras aplicaciones como :grep.

Para más ayuda ver:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc

Pensé :makemientras respondía esto, pero no lo incluí. Es una mejor idea usar make para compilar cosas.
EvergreenTree

cómo cambiar el autocmd para ejecutar solo makeprg en un determinado archivo.
Ibn Saeed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.