Si je fais cela depuis le shell:
$ sleep 100
Je peux le faire passer à l'arrière-plan en faisant:
^Z
$ bg
Et puis continuez à utiliser ma coquille. Vous pouvez obtenir le même effet en ajoutant un &
à la fin de la commande, mais j'oublie souvent cela.
A Vim, je fais souvent:
:!sleep 100
Et là aussi, j'oublie souvent d'ajouter le &
. Puis-je mettre ce processus en arrière-plan et continuer à utiliser Vim comme dans le shell?
external-command
unix
Martin Tournoij
la source
la source
&
chaque fois::nnoremap :! :!&<Left>
... Mais bien sûr, parfois vous ne voudrez pas de&
, et devrez appuyer sur <Del> pour le supprimer.Réponses:
Comme
<C-z>
va suspendre Vim lui-même, pas seulement la commande shell lancée, cela ne fonctionnera pas.Ce que je ferais, c'est abandonner la commande de longue durée avec
<C-c>
, puis relancer la même commande en arrière-plan via(La
:!!
commande est pratique pour rappeler la commande externe précédente ici; vous pouvez également utiliser l'historique des commandes Ex via<Up>
.)la source
Vous pouvez placer la commande dans un script shell qui se déroule en arrière-plan. Le contenu, par exemple, pourrait être:
la source
tmux
par défaut, mais le problème est que ma session Vim (avec des fichiers ouverts et autres) est toujours inutile. Je pourrais passer à un autre volet et y exécuter mon script, mais ce sont beaucoup plus d'actions que:!gitk %
par exemple ... Le problème avec l'utilisation de scripts est que je devrais pré-créer un grand nombre de ces scripts pour chaque commande possible. Ce n'est peut-être pas une mauvaise idée pour certaines des commandes les plus utilisées (telles quegitk
&mupdf
).Normalement, lorsqu'un processus est démarré, vous n'avez pas beaucoup de contrôle sur lui, à part le terminer ( Ctrl+ c) ou le suspendre ( Ctrl+ z, mais en incluant le processus parent).
Cependant, selon le type de processus et le système d'exploitation, voici quelques astuces que vous pouvez essayer:
L'envoi
SIGTSTP
ouSIGSTOP
arrêtera le processus (le même signal envoyé par Ctrl+ z) etSIGCONT
continuera (reprendra) le processus. Le test avecsleep
ne fonctionne pas, vous devez donc le tester avec un logiciel spécifique pour savoir comment il gère les signaux. Par exempleEnvoi
SIGHUP
au processus. Par défaut, ce signal met fin au processus, mais si le processus implémente le signal SIGHUP, il doit se détacher du contrôle de tty et réexécuter en arrière-plan avec un nouvel identifiant de processus (généralement utilisé avec les démons). Malheureusement, de nombreuses applications ne le gèrent pas correctement et meurent simplement (y comprissleep
). Par exempleUne autre solution pourrait utiliser des outils tels que
retty
(rattacher à un pseudo-tty),detach
(détacher un processus du terminal),nohup
( déconnecter le processus du terminal ) ougdb
(attacher au processus existant-p
et fermer ses descripteurs de fichiers tels que tty, exemple similaire ).Pour plus d'informations, consultez: Job control (Unix) - Implementation at Wikipedia.
Voir aussi:
man kill
ouman sigaction
.la source
Remarque : Cette réponse ne semble fonctionner qu'avec les coquilles
tcsh
etfish
. J'ai aussi essayébash
,dash
,mksh
etzsh
, et il ne pas y travailler; Je ne sais pas pourquoi, parce que si je fais les mêmes actions de ces coquilles sans Vim, il ne fonctionne comme prévu ... (:!
commandes sont exécutées si le shell).Il se trouve que j'utilise
tcsh
, donc ça marche pour moi ...Vous pouvez utiliser
:set shell=/bin/tcsh
pour définir votre shell; c'est mondial, cependant. Donc, ne l'utilisez que si vous pensez que c'est une fonctionnalité très importante :-)^Z
envoyer unSIGTSTP
signal, vous pouvez envoyer ce signal aveckill
, puis utiliserSIGCONT
pour continuer (reprendre) le processus. Cela détachera le processus de Vim.Parce qu'il est difficile de montrer avec cela
sleep
(comment savez-vous qu'il a continué son exécution?), Je vais utilisergitk
comme exemple (mais tout programme GUI fera l'affaire):Par exemple dans Vim:
Et puis dans un autre terminal:
Vous pouvez bien sûr également utiliser
killall
, oupkill
; par exemple:Pour cela, vous devez ouvrir un autre terminal, ce qui n'est pas idéal, mais cela vous permettra de continuer à utiliser à la fois votre Vim et votre processus externe.
la source