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 emacsclientczym wiem, że jest to „właściwy” sposób, ale miałem wiele problemów z tym w OS X, losowo się emacs --daemonzawiesił 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 -afaktycznie działa znacznie lepiej, z wyjątkiem tego jednego problemu, który opiszę poniżej:
Używając w open -aten 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ą --argsprzełą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 openkomunikuje 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ż Messagesbufor? 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!
emacsclientponownym użyciu i wydaje (server-start)mi się, init.elże uruchamianie go w moim emacs --daemonsystemie działa lepiej niż przy rozruchu, co próbowałem za pierwszym razem emacsclient.
find-filea następnie ustawiłdebug-on-errorna t i sprawdził ślad stosu, aby uzyskać wskazówki co do sposobu wywoływania Emacsa. Dodanie błędufind-filemoż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!