Chcę mieć możliwość wywoływania Emacsa z wiersza poleceń i albo uruchamiania graficznego Emacsa, jeśli nie jest uruchomiony, albo odwiedzenia pliku w już uruchomionym Emacsie. Próbowałem to zrobić, o emacsclient
czym wiem, że jest to „właściwy” sposób, ale miałem wiele problemów z tym w OS X, losowo się emacs --daemon
zawiesił lub proces zawiesił się podczas zamykania lub ponownego uruchamiania komputera, i ogólna łuszczenie się. Chociaż chciałbym, aby to zadziałało, w tej chwili open -a
faktycznie działa znacznie lepiej, z wyjątkiem tego jednego problemu, który opiszę poniżej:
Używając w open -a
ten sposób:
$ open -a Emacs file.txt
uruchomi Emacsa, jeśli nie jest uruchomiony, i przejdzie do pliku. Ale jeśli zrobię to, gdy bieżący bufor nie jest, *scratch*
plik zostanie otwarty w nowej ramce (tj. Nowym oknie systemowym).
Oto przykładowa sesja:
$ open -a Emacs file.txt
To uruchamia Emacsa i otwiera plik.txt, więc jest tam jedna ramka z tym buforem. Jeśli przejdę do *scratch*
bufora i zrobię to:
$ open -a Emacs file1.txt
Otwiera ten plik w tej samej ramce. Teraz jest jedna ramka z otwartym plikiem, a jeśli to zrobię:
$ open -a Emacs file2.txt
Otwiera nową ramkę, co powoduje otwarcie dwóch ramek jednocześnie.
Próbowałem bawić się argumentami wiersza poleceń Emacsa za pomocą --args
przełącznika na open
, ale wydaje się, że to nie działa w przypadku kolejnych wywołań, na przykład:
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
To tylko wypisuje „foo” w buforze komunikatów ... za drugim razem, gdy Emacs jest właśnie przenoszony na pierwszy plan, ale żadna wiadomość nie jest drukowana.
Nie jestem pewien, w jaki sposób open
komunikuje się z aplikacjami, które już działają, czy ktoś wie, jak mogę się dowiedzieć? Czy jest jakiś sposób na uzyskanie bardziej szczegółowego dziennika tego, co się dzieje niż Messages
bufor? Nic ciekawego nie jest drukowane w tym buforze podczas powyższej sesji, więc nie wiem, jak mógłbym zhakować Emacsa Lispa, aby zrobić to, co chcę ...
Dzięki!
emacsclient
ponownym użyciu i wydaje (server-start)
mi się, init.el
że uruchamianie go w moim emacs --daemon
systemie działa lepiej niż przy rozruchu, co próbowałem za pierwszym razem emacsclient
.
find-file
a następnie ustawiłdebug-on-error
na t i sprawdził ślad stosu, aby uzyskać wskazówki co do sposobu wywoływania Emacsa. Dodanie błędufind-file
może być tak proste, jak skopiowanie definicji funkcji do bufora scratch lisp i dodanie do niej wywołaniaerror
(np(error "cause stack trace")
. NIGDY NIE ZMIENIĆ PLIKU ŹRÓDŁA NAfind-file
- zawsze rób to w okienku scratch!