Czasami muszę napisać tekst, a następnie potokować ten tekst do innego polecenia. Mój zwykły przepływ pracy wygląda mniej więcej tak:
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
Uważam to za kłopotliwe i staram się nauczyć pisania skryptów bashowych. Chciałbym uprościć ten proces, pisząc polecenie, które uruchamia edytor i kiedy edytor zamyka potok wyjściowy edytora na standardowe wyjście. Wtedy będę mógł uruchomić polecenie jako quickedit | pandoc -o file.pdf
.
Nie jestem pewien, jak to by działało. Napisałem już funkcję automatyzującą to, postępując zgodnie z powyższym dokładnym przepływem pracy i kilkoma dodatkami. Generuje losowy ciąg znaków, który działa jak nazwa pliku, i przekazuje go do vim po wywołaniu funkcji. Gdy użytkownik wyjdzie z vima poprzez zapisanie pliku, funkcja drukuje plik na konsoli, a następnie usuwa plik.
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
Problem, z którym wkrótce się spotkałem, polega na tym, że kiedy robię coś takiego jak quickedit | command
sam vim, nie można go używać jako edytora, ponieważ wszystkie dane wyjściowe są ograniczone do potoku.
Zastanawiam się, czy są jakieś obejścia tego, aby móc przesyłać dane wyjściowe mojej quickedit
funkcji. Nieoptymalna alternatywa to uruchomienie osobnego edytora, powiedzmy wysublimowanego tekstu, ale naprawdę chcę pozostać w terminalu.
mktemp
zamiast odkrywać na nowo w niepewny sposób.
:w !pandoc -o file.pdf
? (Uwaga: odstęp międzyw
i!
jest niezbędny.)