(Zwróć uwagę, że przeciwnie, to pytanie nie jest takie samo jak Jak uruchomić w trybie demona i ukryć interaktywne okna dialogowe? Ponieważ na to pytanie „odpowiedział” autor, który wyeliminował to, co spowodowało pojawienie się konkretnego monitu).
Chciałbym wiedzieć, czy istnieje ogólny sposób, aby nie emacs --daemon
zawieszać się na zawsze i czekać na odpowiedź na monit wyświetlany w minibuforze, który jeszcze nie istnieje.
Nie można połączyć się z emacsclient, aby odpowiedzieć na te monity, ponieważ serwer nie uruchomi się, dopóki Emacs nie zakończy sekwencji startowej. (Oznacza to, że jeśli ALTERNATE_EDITOR jest ustawiony na pusty ciąg, co sprawia, emacsclient
że serwer , który nie może znaleźć serwera, uruchamia nowego demona, możesz skończyć z wieloma demonami Emacsa, które są zablokowane i czekają.) Muszę killall emacs
rozwiązać problem przed kontynuowaniem.
Mogę grać w walenie w kret z każdą rzeczą, która powoduje wyświetlenie monitu podczas uruchamiania, gdy ją zidentyfikuję (uruchamiając Emacsa w trybie innym niż demon i sprawdzając, o co pyta), ale nie jest to rozwiązanie, ponieważ nie może zatrzymać następnego demona od zawieszenia się przy starcie z nowego powodu.
Podam przykład: częstym powodem zawieszania się było po ponownym uruchomieniu systemu lub awarii Emacsa, gdy pierwszy po ponownym uruchomieniu Emacs chciał wiedzieć, czy można ukraść pliki blokujące od nieistniejącego Emacsa. Mógłbym to naprawić, tworząc porady, które sprawią, że monit zawsze odpowie „tak” bez interakcji. Ale jednym z plików, które były otwarte podczas poprzedniej sesji składowania, był plik TRAMP wymagający hasła sudo lub SSH, więc demon utknął, czekając na monit o hasło. Naprawiam to, ręcznie edytując plik sesji (za pomocą vi
lub emacs -q
!), Aby usunąć szkodliwe pliki - ale to nie powstrzymuje go przed następnym razem.
Mogę więc zatrzymać ładowanie sesji automatycznie podczas uruchamiania i zmienić ją na polecenie, które muszę ręcznie wykonać z pierwszego programu emacsclient. Ale jeśli nie ładuje mojej sesji w tle, więc jest gotowa, zanim będę gotowa z niej korzystać, cały cel demona zostanie utracony!
Chciałbym więc:
- (Najlepsze) Jakiś sposób na odroczenie monitów minibufora, dopóki nie otworzę emacsclient, jednocześnie kończąc resztę inicjalizacji.
- (OK) W jakiś sposób, aby wszystkie monity w minibuforze nie były jeszcze zalecane, jak opisano powyżej, po prostu wróć,
no
chyba że uruchomiony jest emacsclient. Mogę żyć z błędami buforów TRAMP, o ile w większości działają.
Czy jest jakiś sposób na osiągnięcie któregokolwiek z tych celów?
źródło
(read-desktop)
, a następnie, przed uruchomieniememacs --daemon
, utwórz fałszywy plik blokady, umieszczając liczbę całkowitą w .emacs.desktop.lock (gdzie umieszczenie tego pliku niestety zależy od konfiguracji , ale prawdopodobnie albo twój homedir, albo ~ / .emacs.d / .Odpowiedzi:
Nasza dyskusja wyjaśniła, że nie masz uruchomionego żadnego serwera X, przez co moje pierwsze rozwiązanie jest bezużyteczne.
Poniżej przedstawiam drugie rozwiązanie, które działa z ramkami terminali tekstowych.
Gdy inicjalizacja wymaga wprowadzenia danych przez użytkownika, funkcje zalecane przez
avoid-initial-terminal
Emacsa czekają, aż otworzysz ramkę terminala tekstowego. Monit pojawia się w minibuforze tej ramki i możesz udzielić interaktywnej odpowiedzi.Informacje związane z kodem są podawane jako komentarze w kodzie. Istnieją
TODO
znaczniki z opisami, które pokazują, gdzie wstawić własną konfigurację. Obecnie istnieją tam formularze testowe, które sprawdzają poprawność kodu.Test: wersja Emacsa: 26.1
1.) Uruchom
emacs --daemon
na konsoli.2.) Uruchom
emacsclient --tty
na innej konsoli. Zostaniesz tam poproszony o hasło i ciąg znaków. Następnie musisz również odpowiedzieć na zapytanie typu y-or-np.źródło
Nie dokładnie to, o co prosisz, ale może rozwiązanie pierwotnego problemu:
Jeśli demon da ci graficzną ramkę do odpowiedzi na pytania pojawiające się w fazie rozruchu, nie utkniesz.
Poniższy kod definiuje ogólne porady,
my-with-initial-frame
które otwierają ramkę na pierwszym dostępnym wyświetlaczu (np:0.0
.).Poradę tę można łatwo dodać do zapytań dotyczących poleceń, takich jak
y-or-n-p
lubread-passwd
, jak pokazano poniżej.Samo otwarcie ramki daje dość zgrubną możliwość odpowiedzi na zapytania w interfejsie użytkownika. Można również użyć okna dialogowego,
y-or-n-p
ale wymagałoby to specjalnych rozwiązań dla określonych poleceń zapytań. Chciałem tego uniknąć.Jeśli spróbujesz tego kodu w pliku init, upewnij się, że jest to pierwsza rzecz.
Test:
Założenia:
Posiadaj działający serwer xserver, z którym programy mogą się łączyć za pośrednictwem
DISPLAY
zmiennej środowiskowej.Dane wejściowe w xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Otwiera ramkę z
y-or-n-p
monitem zapytaniaA (y or n)
. Odpowiedz na to zapytanie i spróbuj ponownie:emacsclient --eval '(y-or-n-p "B")'
Nowe zapytanie z monitem
B (y or n)
w tej samej ramce. Zamknij tę ramkę, np. Za pomocą C-x 5 0i spróbuj ponownie:emacsclient --eval '(y-or-n-p "C")'
Nowa ramka otwiera się z pytaniem
C (y or n)
.To samo działa w przypadku wprowadzania hasła.
źródło
xterm
. Nie sądzę też, aby to rozwiązanie działało dla tych, którzy to robią - jeśli masz skonfigurowanego demona do uruchamiania podczas uruchamiania, próbowałby otworzyć ramkę na ekranie logowania, co jest niedozwolone, więc ulega awariiserver-start
po zakończeniu uruchamiania zamiast tego jest tak, że jeśli masz czysty start, nie będziesz musiał czekać. Ale ... będziesz musiał poczekać, ponieważ jeśli nie zrozumiem źle, nie możesz umieścić zadania uruchomienia demona Emacs w skrypcie logowania do systemu, ponieważ GUI nie będzie wtedy dostępny. (A w przypadku takim jak mój, nigdy też nie będzie później.)Myślę, że odroczenie podpowiedzi będzie ogólnie trudne, ale zmiana Emacsa powinna być dość łatwa, aby takie podpowiedzi natychmiast sygnalizowały błąd.
Mało tego, ale jeśli nie potrafisz odpowiedzieć na te pytania bez dużej ilości ćwiczeń, myślę, że kwalifikuje się to jako błąd, więc zalecam przesłanie raportu o błędzie.
źródło
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
monitu na błąd, nie odnosząc się konkretnie do „pulpitu” (ponieważ w ten sposób, będąc nieogólnym, kłamie jak kret)?*Messages*
jest prawdopodobnie niewystarczającym heads-upem przy pierwszym połączeniu klienta, że coś może być naprawdę nie tak i wymaga natychmiastowej uwagi, zanim użytkownik podejmie jakiekolwiek stanowe operacje.emacs --daemon
albo zaczynającemacsclient
odALTERNATE_EDITOR
zmiennej środowiskowej ustawionej na pusty ciąg znaków, zobaczysz dane wyjściowe, które zwykle trafiają do*Messages*
echa w terminalu aż do demona finalizuje Inicjalizacja i Emacs jest gotowy, ale wiele z nich Emacs uruchomić demona przy starcie systemu lub czasie logowania, a wyjście jest albo zalogować lub wyrzucić..desktop
ale wy-or-n-p
funkcji (lub niższej). Mamy mechanizm opóźniający wyświetlanie błędów, które wystąpiły podczas uruchamiania, więc możemy go użyć, aby wyświetlić je, gdy pierwszy emacsclient połączy się z demonem.*Messages*
- i podczas gdy mało używany*Warnings*
system wyświetla okno bufora, jeśli aktywna ramka istnieje, gdy generowane jest ostrzeżenie, w tym przypadku nie istnieje żadna ramka, a nie wydaje się łatwe, aby odłożyć wyskakujące okienko do pierwszego emacsclient po problemie z ostrzeżeniem. Jeśli to można zrobić, Twoja sugestiayes-or-no-p
ostrzeżenia przed klientem byłaby idealna. (Wątpię, żeby użytkownicy czesali się*Messages*
przy starcie!)