Emacs otwiera pliki w nowej ramce po otwarciu za pomocą „open -a”

20

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!

michiakig
źródło
Nic nie wiem o OSX, więc nie mogę podać niczego konkretnego. Gdybym jednak miał to debugować, rzuciłbym trochę błędu składniowego do, 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łędu find-filemoże być tak proste, jak skopiowanie definicji funkcji do bufora scratch lisp i dodanie do niej wywołania error(np (error "cause stack trace"). NIGDY NIE ZMIENIĆ PLIKU ŹRÓDŁA NA find-file- zawsze rób to w okienku scratch!
Joe Casadonte
@Joe Thanks! To całkiem niezły pomysł, będę o tym pamiętać na przyszłość. Skończyło się to na 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.
michiakig

Odpowiedzi:

26

Odpowiedź jest tutaj: zmienna emacs, aby „otworzyć za pomocą” w oryginalnej ramce

Jest to zmiana domyślnych ustawień w nowszych wersjach emacsa. Dodaj:

(setq ns-pop-up-frames nil)

do pliku .emacs.

Bardzo się cieszę, że to znalazłem.

Colin
źródło
To było bardzo pomocne! W połączeniu z pseudonimem open -a /Applications/Emacs.app $1wszystko działa dobrze! Zauważ, że uruchamiam serwer w moim init, aby na przykład mieć emacsa dla git.
Dror