Wie bekomme ich, dass meine .emacs-init-Dateien korrekt mit dem emacs-Server geladen werden?

1494
labyrinth

Meine init-Dateien sind so eingerichtet, dass meine .emacs Datei ein symbolischer Link ist, der auf ein betriebssystemspezifisches Init verweist, das wiederum die Hauptinitivdatei mit Konfigurationen lädt, die vom Betriebssystem nicht betroffen sind. Ich hatte keine Probleme mit diesem Setup für Nicht-Server-Emacs.

Bei der Verwendung von emacsclient funktioniert es jedoch nicht richtig. Zum Beispiel habe ich eine Einstellung dafür org-mode, dass in Terminal unter OSXS-Tab Backtab zugeordnet wird, damit es ordnungsgemäß funktioniert, anstatt einen Fehler über undefinierte Schlüssel zu werfen. Diese Einstellung funktioniert gut, wenn ich keinen emacs-Server verwende. Wenn ich emacsclient verwende, erhalte ich den Fehler undefiniertes Keybinding.

Ich weiß, dass alle meine init-Dateien fehlerfrei geladen werden, da alle in den Dateien eingegebenen Zeilen (Nachricht "was auch immer") in Ordnung sind, wenn der Server gestartet wird. Dem emacs-Server fehlen also die Dateien irgendwie. Es ist, als würden die zugeordneten Schlüssel für den Server geladen, aber vergessen, wenn ein Client eine Verbindung herstellt. Ich habe es sogar versuchteval die Tastenzuordnungen in einem emacsclient-Puffer auszuführen, aber es wurden keine Fehler und keine Änderungen vorgenommen. Irgendwelche Ideen?

(Übrigens, --debug-initzeigt nichts seltsames. Alles wird ohne Fehler geladen .)

5
Können Sie eine minimale init.el erstellen, die das Problem veranschaulicht? (Ignorieren wir vorerst das Symlinking und das Laden der betriebssystemneutralen Init-Datei.) Davor Cubranic vor 9 Jahren 0
Eine Möglichkeit besteht darin, dass Sie, wenn Sie in der Init-Funktion Keybindings einrichten, abhängig vom Wert von `window-system` oder etwas Ähnlichem, die Einstellungen möglicherweise nicht für ein Terminal, sondern für die GUI gelten. Davor Cubranic vor 9 Jahren 0

2 Antworten auf die Frage

5
Dailan Kifki

Ich denke, Ihr Problem ist, dass Ihre .emacs-Datei etwas wie local-function-key-mapoder einstellt, input-decode-mapaber diese Variablen sind terminallokal, was bedeutet, dass jedes "Terminal" (Ihre GUI ist ein "Terminal") und jede emacsclient-Verbindung über ein Text-Terminal eine andere ist "terminal") erhält einen anderen Wert dieser Variablen.

Sie müssen diesen Code also für jedes neue Terminal erneut ausführen. Sie können dies after-make-frame-functionsvon reza.safiyat aus tun, es wird öfter ausgeführt als benötigt (einmal pro Frame, nicht einmal pro Terminal). Da dies jedoch wahrscheinlich nur für "xterm" -Terminals benötigt wird, ist es eine andere gute Möglichkeit, dies von zu tun terminal-init-xterm-hook:

(defun my-text-terminal-keys () (define-key input-decode-map ...) (define-key local-function-key-map ...)) (add-hook 'terminal-init-xterm-hook #'my-text-terminal-keys) 

Übrigens, manchmal ist eine Alternative zu verwenden function-key-map, da dies eine globale Variable ist und für alle Terminals gleichermaßen gilt.

Interessanterweise scheint dieser Haken nirgendwo definiert zu sein… Clément vor 7 Jahren 0
`grep terminal-init-xterm-hook ** / *. el` zeigt an, dass es in` lisp / term / xterm.el` ist. Beachten Sie, dass Hooks nicht "definiert" werden müssen (ein ungebundener Wert funktioniert genauso gut wie ein Nullwert). Dailan Kifki vor 6 Jahren 0
1
reza.safiyat

Endlich eine Lösung gefunden.

Dies ist eine kopierte Lösung, aber leider habe ich den Link dazu verloren. Fügen Sie dies einfach Ihrer initDatei hinzu.

(defun startup_func(_) (load-file "/path/to/custom-keybindings.el"))  (add-hook 'after-make-frame-functions #'startup_func)