Emacsclient: Jeden proces emacsa cały czas od uruchomienia i nigdy nie zamykaj i lepiej ukryj GUI

9

Ponieważ emacsclient może poprawnie obsługiwać długi czas ładowania pakietu, naprawdę chcę zachować co najmniej jeden proces emacs, a przez większość czasu tylko jeden proces emacs , otwarty jako proces w tle i lepiej ukryć GUI.

W tej chwili zdefiniowałem następującą funkcję w .bashrc:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

A także mają następujący wiersz w .bashrc:

emc

Więc za każdym razem, gdy otwieram powłokę, skończę z nowym procesem emacsa.

Problem polega na tym, że po otwarciu wielu powłok będę musiał przeprowadzić wiele dodatkowych niepotrzebnych procesów emacs. Chcę jednak cały czas utrzymywać tylko jeden proces emacsa od uruchomienia, lepiej ukryj GUI .

phonycollectibles
źródło
5
Nie znam emacs --eval "(suspend-frame)"raczej praktyki emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). Czy istnieje powód, dla którego zdecydujesz się nie wywoływać emacsa jako demona? Możesz użyć czegoś takiego, pgrep -U `whoami` emacs || emacs --daemon &aby upewnić się, że działa.
ebpa
Sprawdź skrypty MJ Wall dotyczące korzystania z klienta Emacs.
Tianxiang Xiong,

Odpowiedzi:

13

Robię to, uruchamiając demona emacsa podczas logowania. Miejsce wprowadzenia tego polecenia zależy od menedżera pulpitu. Używam i3, który jest skonfigurowany do uruchamiania skryptu podczas logowania, który obejmuje:

emacs --daemon &

Dzięki temu emacs zawsze działa w tle, a ja otwieram nowego klienta za pomocą emacsclient -c -n, powiązanego z wygodnym klawiszem w menedżerze okien. Jeśli pracujesz w terminalu, wystarczy prosty alias takiego alias emc='emacsclient', ewentualnie -n, -cczy -targumenty, w zależności od tego, jak go używać.

Sprawdź opcje emacsclient w instrukcji: (emacs) Opcje emacsclient , dostępne z Emacsa przez C-h r m emacsclient options <enter>). Możesz użyć -aflagi, aby automatycznie uruchomić demona emacsa, jeśli jeszcze nie działa, -club -totworzyć nową ramkę lub klienta terminala, zamiast ponownie używać istniejącego (w tej samej sesji):

'-Komenda'
„--alternate-editor = COMMAND”
     Podaj polecenie do uruchomienia, jeśli „emacsclient” nie skontaktuje się z Emacsem.
     Jest to przydatne podczas uruchamiania „emacsclient” w skrypcie.

     Jako wyjątek specjalny, jeśli COMMAND jest pustym ciągiem znaków, to
     „emacsclient” uruchamia Emacsa w trybie demona (jako „emacs --daemon”) i
     następnie próbuje połączyć się ponownie.

'-do'
„--create-frame”
     Utwórz nową graficzną „ramkę klienta”, zamiast używać istniejącej
     Ramka Emacsa. Zobacz poniżej specjalne zachowanie „Cx C-c” w a
     rama klienta. Jeśli Emacs nie może utworzyć nowej ramki graficznej (np.
     jeśli nie może połączyć się z serwerem X), próbuje utworzyć tekst
     ramka klienta terminala, tak jakbyś dostarczył opcję -t
     zamiast.

„-t”
„--tty”
'-północny zachód'
     Utwórz nową ramkę klienta w bieżącym terminalu tekstowym zamiast
     za pomocą istniejącej ramki Emacsa. Zachowuje się tak jak „-c”
     opcja opisana powyżej, z tym wyjątkiem, że tworzy terminal tekstowy
     ramka (* uwaga Terminale nieokienne: :).
Tyler
źródło
4

Jeśli korzystasz z systemu operacyjnego, który używa menedżera usług systemd (który obecnie obejmuje większość dystrybucji GNU / Linux), najlepszym rozwiązaniem może być użycie systemd do uruchomienia demona Emacsa przy rozruchu. Możesz to zrobić, tworząc plik $HOME/.config/systemd/user/emacs.serviceo następującej treści:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

Następnie powinieneś uruchomić usługę i ustawić, aby automatycznie uruchamiała się dla wszystkich przyszłych rozruchów:

$ systemctl enable --user emacs
$ systemctl start --user emacs

Możesz teraz używać emacsclientjak zwykle. Jeśli normalnie uruchomić go z -n, -club -topcji, można ustawić aliasu w swojej skorupie. Możesz także ustawić zmienne środowiskowe EDITORi / lub tak, VISUALaby działały emacsclienttak, jak lubisz. Na przykład w Bash możesz dodać do .bashrcpliku:

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Jeśli kiedykolwiek będziesz musiał zatrzymać demona Emacsa, możesz to zrobić w następujący sposób:

$ systemctl stop --user emacs

A jeśli chcesz na stałe zatrzymać jego uruchamianie przy starcie systemu:

$ systemctl disable --user emacs
Psychonauta
źródło
1
może ten link do EmacsWiki powinien zostać potwierdzony: EmacsAsDaemon
HongboZhu
0

Sposób, w jaki to robię, jest bardzo podobny do poprzedniej odpowiedzi, poprzez zdefiniowanie aliasu w moim pliku .bashrc emacs --daemon

alias ds="emacs --daemon"

Poza tym mam ctrl-alt-Eustawiony skrót klawiaturowy emacsclient -c. Kiedy chcę rozpocząć pracę z emacsem, otwieram terminal, dspiszę i wywołuję każdą instancję emacsclient za pomocą mojego skrótu.

Mam nadzieję, że to komuś pomoże.

Nidish Narayanaa
źródło