Parfois, je dois écrire du texte, puis rediriger ce texte dans une autre commande. Mon flux de travail habituel ressemble à ceci:
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
Je trouve cela lourd et cherchant à apprendre les scripts bash, je voudrais rendre le processus beaucoup plus simple en écrivant une commande qui déclenche l'ouverture d'un éditeur et lorsque l'éditeur se ferme, redirige la sortie de l'éditeur vers stdout. Ensuite, je serais en mesure d'exécuter la commande en tant que quickedit | pandoc -o file.pdf
.
Je ne sais pas comment cela fonctionnerait. J'ai déjà écrit une fonction pour automatiser cela en suivant le flux de travail exact ci-dessus et quelques ajouts. Il génère une chaîne aléatoire pour agir comme un nom de fichier et la transmet à vim lorsque la fonction est invoquée. Lorsque l'utilisateur quitte vim en enregistrant le fichier, la fonction imprime le fichier sur la console, puis supprime le fichier.
function quickedit {
filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
vim $filename
cat $filename
rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal
Le problème que j'ai rapidement rencontré est que lorsque je fais quelque chose comme quickedit | command
vim lui-même, il ne peut pas être utilisé comme éditeur car toutes les sorties sont limitées au tuyau.
Je me demande s'il y a des solutions à cela, afin que je puisse diriger la sortie de ma quickedit
fonction. L'alternative sous-optimale est de lancer un éditeur séparé, par exemple un texte sublime, mais je veux vraiment rester dans le terminal.
mktemp
plutôt que de le réinventer de manière non sécurisée.
:w !pandoc -o file.pdf
? (Remarque: l'espace entrew
et!
est essentiel.)