Si hago esto desde el shell:
$ sleep 100
Puedo hacer que pase al fondo haciendo:
^Z
$ bg
Y luego continúo usando mi caparazón. Puede obtener el mismo efecto agregando un &
al final del comando, pero a menudo lo olvido.
En Vim, a menudo hago:
:!sleep 100
Y aquí también, a menudo me olvido de agregar el &
. ¿Puedo poner este proceso en segundo plano y continuar usando Vim como en el shell?
external-command
unix
Martin Tournoij
fuente
fuente
&
cada vez::nnoremap :! :!&<Left>
... Pero, por supuesto, a veces no querrá el&
, y tendrá que presionar <Del> para eliminarlo.Respuestas:
Como
<C-z>
suspenderá a Vim, no solo el comando de shell lanzado, eso no funcionará.Lo que haría sería cancelar el comando de ejecución prolongada y
<C-c>
luego volver a iniciar el mismo comando en segundo plano a través de(El
:!!
comando es útil para recuperar el comando externo anterior aquí; también puede usar el historial de comandos Ex a través de<Up>
).fuente
Puede poner el comando en un script de shell que se ejecute en segundo plano. Los contenidos, por ejemplo, pueden ser:
fuente
tmux
de forma predeterminada, pero el problema es que mi sesión de Vim (con archivos abiertos y demás) sigue siendo inútil. Yo podría cambiar a otro panel, y corro mi guión, pero que son mucho más acciones que:!gitk %
por ejemplo ... Lo que pasa con el uso de scripts es que tendría que crear previamente muchas de estas secuencias de comandos para cada orden posible. Quizás no sea una mala idea para algunos de los comandos más utilizados (comogitk
&mupdf
).Normalmente, cuando se inicia un proceso, no tiene mucho control sobre él más que terminarlo ( Ctrl+ c) o suspenderlo ( Ctrl+ z, pero incluido el proceso padre).
Sin embargo, dependiendo del tipo de proceso y el sistema operativo, aquí hay algunos trucos que puede probar:
Enviar
SIGTSTP
oSIGSTOP
detendrá el proceso (la misma señal enviada por Ctrl+ z) ySIGCONT
continuará (reanudará) el proceso. La prueba consleep
no funciona, por lo que debe probarla con un software específico sobre cómo maneja las señales. P.ejEnvío
SIGHUP
al proceso. De forma predeterminada, esta señal finaliza el proceso, sin embargo, si el proceso implementa la señal SIGHUP, debería separarse del control de tty y volver a ejecutarse en segundo plano con una nueva identificación de proceso (generalmente se usa con daemons). Desafortunadamente, muchas aplicaciones no lo manejan correctamente y simplemente mueren (incluidosleep
). P.ejOtra solución podría usar herramientas como
retty
(volver a conectar a un pseudo-tty),detach
( desconecta un proceso del terminal),nohup
( desconecta el proceso del terminal ) ogdb
(adjunta al proceso existente-p
y cierra sus descriptores de archivo como tty, ejemplo similar )Para obtener más información, consulte: Control de trabajos (Unix): implementación en Wikipedia.
Ver también:
man kill
oman sigaction
.fuente
Nota : Esta respuesta sólo parece trabajar con el
tcsh
yfish
conchas. Yo también tratóbash
,dash
,mksh
, yzsh
, y no trabajo allí; No estoy seguro de por qué, porque si hago las mismas acciones de estas conchas sin Vim, que hace el trabajo como se esperaba ... (:!
comandos se ejecutan a pesar de la cáscara).Yo uso
tcsh
, así que funciona para mí ...Puede usar
:set shell=/bin/tcsh
para configurar su shell; Sin embargo, esto es global. Así que solo úsalo si crees que esta es una característica muy importante :-)^Z
enviar unaSIGTSTP
señal, puede enviar esta señal conkill
, y luego usarSIGCONT
para continuar (reanudar) el proceso. Esto separará el proceso de Vim.Debido a que es difícil de mostrar con esto
sleep
(¿cómo sabe que tiene una ejecución continua?), Lo usarégitk
como ejemplo (pero cualquier programa GUI funcionará):Por ejemplo en Vim:
Y luego en otra terminal:
Por supuesto, también puede usar
killall
, opkill
; por ejemplo:Necesitas abrir otro terminal para esto, lo cual no es ideal, pero te permitirá continuar usando tanto tu Vim como tu proceso externo.
fuente