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.
:w !pandoc -o file.pdf
? (Uwaga: odstęp międzyw
i!
jest niezbędny.)mktemp
zamiast odkrywać na nowo w niepewny sposób.Odpowiedzi:
vipe
to program do edycji potoków:Otrzymasz edytor z pełnym wyjściem
command1
, a kiedy wyjdziesz, zawartość jest przekazywana zacommand2
pośrednictwem potoku.W tym przypadku nie ma
command1
. Więc możesz zrobić:Lub:
vipe
zbiera zmienneEDITOR
iVISUAL
, więc możesz użyć ich, aby otworzyć Vima.Jeśli nie masz go zainstalowanego,
vipe
jest dostępny wmoreutils
pakiecie;sudo apt-get install moreutils
lub cokolwiek jest ekwiwalentem twojego smaku.źródło
moreutils
jest dostępny w Homebrew.moreutils
jest dostępny do zainstalowania za pomocą pkg (8) .Możesz to zrobić z poziomu Vima:
Lub nawet zapisz bufor w złożonym potoku:
Następnie możesz wyjść z Vima bez zapisywania:
Jednak biorąc pod uwagę konkretny przypadek użycia, prawdopodobnie istnieje lepsze rozwiązanie,
vi
ponieważ jest ono edytorem wiersza poleceń. Zakładając, że używaszbash
:To ustawia twoje skróty klawiszowe na
vi
. Więc można edytować polecenia tuż przy linii poleceń z podstawowychvi
skróty klawiszowe, naciskając<Esc>
, a następnie wpisanievi
polecenia, takie jakx
,cw
itd (można wrócić w trybie wstawiania naciskająci
).Jeszcze lepiej i bardziej odpowiednie dla tego pytania, możesz otworzyć Vima, aby bezpośrednio utworzyć treść wiersza poleceń. Po prostu wpisz,
<Esc>v
a otrzymasz pusty bufor Vima. Podczas zapisywania i zamykania jest to polecenie w wierszu polecenia i jest ono natychmiast uruchamiane. Jest to o wiele bardziej elastyczne niż edytowanie bezpośrednio w wierszu poleceń, ponieważ możesz napisać cały mini-skrypt, jeśli chcesz.Na przykład, jeśli chcesz napisać jakiś trudny tekst i natychmiast wstawić go do pandoc, możesz po prostu wpisać:
Następnie edytuj bufor Vima, aż będziesz mieć coś takiego:
Następnie zapisz i wyjdź (z
:x
), a całość zostanie uruchomiona jako polecenie powłoki.Będzie również dostępny w historii poleceń twojej powłoki.
źródło
EDITOR
zmienną środowiskową navim
i naciskając,Ctrl-X
a następnieCtrl-E
edytując wiersz poleceń.Uruchamianie w przygotowaniu
Próbować:
Kluczem jest to, że aby móc
vim
normalnie korzystać ,vim
musi być stdout jako terminal. Osiągamy to tutaj dzięki przekierowaniu>/dev/tty
.Ze względów bezpieczeństwa umieszczam plik tymczasowy w katalogu osobistym użytkownika. Więcej informacji na ten temat znajduje się w pytaniu 062 do Grega . Eliminuje to potrzebę użycia niejasnej nazwy pliku.
Przykład:
Po
vim
otwarciu wpisujęThis function succeeded.
i zapisuję plik. Wynik na ekranie wygląda następująco:Mimo że dane wyjściowe
quickedit
są przekierowywane do potoku,vim
nadal działają normalnie, ponieważ daliśmy mu bezpośredni dostęp do/dev/tty
.Uruchamianie programu z poziomu vima
Jak wspomniałem w komentarzach, vim może potokować plik do polecenia. Na przykład z poziomu vima wydaj polecenie
:w !pandoc -o file.pdf
(uwaga: niezbędna jest spacja między w i!).źródło
trap '...' exit
zawiesza się, aletrap '...' EXIT
wydaje się działać. Nie wiem dużo o zalewkowaniu, ale moim ogólnym podejściem do plików tymczasowych jest użyciemktmp [--suffix=...]
. Równieżvim <outfile> -c '...' >/dev/tty
działa normalnie, aż plik zostanie załadowany, a następnie wykonuje dany łańcuch dowodzenia, w tym:wq
jeśli chcesz pominąć fazę edycji. Użyłem równieżset | grep -a EXIT
i znalazłemsignals=(EXIT ... DEBUG)
.Upewnij się, że
vim
jest ustawiony jako domyślny edytor (np.export EDITOR=vim
W twoim.bash_profile
lub.bashrc
. Następnie, w dowolnym monicie, możesz wpisać Ctrl- Xa następnie Ctrl- E. Otworzy to twój bieżący wiersz poleceń w skonfigurowanym edytorze (npvim
.). Dokonaj edycji, zapisz i zakończ, a polecenie zostanie wykonane tak, jakbyś wpisał je w wierszu poleceń, w tym potoków i tym podobnych.źródło