Emacs - Error al llamar (inicio del servidor)

82

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 sabe una solución o solución? ... además de dejar el servidor apagado;)

Aquí está el seguimiento 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)
λ Jonas Gorauskas
fuente
1
Tuve un error similar al iniciar Emacs en una caja Unix; esto resultó ser porque mantengo mi ~ / .emacs.d en Subversion, y al finalizar la compra, el svncliente configuró ~ / .emacs.d / server en 0755 según mi umask. En lugar de incluir svnun script de shell, que frustra el propósito de tener todo lo que necesito para personalizar Emacs en vivo en Subversion, solo hago que Emacs fuerce los permisos correctos cuando se inicia, agregando lo siguiente a ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller

Respuestas:

151

Encontré esta solución en EmacsWiki:

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

Haga clic con el botón derecho del mouse en ~ / .emacs.d / server y seleccione "Propiedades" (último elemento del menú). Desde Propiedades seleccione la pestaña “Seguridad” y luego seleccione el botón “Avanzado”. Luego seleccione la pestaña "Propietario" y cambie el propietario de Administrators (<your-pc-name>\Administrators)a <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, me resolvió el problema de todos modos.

WKR Reutefleut "

Definitivamente funciona en Vista, con Emacs 23.2.1.

RealidadMonstruo
fuente
3
¡Arreglado! Desearía que este comentario tuviera un ranking de Google más alto y también debería ser la respuesta a esta pregunta.
Drew
También se solucionó el problema en Windows 7. De bash, $ chown -R "$ {USER}" ~ / .emacs.d
luke h
Funciona en spacemacs [email protected] (por lo tanto, también debería funcionar en emacs simple 25.1.1).
Gemantzu
chmod 700 también está bien.
Netawater
29

Disfruto de responder de larsreed, pero el código completo está listo para usar:

(requiere 'servidor)
(cuando (y (> = emacs-major-version 23)
           (sistema de ventanas igual 'w32))
  (defun servidor-asegurar-seguro-dir (dir) "Noop" t)); Suprimir directorio de errores
                                                 ; ~ / .emacs.d / server no es seguro "
                                                 ; en las ventanas.
(inicio del servidor)

Discuto este problema 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-verify-safe-dir, por lo que en Emacs 23.2 entrante esta solución no es necesaria.

Bajo Emacs 23.2 recientemente lanzado tengo tal advertencia:

Advertencia (servidor): se usa ~/.emacs.d/serverpara almacenar archivos de autenticación del servidor Emacs. Los directorios en los sistemas de archivos FAT32 NO son seguros contra la manipulación. Consulte la variable server-auth-dirpara obtener más detalles.

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

(requiere 'servidor)
(cuando (y (eq window-system 'w32) (archivo-existe-p (getenv "APPDATA")))
  (setq servidor-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (directorio de creación de servidor-auth-dir))
(inicio del servidor)
Gavenkoa
fuente
1
usando emacs23 y windows vista 64b, esto me lo arregló. Sin el servidor requerido no funcionó.
Mario F
1
Gracias, esto me funciona en Win7-64. Tenga en cuenta que con EmacsW32 puede omitir el inicio del servidor, ya que lo hará más tarde.
harpo
1
Esto todavía ocurre en Emacs 23.3.1 así que cambié la condición a <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </code> pero que será necesario actualizar si esto no se fija en el 23,4 .... por lo tanto, ver el comentario abajo por @ user160983 que ignora el emacs-minor-version
djb
1
como comenté en la respuesta anterior, el problema existe en emacs 24, por lo que el condicional debería ser (> = emacs-major-version 24)
mcheema
1
@mcheema me fijo (>= emacs-major-version 23). Gracias +1
gavenkoa
14

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

;; FIXME: Busted on Windows. 
;; (eql (nth 2 attrs) (user-uid)) 
brlcad
fuente
3
Tu solución soluciona mi problema. Investigaré esto más adelante y agregaré mis hallazgos aquí. ¡Gracias!
λ Jonas Gorauskas
10

Para evitar la piratería en 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))

lre
fuente
Tuve el problema anterior con Emacs en Cygwin y el comando anterior funcionó.
MikeHoss
1
el problema también ocurre en emacs 24, por lo que tal vez sea apropiado un (> = emacs-major-version 23)
mcheema
para mí en Windows 7 con Emacs 24, esto no funcionó hasta que agregué la línea (require 'server)sobre el código
MostlyHarmless
Esto funcionó para mí durante años hasta que lo usé en MacOS 10.14 (Mojave), momento en el que se rompe magit (comparto mis archivos de inicio en todas las plataformas). Use la respuesta de gavenkoa anterior que también incluye la restricción para restringir el cambio a Windows.
Steve Broberg
7

Además, no desea que el servidor se inicie en modo por lotes. En mi .emacs 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 función del servidor es caprichosa: se server-startlanza cuando el directorio % HOME% /. Emacs.d / server no existe. ¡En sucesión, Emacs no se iniciará de nuevo! La solución obvia es crear el directorio que falta y volver a intentarlo; Encontré la solución en algún lugar de la red, pero realmente no recuerdo dónde. El siguiente código se ejecuta con éxito durante 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.

Andreas Spindler
fuente
¡Hola! Esto no funciona en Linux. command-line-args nunca incluye mi argumento --batch. Esto funciona:(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka
OK gracias. Entonces deberíamos refinar --batch-modecomo (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Lo arreglo arriba.
Andreas Spindler
6

No funcionó para mí en Windows 7.

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

¡Eso ayudó!

KTa
fuente
1
Para más detalles: asegúrese de que el directorio% HOME% \. Emacs.d \ server sea de su propiedad, no del grupo de administradores local.
Kristopher Johnson
3

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

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

La solución que funcionó para mí en el sentido de que eliminó el mensaje de error, mientras seguía creando el directorio correctamente, fue el siguiente código, colocado antes (inicio del servidor) en mi archivo de inicialización de Emacs. Pone un consejo en torno al directorio seguro seguro del servidor para ignorar cualquier error que surja desde 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))
lbo
fuente
2

El siguiente paso me funciona: 1. Ejecute el código siguiente como archivo .reg. La versión win de Emacs 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 de servidor me funciona correctamente y perfecto.

Jesse Peng
fuente
1

En caso de que esto afecte ocasionalmente a las personas, mi estación de trabajo simplemente pasó por una "migración de dominio", que agregó otro permiso a cada archivo en la caja, luego comencé a recibir este error. Después de que agregué la expresión al "servidor-asegura-seguro-dir", esto dejó de fallar.

(Si se está preguntando, la migración se realizará en 2-3 pasos. El primero agrega el permiso para mí en el dominio de destino, luego me mueven al dominio de destino, luego podrían (no estoy seguro de esto ) eliminan el permiso para el dominio anterior. Es una gran empresa y muchos usuarios, por lo que lo están haciendo en pasos separados).

David M. Karr
fuente
1

la última vez que lo intenté, la extensión de shell "Tomar posesión" funcionó

insomnio Sal
fuente
1

Si se trata del problema de propiedad de la carpeta del servidor que identificó RealityMonster, puede ejecutarlo en el símbolo del sistema de Windows para solucionarlo:

takeown /f %USERPROFILE%\.emacs.d\server /r /d y
Sam Hasler
fuente
Esta es la única respuesta que realmente funcionó para mí (Windows 10 y Emacs 27.0.50). Gracias.
gsl