windows emacs elisp dot-emacs server-mode

windows - Emacs-Error al llamar(inicio del servidor)



elisp dot-emacs (11)

Actualmente estoy usando GNU Emacs 23.0.93.1 en Windows Vista SP1. En mi archivo .emacs hago una llamada a (server-start) y eso está causando un error con el mensaje El directorio ~ / .emacs.d / server no es seguro . ¿Alguien ha visto esto y conoce una solución o una solución alternativa? ... aparte de dejar el servidor apagado;)

Aquí está el rastro de la pila:

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)


Además, no desea que el servidor se inicie en modo por lotes. En mi .emacs , por lo tanto uso

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

y entonces

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

Aún así, la característica del servidor es caprichosa: server-start del servidor se produce cuando el directorio % HOME% /. Emacs.d / server no existe. ¡En sucesión, Emacs no volverá a comenzar! La solución obvia es crear el directorio que falta e intentar nuevamente; Encontré la solución en algún lugar de la red, pero realmente no recuerdo dónde. El siguiente código se ejecuta satisfactoriamente desde hace años en varias de mis máquinas con Windows:

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

Este código también funciona cuando se ejecuta Emacs desde un dispositivo.

Espero que esto ayude.


El paso siguiente funciona para mí: 1. Ejecute el siguiente código como archivo .reg. La versión de Emacs win tratará cualquier valor en el registro como 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. Agregue el código a continuación a su .emacs / init.el. La clave aquí debería ser "server-auth-dir".

(require ''server) (setq server-auth-dir "~/server") ;;Server file location (setq server-name "main_server") ;;Server mutex file name (server-start)

Por los pasos anteriores, el modo servidor funciona para mí de manera correcta y perfecta.


En caso de que ocasionalmente llegue a las personas, mi estación de trabajo acaba de pasar por una "migración de dominio", que agregó otro permiso a cada archivo en el cuadro, luego comencé a recibir este error. Después de que agregué la expresión a dummy out "server-ensure-safe-dir" esto dejó de funcionar.

(Si te estás preguntando, la migración será en 2-3 pasos. La primera me agrega el permiso en el dominio de destino, luego me mueven al dominio de destino, luego pueden (no estoy seguro de esto) ) eliminar el permiso para el antiguo dominio. Es una gran empresa y muchos usuarios, por lo que lo hacen en pasos separados).


Encontré esta solución en EmacsWiki:

"El problema es la propiedad del directorio ~ / .emacs.d / server cuando también tiene derechos de" Administradores "en su cuenta. Cree el directorio ~ / .emacs.d / server y configure el propietario de este directorio para su inicio de sesión nombre y el problema se ha ido. Como tengo una versión "holandesa" de Windows 7, no conozco los términos en inglés exactamente, pero aquí está el procedimiento:

Haga clic en el mouse R en ~ / .emacs.d / server y seleccione "Propiedades" (último elemento en el menú). En Propiedades, seleccione la pestaña "Seguridad" y luego seleccione el botón "Avanzado". A continuación, seleccione la pestaña "Propietario" y cambie el propietario de Administrators (<your-pc-name>/Administrators) en <your-login-name> (<your-pc-name>/<your-login-name> . Ahora el código del servidor aceptará este directorio como seguro porque usted es el propietario.

Espero que esto ayude a todos ustedes, de todos modos resolvió el problema para mí.

WKR Reutefleut "

Definitivamente funciona en Vista, con Emacs 23.2.1.


Este es un error conocido de Emacs en Windows. Una solución alternativa es comentar esta línea en server-ensure-safe-dir en server.el la que querrá compilar byte recompile después del cambio:

;; FIXME: Busted on Windows. ;; (eql (nth 2 attrs) (user-uid))


La última vez que lo intenté, la extensión de shell "Take ownership" hizo el trabajo


Me gusta mucho el código larsreed, pero el código listo para usar:

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

Descargo este tema en mi artículo de blog http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

También tenga en cuenta que en 2009-09-19 se corrigió el error # 4197 sobre server-ensure-safe-dir, por lo que en el Emacs 23.2 entrante no se necesita esta solución.

Bajo el lanzamiento reciente de Emacs 23.2 tengo tal advertencia:

Advertencia (servidor): utilizando ~/.emacs.d/server para almacenar los archivos de autenticación del servidor Emacs. Los directorios en los sistemas de archivos FAT32 NO son seguros contra la manipulación. Ver la variable server-auth-dir para más detalles.

Para solucionar esto, como advertencia, puede apuntar server-auth-dir a la partición NTFS ( %APPDATA% normalmente ubicado en Windows %SYSTEMDRIVE% y el usuario generalmente formatea la unidad del sistema como partición NTFS):

(require ''server) (when (and (eq window-system ''w32) (file-exists-p (getenv "APPDATA"))) (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server")) (make-directory server-auth-dir) ) (server-start)


No funcionó para mí en Windows 7.

En su lugar, leí los comentarios en server-ensure-safe-dir y procedí a tomar la propiedad de% APPDATA% forlder y subcarpetas. Fueron propiedad de los administradores locales, no de mí.

¡Eso ayudó!


Para evitar piratear el directorio lisp, puede agregar lo siguiente a su .emacs:

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


Respuesta muy útil de gavenkoa. Estoy teniendo este problema en Emacs 24.1, Windows 2003.

Desafortunadamente, reemplazar el servidor-asegurar-seguro-dir para que se convierta en un noop, como se sugirió en su primer fragmento, no funcionó para mí en todas las situaciones. Específicamente, no funcionó cuando se aplicó antes (inicio del servidor) se había ejecutado al menos una vez, porque la ejecución inicial también crearía el directorio , si no existe. Con la versión de Noop, el directorio no se crearía en absoluto.

La solución alternativa que funcionó para mí en el sentido de que eliminó el mensaje de error, mientras aún creaba el directorio correctamente, era el siguiente código, puesto antes (inicio del servidor) en mi archivo de inicialización de Emacs. Pone un consejo sobre server-ensure-safe-dir para ignorar cualquier error que surja de allí. No resuelve la causa raíz del problema, pero es lo suficientemente bueno para mí.

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


Si es el problema de propiedad de la carpeta del servidor que identificó RealityMonster, puede ejecutarlo en el indicador de comando de Windows para corregirlo:

takeown /f %USERPROFILE%/.emacs.d/server /r /d y