Je voudrais éditer du contenu dans vim qui a été généré dynamiquement à partir de la ligne de commande sans avoir encore le fichier.
Par exemple:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
mais il échoue avec les erreurs:
Vim: Avertissement: l'entrée ne provient pas d'un terminal
Vim: Erreur lors de la lecture de l'entrée, de la sortie ...
Est-il possible d'y parvenir?
command-line
invocation
unix
Kenorb
la source
la source
:help stdin
... C'est incroyable à quelle vitesse on peut trouver les réponses en posant leur question sur la documentation intégrée.Réponses:
Vous devez utiliser
-
à la place du nom de fichier sur la ligne de commande:La commande ci-dessus ouvrira un tampon sans nom rempli avec le texte lu à partir de l'entrée standard.
la source
-
for stdin est à peu près standard pour les outils de ligne de commande;C'est surtout une note amusante sur
bash
etreadline
, mais si vous définissez votreEDITOR
variable d'environnement survim
, appuyer sur Ctrl+ x+ eouvrira la ligne actuellevim
. De plus, si vous tapez Meta(Alt/Opt/Esc)+ Ctrl+ e, bash effectuera une expansion sur place sur la ligne de commande actuelle, c'est-à-dire:avec Meta(Alt/Opt/Esc)+ Ctrl+ edeviendrait
avec Ctrl+ x+ edeviendrait
Notez qu'à la fermeture de vim, le contenu du tampon vim est exécuté sur la ligne de commande.
Ces fonctionnalités deviennent très utiles pour moi lorsque je souhaite exécuter des commandes multi-lignes en bash, comme pour les boucles ou les programmes nécessitant des instructions ici, et fournissent un moyen intéressant de sauvegarder un peu de l'historique de la ligne de commande dans un fichier pour une utilisation ultérieure.
Donc, pour répondre à la question d'origine, vous pouvez également écrire,
puis appuyez sur Ctrl+ x+ epour le charger
vim
. Vous pourriez aussi avoir,et faites Meta(Alt/Opt/Esc)+ Ctrl+ epuis Ctrl+ x+ e, ce qui mettrait tous les fichiers d'hôtes sur une seule ligne et le chargerait
vim
(probablement pas la meilleure utilisation de ces fonctionnalités - cependant, l'utilité de ces méthodes peut être extrapolée à partir des quelques exemples discutés ici).Notez que je suppose que votre
readline
est réglé suremacs
mode. Si votrereadline
est défini survim
mode, vous pouvez facilement découvrir les liaisons pertinentes en utilisant la commande:et la recherche de
edit-and-execute-command
oushell-expand-line
, qui étaient respectivement associées aux liaisons Ctrl+ x+ eet Meta(Alt/Opt/Esc)+ Ctrl+ e.la source
set -o vi
pour l'activer. Ensuite, vous pouvez simplement utiliser lev
mappage en mode normal pour modifier la commande actuelle dans votre éditeur.shell-expand-line
supprimer les retours à la ligne du texte développé et 2.edit-and-execute-command
essayer d'exécuter la commande écrite dans le tampon , quoi qu'il soit enregistré ou non, lorsque vous quittez vi.En bash, j'ai trouvé utile d'utiliser la substitution de processus en utilisant la
<(command)
syntaxe, par exemple:Voir également:
la source
bash
etzsh
(et nonsh
,ksh
,dash
,fish
,csh
,tcsh
, etc.)/proc/PID/fd/FD
. Si vous écrivez le tampon et quittez, Vim ne se plaint pas, mais le fichier dans lequel vous avez écrit sera supprimé par le système d'exploitation. En utilisant-
comme nom de fichier, le tampon ouvert n'a aucun fichier associé, donc si vous essayez de quitter sans (tant que vous n'utilisez pas de commande bang ou similaire) enregistrer Vim vous avertira.vimdiff <(echo foo) <(echo bar)
.:next
et:prev
relire le flux et n'obtient rien. Il convient également de mentionner que les processus ne sont pas parallèles les uns aux autres - par exemple,cat <(sleep 3; echo a) <(echo b)
imprime dans l'ordre - et pendant que lescat
entrelacements écrivent et lisent,vim
attend le fichier pour "terminer la lecture" avant d'afficher tout sauf le cadre extérieur.Si l'utilisation d'un pipeline vers un nouveau Vim n'est pas une exigence, vous pouvez utiliser la capacité de Vim à extraire la sortie des commandes dans le tampon actuel, couplée à un tampon non sauvegardé (comme avec
:new
ou à la modification d'un fichier inexistant):read!cat /etc/hosts
en mode commande placera la sortie dans votre tampon actuel en dessous de la position actuelle du curseur.En plus d'avoir à supprimer la première ligne vide qui reste lorsque cela est fait sur un tampon vide, cela fonctionne bien et est particulièrement pratique si Vim est déjà en cours d'exécution.
la source