Emacs - Fehler beim Aufrufen (Server-Start)

82

Ich verwende derzeit GNU Emacs 23.0.93.1 in Windows Vista SP1. In meiner .emacs-Datei rufe ich an (server-start)und dies verursacht einen Fehler mit der Meldung. Das Verzeichnis ~ / .emacs.d / server ist unsicher . Hat jemand dies gesehen und kennt eine Lösung oder Problemumgehung? ... außer den Server ausgeschaltet zu lassen;)

Hier ist die Stapelverfolgung:

Debugger entered--Lisp error: (error "The directory ~/.emacs.d/server is unsafe")
  signal(error ("The directory ~/.emacs.d/server is unsafe"))
  error("The directory %s is unsafe" "~/.emacs.d/server")
  server-ensure-safe-dir("~\\.emacs.d\\server\\")
  server-start(nil)
  call-interactively(server-start t nil)
  execute-extended-command(nil)
  call-interactively(execute-extended-command nil nil)
λ Jonas Gorauskas
quelle
1
Ich hatte einen ähnlichen Fehler beim Starten von Emacs auf einer Unix-Box. Dies stellte sich heraus, weil ich meine ~ / .emacs.d in Subversion behalte und beim Auschecken den svnClient ~ / .emacs.d / server auf 0755 pro meiner Umask setze. Anstatt svnein Shell-Skript einzuschließen, das den Zweck zunichte macht, alles, was ich zum Anpassen von Emacs benötige, in Subversion zu haben, muss Emacs beim Start nur die richtigen Berechtigungen erzwingen, indem es Folgendes hinzufügt ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller,

Antworten:

151

Ich habe diese Lösung in EmacsWiki gefunden:

"Das Problem ist der Besitz des Verzeichnisses ~ / .emacs.d / server, wenn Sie auch über Administratorrechte für Ihr Konto verfügen. Erstellen Sie das Verzeichnis ~ / .emacs.d / server und setzen Sie den Eigentümer dieses Verzeichnisses auf Ihr Login Name und das Problem ist weg. Da ich eine "niederländische" Version von Windows 7 habe, kenne ich die englischen Begriffe nicht genau, aber hier ist die Vorgehensweise:

Klicken Sie mit der R-Maus auf ~ / .emacs.d / server und wählen Sie "Eigenschaften" (letzter Menüpunkt). Wählen Sie unter Eigenschaften die Registerkarte "Sicherheit" und dann die Schaltfläche "Erweitert". Wählen Sie dann die Registerkarte "Eigentümer" und ändern Sie den Eigentümer von Administrators (<your-pc-name>\Administrators)in <your-login-name> (<your-pc-name>\<your-login-name>. Jetzt akzeptiert der Servercode dieses Verzeichnis als sicher, da Sie der Eigentümer sind.

Hoffe das hilft euch allen, es hat das Problem trotzdem für mich gelöst.

WKR Reutefleut "

Es funktioniert definitiv unter Vista mit Emacs 23.2.1.

RealityMonster
quelle
3
Behoben! Ich wünschte, dieser Kommentar hätte ein höheres Google-Ranking und sollte auch die Antwort auf diese Frage sein.
Drew
Das Problem wurde auch unter Windows 7 behoben. Von Bash, $ chown -R "$ {USER}" ~ / .emacs.d
h
Es funktioniert mit Spacemacs [email protected] (daher sollte es auch mit einfachen Emacs 25.1.1 funktionieren).
Gemantzu
chmod 700 ist auch in Ordnung.
Netawater
29

Ich beantworte gerne Larsreed, vervollständige aber den gebrauchsfertigen Code:

(Server benötigen)
(wenn (und (> = emacs-major-version 23)
           (gleiches Fenstersystem 'w32))
  (defun server-sure-safe-dir (dir) "Noop" t)); Fehler "Verzeichnis unterdrücken
                                                 ;; ~ / .emacs.d / server ist unsicher "
                                                 ;; auf Windows.
(Server-Start)

Ich habe dieses Problem in meinem Blog-Artikel http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html behoben

Beachten Sie auch, dass in 2009-09-19 der Fehler Nr. 4197 über Server-Enhant-Safe-Dir behoben wurde, sodass diese Problemumgehung in eingehenden Emacs 23.2 nicht erforderlich ist.

Unter kürzlich veröffentlichten Emacs 23.2 habe ich eine solche Warnung:

Warnung (Server): ~/.emacs.d/serverZum Speichern von Emacs-Server-Authentifizierungsdateien. Verzeichnisse auf FAT32-Dateisystemen sind NICHT manipulationssicher. Siehe Variable server-auth-dirfür Details.

Um dies als Warnung zu beheben, können Sie das Server-Auth-Verzeichnis auf die NTFS-Partition verweisen ( %APPDATA%normalerweise Windows %SYSTEMDRIVE%und Benutzer formatieren das Systemlaufwerk normalerweise als NTFS-Partition):

(Server benötigen)
(when (und (eq window-system 'w32) (Datei existiert-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(Server-Start)
Gavenkoa
quelle
1
Mit Emacs23 und Windows Vista 64b wurde dies für mich behoben. Ohne den erforderlichen Server hat nicht funktioniert.
Mario F
1
Danke, das funktioniert bei mir unter Win7-64. Beachten Sie, dass Sie mit EmacsW32 den Server-Start weglassen können, da dies später erfolgt.
Harpo
1
Dies tritt immer noch in Emacs 23.3.1 auf, daher habe ich die Bedingung in <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </ code> geändert aber das muss aktualisiert werden, wenn dies nicht in 23.4 behoben ist .... Also, siehe den Kommentar unten von @ user160983, der die emacs-minor-Version ignoriert
djb
1
Wie ich auf der vorherigen Antwort kommentiert habe, besteht das Problem in Emacs 24, daher sollte die Bedingung (> = Emacs-Major-Version 24) sein
Mcheema
1
@mcheema Ich fixiere auf (>= emacs-major-version 23). Vielen Dank +1
Gavenkoa
14

Dies ist ein bekannter Emacs-Fehler unter Windows. Eine Problemumgehung besteht darin, diese Zeile in server-sure-safe-dir in server.el zu kommentieren. Dies gilt für die Byte-Neukompilierung nach der Änderung:

;; FIXME: Busted on Windows. 
;; (eql (nth 2 attrs) (user-uid)) 
brlcad
quelle
3
Ihre Lösung behebt mein Problem. Ich werde dies später weiter untersuchen und meine Ergebnisse hier hinzufügen. Vielen Dank!
λ Jonas Gorauskas
10

Um ein Hacken im lisp-Verzeichnis zu vermeiden, können Sie Ihren .emacs einfach Folgendes hinzufügen:

(require 'server) (and (>= emacs-major-version 23) (defun server-ensure-safe-dir (dir) "Noop" t))

lre
quelle
Ich hatte das obige Problem mit Emacs in Cygwin und der obige Befehl funktionierte.
MikeHoss
1
Das Problem tritt auch in Emacs 24 auf, daher wäre möglicherweise eine (> = Emacs-Major-Version 23) angemessen
Mcheema
Für mich unter Windows 7 mit Emacs 24 funktionierte dies nicht, bis ich die Zeile (require 'server)über dem Code
hinzufügte
Dies funktionierte jahrelang für mich, bis ich dies unter MacOS 10.14 (Mojave) verwendete. Zu diesem Zeitpunkt bricht es Magit (ich teile meine Init-Dateien auf allen Plattformen). Verwenden Sie die Antwort von gavenkoa oben, die auch die Einschränkung enthält, die Änderung auf Windows einzuschränken.
Steve Broberg
7

Außerdem soll der Server nicht im Batch-Modus gestartet werden. In meinen .emacs verwende ich daher

(defconst --batch-mode 
  (or noninteractive (member "--batch-mode" command-line-args))
  "True when running in batch-mode (--batch-mode command-line switch set).")

und dann

(unless --batch-mode
  (require 'server)
  (when (and (= emacs-major-version 23)
         (= emacs-minor-version 1)
         (equal window-system 'w32))
    ;; Suppress error "directory ~/.emacs.d/server is unsafe" on Windows.
    (defun server-ensure-safe-dir (dir) "Noop" t))
  (server-start))

Trotzdem ist die Serverfunktion launisch: Wird ausgelöst,server-start wenn das Verzeichnis % HOME% /. Emacs.d / server nicht vorhanden ist. Nacheinander startet Emacs nicht wieder! Die naheliegende Lösung besteht darin, das fehlende Verzeichnis zu erstellen und es erneut zu versuchen. Ich habe die Lösung irgendwo im Internet gefunden, kann mich aber wirklich nicht erinnern, wo. Der folgende Code wird seit Jahren erfolgreich auf mehreren meiner Windows-Computer ausgeführt:

(unless --batch-mode
  (require 'server)
  (when (and (= emacs-major-version 23)
         (= emacs-minor-version 1)
         (equal window-system 'w32))
    ;; Suppress error "directory ~/.emacs.d/server is unsafe" on Windows.
    (defun server-ensure-safe-dir (dir) "Noop" t))
  (condition-case nil
      (server-start)
    (error
     (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir)))
       (when (and server-use-tcp
          (not (file-accessible-directory-p server-dir)))
     (display-warning
      'server (format "Creating %S" server-dir) :warning)
     (make-directory server-dir t)
     (server-start))))
    )
  )

Dieser Code funktioniert auch, wenn Emacs von einem Stick ausgeführt wird.

Hoffe das hilft.

Andreas Spindler
quelle
Hallo! Dies funktioniert nicht unter Linux. Befehlszeilenargumente enthalten niemals mein Argument --batch. Dies funktioniert:(if (not noninteractive) (progn (require 'server) (server-start)))
Gaizka
OK danke. Also sollten wir --batch-modeals verfeinern (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Ich behebe es oben.
Andreas Spindler
6

Hat bei mir in Windows 7 nicht funktioniert.

Ich las stattdessen die Kommentare in server-sure-safe-dir und übernahm den Besitz für% APPDATA% forlder und Unterordner. Sie gehörten lokalen Administratoren, nicht mir.

Das hat geholfen!

KTa
quelle
1
Um dies zu erläutern: Stellen Sie sicher, dass das Verzeichnis% HOME% \. Emacs.d \ server Ihnen gehört und nicht der lokalen Administratorgruppe.
Kristopher Johnson
3

Sehr hilfreiche Antwort von Gavenkoa. Ich habe dieses Problem unter Emacs 24.1, Windows 2003.

Leider hat das Überschreiben des Servers "Sicherstellen des sicheren Verzeichnisses", um ein Noop zu werden, wie in Ihrem ersten Snippet vorgeschlagen, nicht in allen Situationen für mich funktioniert. Insbesondere funktionierte es nicht, wenn es angewendet wurde, bevor (Server-Start) mindestens einmal ausgeführt wurde, da bei der ersten Ausführung auch das Verzeichnis erstellt wurde , wenn es nicht vorhanden wäre. Mit der Noop-Version würde das Verzeichnis überhaupt nicht erstellt.

Die Problemumgehung, die für mich in dem Sinne funktioniert hat, dass die Fehlermeldung beseitigt wurde, während das Verzeichnis noch ordnungsgemäß erstellt wurde, war der folgende Code, der zuvor (Serverstart) in meine Emacs-Initialisierungsdatei eingefügt wurde. Es enthält Hinweise zum Server-Gewährleistungs-Sicherheits-Verzeichnis, um alle von dort aus aufgetretenen Fehler zu ignorieren. Löst nicht die Grundursache des Problems, aber gut genug für mich.

(defadvice server-ensure-safe-dir (around
                                   my-around-server-ensure-safe-dir
                                   activate)
  "Ignores any errors raised from server-ensure-safe-dir"
  (ignore-errors ad-do-it))
lbo
quelle
2

Der folgende Schritt funktioniert für mich: 1. Führen Sie den folgenden Code als .reg-Datei aus. Die Emacs Win-Version behandelt alle Werte in der Registrierung als Env Var.

[HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs]
"HOME"="C:/<your_emacs_home>"
"EMACS_SERVER_FILE"="C:/<your_emacs_home>/server/main_server"
"ALTERNATE_EDITOR"="C:/<your_emacs_loc>/bin/runemacs.exe"
  1. Fügen Sie Ihrer .emacs / init.el den folgenden Code hinzu. Der Schlüssel hier sollte "server-auth-dir" sein.
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

Durch die obigen Schritte funktioniert der Servermodus für mich korrekt und perfekt.

Jesse Peng
quelle
1

Falls dies gelegentlich Menschen trifft, hat meine Workstation gerade eine "Domänenmigration" durchlaufen, bei der jeder Datei auf der Box eine weitere Berechtigung hinzugefügt wurde. Dann wurde dieser Fehler angezeigt. Nachdem ich den Ausdruck zum Dummy-out "server-sure-safe-dir" hinzugefügt hatte, schlug dies fehl.

(Wenn Sie sich fragen, erfolgt die Migration in 2-3 Schritten. Der erste fügt die Berechtigung für mich in der Zieldomäne hinzu, dann werde ich in die Zieldomäne verschoben, dann möglicherweise (ich bin mir nicht sicher ) Entfernen Sie die Berechtigung für die alte Domain. Es ist ein großes Unternehmen und viele Benutzer, daher tun sie dies in separaten Schritten.)

David M. Karr
quelle
1

Als ich es das letzte Mal versuchte, erledigte die Shell-Erweiterung "Take Ownership" den Job

SchlaflosigkeitSalz
quelle
1

Wenn RealityMonster das Problem mit dem Besitz des Serverordners festgestellt hat, können Sie es an der Windows-Eingabeaufforderung ausführen, um es zu beheben:

takeown /f %USERPROFILE%\.emacs.d\server /r /d y
Sam Hasler
quelle
Dies ist die einzige Antwort, die bei mir wirklich funktioniert hat (Windows 10 und Emacs 27.0.50). Vielen Dank.
gsl