Starten Sie zwei separate Emacs-Dämonen für Konsole und GUI

14

Normalerweise starte ich Emacs mit der GUI und starte sofort einen Server mit (server-start). Jetzt kann ich Dokumente einfach über das Terminal emacsclient -n <file>oder über den Dateibrowser in meine bestehende Emacs-Sitzung öffnen .

Von Zeit zu Zeit möchte ich jedoch Emacs in meinem Terminal mit ausführen emacsclient -t. Dies geschieht am häufigsten beim Schreiben von Git-Commit-Protokollen oder beim Ausführen anderer sehr kleiner Aufgaben. In diesen Fällen bedeutet die Tatsache, dass meine Init-Datei in eine GUI-Instanz von Emacs geladen wurde, dass ich keine meiner Anpassungen erhalte, die für TTY-Emacs spezifisch sind.

Ich weiß, dass ich rennen kann

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

Dadurch werden jedoch jedes Mal alle Pakete neu geladen. Kann ich das Beste aus beiden Welten haben? Gibt es eine Möglichkeit, einen "TTY-Daemon" einzurichten, damit ich separate Anpassungen für die Ausführung im Terminal verwenden kann, anstatt die Datei in einem vorhandenen Emacs-Fenster zu besuchen?

Nispio
quelle
1
Können Sie ein Beispiel für Ihre Anpassungen nennen, die sich zwischen TTY- und GUI-Modus unterscheiden?
Stsquad
1
@stsquad Ein wirklich einfaches Problem ist, dass ich im GUI-Modus einen linken Rand verwende, aber da der Rand im TTY-Modus nicht vorhanden ist, gibt es keinen Abstand zwischen den Zeilennummern und dem Text. Dies kann (setq linum-format "%d ")in der TTY-Anpassungsdatei behoben werden. Außerdem sieht mein Farbschema im TTY-Modus immer seltsam aus, sodass ich auf jeden Fall ein anderes Thema für das TTY auswählen werde. Eigentlich habe ich im Moment nicht so viele Unterschiede, aber jetzt, wo ich weiß, dass ich verschiedene Server haben kann, kann die Liste wachsen.
Nispio
@nispio: Ich empfehle Ihnen M-x report-emacs-bugund fordere neue Funktionen an, z. B. die Möglichkeit, unterschiedliche Gesichtsthemen in TTY- und GUI-Rahmen zu verwenden (tatsächlich kann ein Thema für diese verschiedenen Rahmentypen völlig unterschiedliche Farben festlegen, sodass Sie auch Ihr Thema anpassen können). . Die Verwendung mehrerer Daemons für diese separaten Fälle ist nur eine Umgehung für den Mangel an entsprechenden Funktionen in Emacs.
Stefan

Antworten:

14

Dient emacs --daemon=your-server-name -l "custom-init-file"zum Starten eines neuen Servers und emacsclient -nw -s your-server-namezum Herstellen einer Verbindung vom Terminal aus. Der Abschnitt über die Verwendung von Emacs als Server im Handbuch enthält weitere Initialisierungsoptionen.

Vamsi
quelle
Das funktioniert! Gibt es eine gute Möglichkeit, einen so gestarteten Server zu töten, außer die Serverdatei zu suchen und zu löschen?
Nispio
(Ich musste einen -qSchalter hinzufügen, um zu verhindern, dass mein Standard init.elvor der benutzerdefinierten Init-Datei ausgeführt wird.)
nispio
2
Macht emacsclient -s your-server-name -e "(kill-emacs)"was du willst Das oben Genannte nennt man nur emacsclient und evals (kill-emacs). Sie könnten ersetzen (kill-emacs)mit (save-buffers-kill-emacs)als auch.
Vamsi
Früher hatte ich eine gemeinsame Init.el für Terminal- und GUI-Emacs und lud separate benutzerdefinierte Dateien für individuelle Anpassungen. Daher habe ich die-q
Vamsi
1
Diese Lösung behebt auch ein Problem, das bei der Verwendung von 'emacsclient -t' mit mutt und in einem separaten Arbeitsbereich 'emacsclient -c' auftrat. Einfach ausgedrückt: Daemon stürzte ab, als 'emacsclient -c' vor 'emacsclient -t' gestartet wurde. Vielen Dank, Vamsi
Boccaperta-IT
9

Zusätzlich zur Antwort von @ Vamsi können Sie viele der gleichen Vorteile erzielen, wenn Sie nur einen einzigen Server betreiben, indem Sie Ratschläge anhängen make-frame-command.

Wenn ich zum Beispiel im Terminal lebe, möchte ich, dass die Hintergrundfarbe black(die zugeordnet ist #202020), aber ich möchte sie #202020in einem grafischen Modus verwenden. Ich habe das umgesetzt mit:

(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")))

Sie können eine Menge Laufleistung daraus ziehen make-variable-frame-local( set-background-colorim obigen Beispiel ist dies bereits rahmenlokal).

Ich weiß nicht, ob dies das beste Muster ist, aber wenn Sie relativ wenige Unterschiede zwischen TTY- und X-Mode-Emacs haben, kann dies das Konfigurationsmanagement vereinfachen.

Der obige Code wurde von meinem .emacs.d gezogen .

J David Smith
quelle
Ich hatte mich gefragt, ob es eine Möglichkeit gibt, auf Einzelbildbasis festzustellen, in welchem ​​Modus ich mich befinde.
Nispio
1
Das wird es schaffen. (display-graphic-p)Gibt an, tob der aktuelle Frame grafisch ist, nilansonsten. Da Frames nicht zwischen grafisch und nicht (afaik) verschoben werden können, wird durch das Anhängen von Hinweisen zur Frame-Erstellung sichergestellt, dass der gewünschte Status für den angegebenen Frame erreicht wird.
J David Smith
Dies ist definitiv die bequemste Antwort.
Malabarba
4

Sie benötigen keinen Rat , um die Einstellungen verschiedener Frames zu ändern, die im selben Emacs-Dämon ausgeführt werden. Benutze einfach den Haken after-make-frame-functionsso

(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)))

Diese Definition hat den zusätzlichen Vorteil, dass die gewünschte Frame-Konfiguration festgelegt wird, auch wenn Sie nicht im Daemon-Modus starten.

Leider load-themeist der Frame nicht lokal und daher werden auch die anderen Frames farbig, wenn Sie wirklich unterschiedliche Designs für Text- und Grafik-Frames verwenden.

Bonusinformationen: Konfigurieren Sie Ihre Terminals mit mindestens 256 Farben, um das echte Gefühl Ihres ausgewählten Themas zu erhalten. Verwenden Sie eine Einstellung wie diese in einer Ihrer Shell-Startdateien:

TERM=xterm-256color
export TERM
Uwe Koloska
quelle
Nicht alle Terminals unterstützen 256 Farben, z. B. ist das xfce4-Terminal immer noch nur 8 (ich habe wegen der hübschen Farben zu Sakura gewechselt).
Unhammer