Uruchom dwa osobne demony emacs dla konsoli i GUI

14

Zazwyczaj uruchamiam emacsa za pomocą GUI i od razu uruchamiam serwer (server-start). Teraz mogę łatwo otwierać dokumenty do mojej istniejącej sesji emacs z terminala za pośrednictwem emacsclient -n <file>lub z przeglądarki plików.

Jednak od czasu do czasu chcę uruchamiać emacsa w moim terminalu za pomocą emacsclient -t. Dzieje się tak najczęściej podczas pisania dzienników git commit lub wykonywania innych bardzo małych zadań. W takich przypadkach fakt, że mój plik init został załadowany do instancji GUI emacsa, oznacza, że ​​nie otrzymuję żadnych dostosowań, które są specyficzne dla emacsa TTY.

Wiem, że umiem biegać

emacs -nw -q -l "some-custom-init-file.el"

ale to za każdym razem przeładuje wszystkie pakiety. Czy mogę mieć to, co najlepsze z obu światów? Czy istnieje sposób skonfigurowania „demona TTY”, aby można było używać osobnych dostosowań do uruchamiania w terminalu w porównaniu do odwiedzania pliku w istniejącym oknie emacsa?

nispio
źródło
1
Czy możesz wskazać przykład dostosowań, które różnią się między trybem TTY i GUI?
stsquad
1
@stsquad Jednym naprawdę prostym jest to, że używam lewej grzywki w trybie GUI, ale ponieważ grzywka nie istnieje w trybie TTY, nie ma spacji między numerami linii a tekstem. Można to naprawić za (setq linum-format "%d ")pomocą pliku dostosowywania TTY. Ponadto mój motyw koloru zawsze wygląda dziwnie w trybie TTY, więc na pewno wybiorę inny motyw dla TTY. Obecnie nie mam tak wielu różnic, ale teraz, gdy wiem, że mogę mieć różne serwery, lista może się powiększać.
nispio
@nispio: Proponuję ci M-x report-emacs-bugi poprosić o nowe funkcje, takie jak możliwość posiadania różnych motywów twarzy w ramkach TTY i GUI (w rzeczywistości motyw może określać zupełnie różne kolory dla różnych rodzajów ramek, więc możesz również dostosować swój motyw) . Użycie kilku demonów dla tych osobnych przypadków jest tylko obejściem braku odpowiedniej funkcjonalności w Emacsie.
Stefan

Odpowiedzi:

14

Użyj, emacs --daemon=your-server-name -l "custom-init-file"aby uruchomić nowy serwer i emacsclient -nw -s your-server-namepołączyć się z nim z samego terminala. W rozdziale dotyczącym używania Emacsa jako serwera w podręczniku jest więcej opcji inicjalizacji.

Vamsi
źródło
To działa! Czy istnieje dobry sposób na zabicie serwera rozpoczętego w ten sposób, oprócz szukania i usuwania pliku serwera?
nispio
(Miałem dodać -qprzełącznik, aby moje domyślne init.eluruchamianie przed niestandardowego pliku inicjującego.)
nispio
2
Robi emacsclient -s your-server-name -e "(kill-emacs)" robisz co chcesz? Powyższe po prostu nazywa emacsclient i evals (kill-emacs). Można wymienić (kill-emacs)z (save-buffers-kill-emacs)również.
Vamsi
Kiedyś miałem wspólny plik init.el zarówno dla terminalu, jak i GUI Emacsa, i ładowałem osobne pliki niestandardowe dla poszczególnych dostosowań. Dlatego przegapiłem-q
Vamsi
1
Rozwiązania te rozwiązały również problem, który miałem podczas używania „emacsclient -t” z muttem oraz, w osobnym obszarze roboczym, „emacsclient -c”. Mówiąc najprościej: demon ulegał awarii, gdy „emacsclient -c” został uruchomiony przed „emacsclient -t”. Dziękuję, Vamsi
Boccaperta-IT
9

Oprócz odpowiedzi @ Vamsi, możesz uzyskać wiele takich samych korzyści, uruchamiając tylko jeden serwer, dołączając porady do make-frame-command.

Na przykład podczas pracy w terminalu chcę, aby kolor tła był black(który odwzorowuje #202020), ale chcę używać #202020w trybie graficznym. Zaimplementowałem to z:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

Możesz uzyskać z tego wiele kilometrów, używając make-variable-frame-local( set-background-colorw powyższym przypadku jest już lokalne).

Nie wiem, czy jest to najlepszy wzorzec, ale jeśli masz stosunkowo niewiele różnic między trybem TTY a emacsem w trybie X, może to ułatwić zarządzanie konfiguracją.

Powyższy kod został pobrany z mojego .emacs.d .

J David Smith
źródło
Zastanawiałem się, czy istnieje jakiś sposób na „wykrycie”, w którym trybie jestem na podstawie ramki.
nispio
1
To zrobi to. (display-graphic-p)daje, tjeśli bieżąca ramka jest graficzna, w nilprzeciwnym razie. Ponieważ ramki nie mogą być przenoszone między grafiką a nie (afaik), dołączenie porady do tworzenia ramek gwarantuje osiągnięcie pożądanego stanu dla danej ramki.
J David Smith
To zdecydowanie najwygodniejsza odpowiedź.
Malabarba
4

Nie potrzebujesz porady, aby zmienić ustawienia różnych ramek działających w tym samym demonie emacs. Po prostu użyj hakaafter-make-frame-functions sposób

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

Zdefiniowanie go w ten sposób ma dodatkową zaletę, że ustawia pożądaną konfigurację ramki, nawet jeśli nie uruchamiasz się w trybie demona.

Niestety load-theme nie jest to ramka lokalna, więc inne ramki również się pokolorują, jeśli naprawdę używasz różnych motywów dla ramek tekstowych i graficznych.

Informacje o bonusie: skonfiguruj terminale w co najmniej 256 kolorach, aby uzyskać prawdziwy efekt wybranego motywu. Użyj takiego ustawienia w jednym z plików startowych powłoki:

TERM=xterm-256color
export TERM
Uwe Koloska
źródło
Nie wszystkie terminale obsługują 256 kolorów, np. Xfce4-terminal wciąż ma tylko 8 (przełączyłem się na sakura dla ładnych kolorów).
młot