Często restartuję emacsa. Wszystko, co chcę zrobić, to stworzyć funkcję, która zabije obecnego emacsa, tylko po to, aby zamiast niego utworzyć nową. Idealnie byłoby to również działać w TTY.
terminal-emacs
PythonNut
źródło
źródło
.emacs.d
, co oznacza, że ponownie uruchamiam emacsa, aby usunąć śmieci, które wysadziłem w moim środowisku. Jest kilka innych przypadków użycia, w których to robię, ale to jest największe.bash
aby uruchomić ponownie po zakończeniu? Czyvi
? Lub jakikolwiek inny proces z reguły? Nie, ponieważ wykracza to poza ich zakres obaw i jest odpowiednio traktowane zewnętrznie. W każdym razie to, czego naprawdę chcesz, to sposób na ponowne zainicjowanie emacsa poprzez wyczyszczenie jego maszyny wirtualnej i ponowne uruchomienie kodu init ( bez zabijania jego procesu). Byłoby to przydatne i właściwe dla emacsa. Nie wiem jednak, czy istnieje :)bash
od nowaexec bash
. Nie mam pojęcia o Vimie.emacs -q
oczywiście uruchomić i naprawić problem, ale wolę zachować dobrą instancję przez cały czas podczas hakowania mojej konfiguracji, dla zachowania bezpieczeństwa.Odpowiedzi:
Uwaga: zapakowałem następujące elementy w paczkę
restart-emacs
dostępną tutaj .Oto alternatywny sposób na osiągnięcie tego, co chcesz, używając czystego elisp (nie tak naprawdę, ponieważ polegasz na powłoce). Sztuką jest odrodzenie innego procesu emacsa tuż przed zabiciem obecnego emacsa.
Kod do uruchomienia wersji emacsa z GUI jest prosty. Kod uruchamiający emacsa w terminalu jest nieco trudny. Wykorzystuje fakt, że można przekazać ciąg znaków,
suspend-emacs
który zostanie przekazany jako dane wejściowe terminala do procesu nadrzędnego (powłoki). Z dokumentacjiTak więc zasadniczo zawieszamy emacsa tuż przed jego zabiciem, powiedzmy powłoce rodzicielskiej, aby wznowiła aktualnie zawieszony emacs (który wkrótce się zakończy), a następnie uruchomi kolejny proces emacs. Zauważ, że to nie działa na platformach, na których emacs terminala może / nie zawiesza się, ale uruchamia podpowłokę, na przykład w systemie Windows.
źródło
sh -c "emacs &"
z powłoki, kończy się na „emacs: standard input is not a tty
”. (Kiedy toM-x restart-emacs
robię, nawet nie widzę tego komunikatu o błędzie, Emacs po prostu kończy działanie.)O ile wiem, nie możesz powiedzieć Emacsowi, aby uruchomił się ponownie po zakończeniu, ale możesz ustawić kod wyjścia, aby proces, który uruchomił Emacsa, mógł wykryć, że chcesz go ponownie uruchomić.
Na przykład ten skrypt powłoki ponownie uruchamia Emacsa, jeśli zakończył działanie z kodem 123.
Następnie określamy
kill-emacs-and-restart
, że Emacs kończy działanie kodem wyjścia równym magicznej liczbie rozpoznawanej przez skrypt:Teraz, jeśli uruchamiasz Emacsa za pomocą tego skryptu, możesz zacząć od nowa
M-x kill-emacs-and-restart
(lub powiązać go z sekwencją klawiszy).źródło
you cannot tell Emacs to re-start after terminating
. Czy to ograniczenie techniczne?exec...
rodziny (w każdym razie w systemach POSIX). Funkcje kontroli procesu Emacsa Lispa nie ujawniają takich wywołań niskiego poziomu. Nie jestem jednak ekspertem, więc mam nadzieję, że włączy się ktoś bardziej kompetentny.Rażąco skradzione z https://unix.stackexchange.com/questions/114238/is-it-possibe-to-change-parent-shells-working-directory-programmatically
Zakładając, że mam odpowiednią składnię do osadzania „w ciągu, powinno to wystarczyć.
źródło