:!<command>
se puede usar para ejecutar un comando en el shell. Pero esto "se hace cargo" de mi terminal y lo llena con stdout
ese comando en particular.
¿Cómo ejecuto un comando en segundo plano que solo me notifica en un código de salida distinto de cero?
external-command
OrangeTux
fuente
fuente
Respuestas:
:silent exec "!command"
Tenga en cuenta que su sesión vim seguirá ocupada mientras se ejecuta su comando. Esto se debe a la naturaleza sincrónica de Vim. Todavía puede volver a su shell presionando CTRL + z (para enviar Vim a segundo plano) y luego reanudar vim con el comando
fg
como de costumbre.Para hacer las cosas de forma asincrónica, eche un vistazo al complemento vim-dispatch de Tim Pope o al proyecto NeoVim, que tiene soporte nativo para la ejecución de comandos asincrónicos, que puede aprovechar fácilmente utilizando el complemento NeoMake. La última versión de Vim también tiene soporte para tareas asincrónicas.
Ver : h: silencioso
fuente
:silent !ls
) ... También no No dé la salida adecuada en un código de salida que no sea 0 ... Así que me temo que es un poco más complicado que simplemente usar:silent
...:silent exec "!ls"
ni:silent !ls
mostrar ningún resultado en absoluto en mi versión de Vim, 7.4 con parches 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Necesito presionar^L
para arreglarlo nuevamente ...Para ejecutar un comando sin activar el mensaje Enter, como:
pruebe el siguiente ejemplo simple:
Luego presione Ctrl+ L(o
:redraw!
) para actualizar la pantalla cuando regrese a Vim.Para evitar la necesidad de actualizar, puede definir su propio comando personalizado, como:
Ahora, puede usar el nuevo comando Vim para ejecutar un comando de shell (nota: ¡ sin ! Y con S mayúscula ):
Fuente: Evitar las indicaciones "Hit ENTER para continuar" en el sitio de Vim Wikia
fuente
:Silent ctags -R . > /dev/null &
ejecuten en segundo plano. Enviar stdout a / dev / null evita que la salida aparezca en el búfer vim.Una solución rápida y sucia (en puro Vimscript)
Esto puede iniciar un proceso en segundo plano:
Pero Vim necesita una forma de averiguar cuándo se completó el proceso y cómo, así que usemos un archivo marcador:
Ahora podemos pedirle a Vim que verifique cada cierto tiempo si el proceso se ha completado:
Oye, no es bonito, ¡pero funciona!
Desventajas
Lamentablemente, el autocmd anterior no se activará hasta que mueva el cursor. Y si desea ejecutar más de un proceso en segundo plano a la vez, necesitará agregar ID únicos a esos archivos y al nombre del grupo autocmd.
Entonces, si puede manejar una dependencia adicional, es mejor que use una solución probada como el complemento vim-dispatch mencionado en otra respuesta.
Mostrar salida
Si desea ver el resultado del proceso, en lugar de solo el código de salida , reemplace el final
echo
anterior con:Eso abriría la ventana de vista previa. Para utilizar la lista de errores de corrección rápida en su lugar:
La lista de soluciones rápidas le permite navegar fácilmente a los errores usando
:cnext
. Sin embargo,copen
mueve el cursor a la ventana de corrección rápida cuando se abre, lo que probablemente será sorprendente / molesto.(Una solución alternativa para eso sería abrir la ventana QF
:copen
al iniciar el proceso inicialmente, por lo que no necesitará llamarlo al final).fuente
Ejecutar un comando en segundo plano
Estaba ejecutando un comando que bloqueó por un momento, y realmente no me importaba la salida. Esto se puede solucionar iniciando el proceso adjunto no al terminal / emulador sino al sistema y redirigiendo toda la salida a / dev / null. Por ejemplo:
luego lo
(...&)
ejecuta en segundo plano y> /dev/null
redirige toda la salida a/dev/null
(nada).El paréntesis atrapa la salida en un subshell (o algo así), pero tiene el efecto secundario de no estar conectado al shell actual (no es gran cosa).
Ejecutar un comando silenciosamente en segundo plano con mapeo
Me he dado cuenta de que si está , de hecho, la cartografía de ella, puede hacer algo como
Lo anterior no mostrará nada en la barra de comandos y, además, no mostrará nada en el terminal fuera de vim. Se asignará a
<leader>
e, que es \ epor defecto.Ejecutando un comando, capturando su salida, mostrando su contenido
(Otra edición, y tal vez la más bonita). Este mostrará el resultado de un comando si así lo elige:
DENTRO DE UNA NUEVA PESTAÑA:
DENTRO DE UN SPLIT VERTICAL:
DENTRO DE UN SPLIT HORIZONTAL:
... Haz lo que quieras
fuente
Si no le importa el código de salida, puede ir con esto:
fuente
v:shell_error
variable te lo diráNo estoy seguro de si esto se adapta a sus necesidades (no maneja los procesos en segundo plano como en
foo &
- no estoy seguro si eso es lo que quiere decir con “en segundo plano” ), pero se podría usar un comando personalizado como en:Luego use como por ejemplo:
Si no necesita / desea el mensaje de error, un simple
system()
podría ser suficiente, entonces verifiquev:shell_error
e informe por ejecho Error!
.De la ayuda v: shell_error :
fuente
foo &
..." . Del texto Q en su conjunto lo interpreté como o bien o. Ya sea "Ejecutar como comando externo AKA en segundo plano" o "Ejecutar como comando externo _y_ como proceso en segundo plano" . Respondí principalmente en base al título de Q, etc., y agregué un comentario sobre "No estoy seguro ..." , y lo dejé a OP para aclarar si o no.Vim 8 introdujo el soporte de trabajos. Uno puede ejecutar comandos externos en segundo plano sin depender de complementos. Por ejemplo, para ejecutar un servidor de rebajas ( markserv ) en la ubicación actual y no bloquear la sesión vim:
Esto inicia el proceso markserv como un subproceso del proceso vim actual. Puedes verificar esto con
pstree
.Ver inicio de trabajo
fuente
Yo uso el siguiente código:
Ahora puede escribir lo siguiente
Esto se parece casi al
silent !
comando incorporado de Vim , a excepción de la capitalS
. Incluso permite un opcional!
para que se vea aún más similar. La llamada asystem()
hace que el comando de shell sea realmente silencioso: no parpadea la pantalla ni se vuelven a dibujar.(y si alguna vez necesita un código de estado, puede verificar la
v:shell_error
variable, consulte la ayuda para obtener más información)fuente
El complemento AsyncRun, si está diseñado para esto, le permite ejecutar comandos de shell en segundo plano en Vim8 / NeoVim y mostrar la salida en la ventana de revisión rápida.
Solo como reemplazo del
!
comando:También puede ocultar completamente la salida en la ventana de revisión rápida:
Cuando finalice el trabajo, AsyncRun le notificará pasando una opción
-post
:El script vim definido por
-post
se ejecutará una vez que finalice el trabajo.fuente