:!<command>
peut être utilisé pour exécuter une commande dans le shell. Mais ceci "prend en charge" mon terminal et le remplit avec stdout
cette commande particulière.
Comment puis-je exécuter une commande en arrière-plan qui me notifie uniquement sur un code de sortie différent de zéro?
external-command
OrangeTux
la source
la source
Réponses:
:silent exec "!command"
Notez que votre session vim sera toujours occupée pendant l'exécution de votre commande. Cela est dû à la nature synchrone de Vim. Vous pouvez toujours revenir à votre shell en appuyant sur CTRL + z (pour envoyer Vim en arrière-plan), puis reprenez vim avec la commande
fg
comme d'habitude.Pour faire les choses de manière asynchrone, jetez un coup d'œil au plugin de Tim Pope, vim-dispatch, ou au projet NeoVim, qui prend en charge de manière native l'exécution de commandes asynchrones, que vous pouvez facilement utiliser à l'aide du plugin NeoMake. La dernière version de Vim prend également en charge les tâches asynchrones.
Voir : h: silencieux
la source
:silent !ls
) ... ne donnez pas une sortie correcte sur un code de sortie différent de 0 ... J'ai donc peur que ce soit un peu plus:silent
:silent exec "!ls"
ni même:silent !ls
afficher aucune sortie du tout sur ma version de Vim, 7.4 avec les correctifs 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Je dois presser^L
pour le fixer à nouveau ...Pour exécuter une commande sans déclencher le message Enter, procédez comme suit:
essayez l'exemple simple suivant:
Appuyez ensuite sur Ctrl+ L(ou
:redraw!
) pour actualiser l’écran lorsque vous revenez à Vim.Pour éviter d'avoir à actualiser, vous pouvez définir votre propre commande personnalisée, telle que:
Maintenant, vous pouvez utiliser la nouvelle commande Vim pour exécuter une commande shell (remarque: sans ! Et avec S majuscule ):
Source: Éviter les invites "Appuyez sur Entrée pour continuer" sur le site Vim Wikia
la source
:Silent ctags -R . > /dev/null &
à celles exécutées en arrière-plan. L'envoi de stdout à / dev / null empêche la sortie d'apparaître dans le tampon vim.Une solution rapide et sale (dans Vimscript pur)
Cela peut démarrer un processus en arrière-plan:
Mais Vim a besoin d'un moyen de savoir quand le processus est terminé et comment utiliser un fichier marqueur:
Maintenant, nous pouvons demander à Vim de vérifier de temps en temps si le processus est terminé:
Hé, ce n'est pas joli, mais ça marche en quelque sorte!
Désavantages
Malheureusement, la commande autocmd ci-dessus ne se déclenchera que lorsque vous aurez déplacé le curseur. Et si vous souhaitez exécuter plusieurs processus d'arrière-plan à la fois, vous devez ajouter des ID uniques à ces fichiers et au nom du groupe autocmd.
Donc, si vous pouvez gérer une dépendance supplémentaire, vous feriez peut-être mieux d'utiliser une solution éprouvée telle que le plugin vim-dispatch mentionné dans une autre réponse.
Affichage de la sortie
Si vous voulez voir la sortie du processus, plutôt que juste le code de sortie , remplacez le final
echo
ci-dessus par:Cela ouvrirait la fenêtre de prévisualisation. Pour utiliser la liste d'erreurs de correction rapide à la place:
La liste des solutions rapides vous permet de naviguer facilement en utilisant les erreurs
:cnext
. Cependant,copen
déplace votre curseur dans la fenêtre de correction rapide lors de son ouverture, ce qui sera probablement surprenant / ennuyeux.(Pour contourner ce problème, ouvrez la fenêtre QF
:copen
lors du démarrage initial du processus. Vous n'aurez donc pas besoin de l'appeler à la fin.)la source
Exécuter une commande en arrière-plan
J'exécutais une commande qui bloquait un peu, et je ne me souciais pas vraiment de la sortie. Ceci peut être pris en charge en démarrant le processus attaché non pas au terminal / émulateur mais au système et en redirigeant toute la sortie vers / dev / null. Par exemple:
le l'
(...&)
exécute en arrière-plan et> /dev/null
redirige toutes les sorties vers/dev/null
(rien).La parenthèse emprisonne la sortie dans un sous-shell (ou quelque chose du genre), mais elle a pour effet secondaire de ne pas être attachée au shell actuel (ce n'est pas grave).
Exécution silencieuse d'une commande en arrière-plan avec mappage
Je viens de réaliser que si vous êtes , en fait, la cartographie, vous pouvez faire quelque chose comme
Ce qui précède n’affiche rien dans la barre de commande et n’affiche rien dans le terminal en dehors de vim. Il sera mappé sur
<leader>
e, ce qui est \ epar défaut.Exécuter une commande, capturer sa sortie, afficher son contenu
(Une autre édition - et peut-être la plus ordonnée). Celui-ci affichera le résultat d'une commande si vous le souhaitez:
DANS UNE NOUVELLE ONGLET:
À L'INTÉRIEUR D'UN SPLIT VERTICAL:
À L'INTÉRIEUR D'UN SPLIT HORIZONTAL:
... fais ce que tu veux
la source
Si vous ne vous souciez pas du code de sortie, vous pouvez aller avec ceci:
la source
v:shell_error
variable vous le diraVous ne savez pas si cela répond à vos besoins (ne gère pas les processus d'arrière-plan comme dans
foo &
; vous ne savez pas si c'est ce que vous entendez par «en arrière-plan» ), mais une commande personnalisée pourrait être utilisée comme suit:Puis utilisez comme par exemple:
Si vous n'avez pas besoin / ne voulez pas du message d'erreur, une simple
system()
pourrait suffire, puis vérifiezv:shell_error
et signalez par exempleecho Error!
.De l' aide v: shell_error :
la source
foo &
…» . Dans l'ensemble du texte Q, je l'ai interprété comme étant l'un ou l'autre. Soit “Exécuter en tant que commande externe AKA en arrière-plan” ou “Exécuter en tant que commande externe _et_ en tant que processus en arrière-plan.” . J'ai répondu principalement en fonction du titre de Q etc. - et ajouté un commentaire sur «Pas sûr…» - et laissé à OP le soin de préciser si l'un ou l'autre.Vim 8 a introduit le support aux emplois. On peut exécuter une commande externe en arrière-plan sans s'appuyer sur des plugins. Par exemple, pour exécuter un serveur de démarque ( markserv ) à l’emplacement actuel et ne pas bloquer la session vim:
Cela démarre le processus de serveur de notes en tant que sous-processus du processus vim actuel. Vous pouvez vérifier cela avec
pstree
.Voir job_start
la source
J'utilise le code suivant:
Maintenant, vous pouvez taper le texte suivant
Cela ressemble presque à la
silent !
commande intégrée de Vim , à l'exception de la capitaleS
. Il permet même une option!
pour le rendre encore plus similaire. L'appel àsystem()
rend la commande shell vraiment silencieuse: aucun écran ne clignote ni aucun redessin.(et si vous avez besoin d'un code d'état, vous pouvez vérifier la
v:shell_error
variable, voir l'aide pour plus d'informations)la source
Le plug- in AsyncRun, s'il est conçu à cet effet, vous permet d'exécuter des commandes de shell en arrière-plan dans Vim8 / NeoVim et d'afficher le résultat dans la fenêtre du correctif rapide.
Juste en remplacement de la
!
commande:Vous pouvez également masquer complètement la sortie dans la fenêtre du correctif:
Une fois le travail terminé, AsyncRun vous en informera en passant une option
-post
:Le script vim défini par
-post
sera exécuté une fois le travail terminé.la source