Z Vimem mogę to łatwo zrobić
$ echo 123 | vim -
Czy można zrobić z Emacsem?
$ echo 123 | emacs23
... Emacs starts with a Welcome message
$ echo 123 | emacs23 -
... Emacs starts with an empty *scratch* buffer and “Unknown option”
$ echo 123 | emacs23 --insert -
... “No such file or directory”, empty *scratch* buffer
Czy naprawdę niemożliwe jest odczytanie bufora z potoku unix?
Edycja : Jako rozwiązanie napisałem opakowanie powłoki o nazwie emacspipe
:
#!/bin/sh
TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP
Możesz użyć podstawienia procesu :
źródło
emacs: standard input is not a tty
Możesz przekierować do pliku, a następnie go otworzyć. na przykład
jweede zauważa, że jeśli chcesz, aby plik tymczasowy był automatycznie usuwany, możesz:
Emacsy sposobem na to jest uruchomienie polecenia powłoki w Emacsie .
To daje bufor o nazwie * Shell Command Output * z wynikami polecenia.
źródło
echo 123 > temp; emacs temp; rm temp
TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP
. Dzięki wszystkim!Jest to możliwe, patrz https://stackoverflow.com/questions/2879746/idomatic-batch-processing-of-text-in-emacs
Oto echo w skrypcie emacsa (skopiowanym z powyższego linku):
lub odczytać go do bufora, a następnie wydrukować za jednym razem
źródło
Możliwe jest utworzenie prostej funkcji powłoki, która działa podczas odczytu ze standardowego wejścia (chociaż w rzeczywistości zapisuje do pliku tymczasowego, a następnie go odczytuje). Oto kod, którego używam:
Po prostu używasz tej funkcji jako aliasu dla emacsa, np
lub jak zwykle z plików
Zastępowanie
emacs
przezemacsclient
w funkcji również działa.źródło
emacsclient -c -t $@
, a przynajmniej upuścić opcję -n. strony man zemacsclient -t --eval "(man \"$1\")" --eval "(delete-window)"
(a teraz możesz dostaćhelm-swoop
się do Man Glory!)To działa:
ale z jakiegoś powodu tylko z emacsem w trybie graficznym (Gnome, Konsole, GNU Emacs 23.4.1). Komenda:
generuje błąd „emacs: standardowe wejście nie jest tty”. Ten sam błąd pojawia się podczas próby w surowej konsoli tekstowej.
źródło
echo 123 | exec emacs -nw --insert <(cat) </dev/tty
powinno działać.Inną możliwością nie wymienioną w żadnej z poprzednich odpowiedzi jest skorzystanie z niej,
/dev/stdin
jeśli ma ją wybrany wariant Unix.Po prostu próba
/dev/stdin
bezpośredniego otwarcia nie działa, ponieważ Emacs wykonuje kilka kontroli, a następnie zgłaszaSymbolic link that points to nonexistent file
. (A jeśli Emacs pozwoliłby ci załadować plik, wówczas próba zapisania go ponownie, jak/dev/stdin
rzadko robiłaby to, czego oczekiwał użytkownik).Jednak połączenie
/dev/stdin
z--insert
argumentem działa:Należy zauważyć, że ta wersja działa tylko przy użyciu X. Jeśli potrzebujesz rozwiązania, które działa w terminalu, sugeruję, aby spojrzeć na inną odpowiedź .
źródło
emacs: standard input is not a tty
wiadomość testującą to na Linuksie i BSDunset DISPLAY
piszę, otrzymuję ten sam komunikat o błędzie co ty.z ręki coś takiego:
lub
jest opcją. Emacs po prostu nie integruje się z UNIX tak, jak robi to vim.
źródło
M-!
, który automatycznie przechwytuje wynikowy wynik w tymczasowym buforze.) Święty poza wojnami żaden redaktor nie jest „lepszy” od drugiego; po prostu mają bardzo różne perspektywy na prawie wszystko.curl foo.bar | vim -
... Przepraszam.curl foo.bar | emacs