Commandes Bash dans vi

33

Est-il possible de taper une commande bash dans vi et d’obtenir le stdout?

Je trouve souvent fastidieux de fermer et de rouvrir vi simplement parce que je veux chercher quelque chose dans la coquille.

harpe
la source

Réponses:

45

Oui, par exemple si vous voulez faire ls, essayez:

:!ls

Pour générer un shell, utilisez

:shell

Marguerite
la source
génial, comment pourrais-je vivre sans cela?
harpe
3
En fait, quelque chose que je fais souvent est d'oublier d'exécuter vi en tant que root lors de l'édition de quelque chose. Cette commande m'a évité de longues réécritures plus de fois que je ne m'en souvienne. :w !sudo tee %
Mark D
1
J'aimerais qu'il y ait un moyen de faire ça en gnounano
ixtmixilix
1
et puis comment revenir à l'éditeur après avoir utilisé: shell?
VaTo
@VaTo: Pour revenir en arrière, vous pouvez taper: sortie
Raman Kathpalia
12

J'ai tendance à utiliser ctrl+zpour dormir vi, courir ce que je dois dans la coquille, puis fgpour reprendre vi. Ce n’est pas vraiment une réponse à votre question, mais je trouve que c’est un moyen très rapide de travailler.

Si vous oubliez que vi est ouvert en arrière-plan (cela peut arriver lorsque vous êtes occupé), lorsque vous essayez de vous déconnecter du shell à l'aide de, ctrl+dvous êtes averti que des tâches en arrière-plan sont en cours d'exécution et que vous pouvez les fermer. ou appuyez à nouveau sur ctrl + d pour vous déconnecter. De plus, si vous essayez de rouvrir le même fichier deux fois, vous obtenez un avertissement de récupération. Vous pouvez donc appuyer sur apour annuler et sur fg pour revenir à vi.

Rqomey
la source
1
Cela peut devenir collant si vous êtes pris dans ce que vous faites sur la ligne de commande et oubliez que vous avez vim en tâche de fond.
Eliot Ball
1
Oui, c'est possible, je l'ai fait moi-même. Pour moi, cela vaut la peine d'avoir la constance de la coquille. Je
mettrai à
1
Je pense que vous seriez mieux d'utiliser gnu screen.
user606723
1
J'utilise tmux moi-même ... mais pour la rapidité, et si vous êtes connecté à un serveur sans tmux ni écran, c'est pratique
Rqomey
11

Depuis que vous avez mentionné "get the stdout", notez que vous pouvez faire

:r! command

et la sortie de la commande sera ajoutée au fichier, ou

:<range>!command

pour que le contenu de la plage soit filtré via la commande [par exemple :1,$!wc]

Au hasard832
la source
:%!commandsemble assez utile
Eliot Ball
Je l’utilise souvent pour trier les lignes [par exemple :.,+20 !sort]
Walter A
5

Mon idiome préféré est

!!command

qui est un raccourci pour

:.!command

qui dirige la ligne en cours à travers la commande et insère la sortie dans le fichier. Le cas le plus courant pour moi est d'éditer la commande avec vi et d'exécuter:

!!sh

Ou

!<motion>command

comme par exemple

!apsh

pour parcourir l'ensemble du paragraphe actuel à travers le shell.

Liudvikas Bukys
la source
2
Remarque car !}vous devez être positionné au début du paragraphe, essayez !ap. (Je ne sais pas s'il s'agit de tous les vi ou seulement de vim)
Random832
4

En utilisant deux points et un point d'exclamation, vous pouvez exécuter n'importe quelle commande du chemin d'accès et des scripts du shell. N'oubliez pas que la commande s'exécute sous l'utilisateur qui exécute le programme vi / vim et utilise son environnement.

:!<command>

Puisque vi utilise l'environnement en vigueur lors de son exécution, il utilise le même chemin que celui indiqué dans la commande parent. Gardez à l’esprit que certains shells gardent un cache des programmes dans le chemin, et vi risque de ne pas fonctionner avec ce cache (selon le shell qu’il utilise et sa version), de sorte que vous risquez d’exécuter le mauvais fichier binaire si vous en avez plus. qu'un binaire avec le même nom.

Didi Kohen
la source
4

Vous pouvez voir le résultat d'une commande en tapant, par exemple, :!ls -lhen mode commande.

Si vous souhaitez insérer le résultat de la commande dans le fichier que vous modifiez, ajoutez simplement un r. Par exemple, :r!which perl.

Eliot Ball
la source
1

Utiliser !la réponse est évidemment la bonne réponse, mais si vous changez souvent de rang, quelque chose comme screen ou tmux peut également être utile.

Ryan A.
la source
0

J'ai ceci dans mon .vimrc. Trouvé sur le débordement de pile il y a quelque temps:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
Clayton Stanley
la source
0

Je voudrais, et je le fais, contourner cela facilement sous Linux en ouvrant deux fenêtres de ligne de commande de terminal, exécutant vi dans l’une et l’autre, disponibles pour un autre travail en même temps.

Harry Weston
la source