Emacs-调用时出错(服务器启动)


82

我目前在Windows Vista SP1中使用GNU Emacs 23.0.93.1。在我的.emacs文件中,我打电话给(server-start),导致消息错误~~ ..emacs.d / server不安全。有没有人看过这个并且知道修复或解决方法?...除了关闭服务器电源以外;)

这是堆栈跟踪:

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)

1
在Unix机器上启动Emacs时,我遇到类似的错误;原来是因为我将〜/ .emacs.d保留在Subversion中,并且在签出后,svn客户端将每个umask的〜/ .emacs.d / server设置为0755。与其包装svn外壳脚本,这没有达到我在Subversion中自定义Emacs所需的一切目的,我只是让Emacs在启动时强制添加正确的权限,方法是~/.emacs.d/init.el(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller

Answers:


151

我在EmacsWiki上找到了以下解决方案:

“问题是您的帐户也具有“管理员”权限时,目录〜/ .emacs.d / server的所有权。创建目录〜/ .emacs.d / server并将此目录的所有者设置为登录名我已经有了Windows 7的“荷兰语”版本,我不知道确切的英语术语,但操作步骤如下:

单击〜/ .emacs.d / server上的R-mouse,然后选择“属性”(菜单中的最后一项)。从属性中选择“安全性”选项卡,然后选择“高级”按钮。然后选择“所有者”选项卡,并将所有者从更改Administrators (<your-pc-name>\Administrators)<your-login-name> (<your-pc-name>\<your-login-name>。现在,服务器代码将接受此目录为安全目录,因为您是所有者。

希望这对大家有帮助,无论如何,它为我解决了这个问题。

WKR Reutefleut”

它肯定可以在带有Emacs 23.2.1的Vista上运行。


3
固定它!我希望此评论在Google中的排名更高,并且也应该是该问题的答案。
德鲁

也修复了Windows 7上的问题。从bash中,$ chown -R“ $ {USER}”〜/ .emacs.d
luke h

它可以在spacemacs 0.200.1@25.1.1上运行(因此它也应该在普通emacs 25.1.1上运行)。
gemantzu '16

chmod 700也可以。
netawater

29

我很喜欢larsreed,但是可以使用复杂的代码:

(需要“服务器”)
(当(和(> = emacs-major-version 23)时
           (等于窗口系统'w32))
  (defun server-ensure-safe-dir(dir)“ Noop” t));抑制错误“目录
                                                 ; 〜/ .emacs.d /服务器不安全”
                                                 ; 在窗户上。
(服务器启动)

我在博客文章http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html中对此问题进行了讨论

另请注意,在2009-09-19中修复了有关server-ensure-safe-dir的错误#4197,因此在传入的Emacs 23.2中,不需要此解决方法。

在最近发布的Emacs 23.2下,我有这样的警告:

警告(服务器):~/.emacs.d/server用于存储Emacs服务器认证文件。FAT32文件系统上的目录无法防止篡改。有关server-auth-dir详细信息,请参见变量。

要解决此警告问题,您可以将server-auth-dir指向NTFS分区(%APPDATA%通常位于Windows上%SYSTEMDRIVE%,用户通常将系统驱动器格式化为NTFS分区):

(需要“服务器”)
(当(和(eq视窗系统'w32)(file-exists-p(getenv“ APPDATA”))时))
  (setq服务器身份验证目录(concat(getenv“ APPDATA”)“ /。emacs.d / server”))
  (制作目录server-auth-dir))
(服务器启动)

1
使用emacs23和Windows Vista 64b,这对我来说已修复。没有需求服务器就无法工作。
Mario F

1
谢谢,这对我在Win7-64上有效。请注意,使用EmacsW32,您可以省去服务器启动,因为稍后会这样做。
harpo 2011年

1
在Emacs 23.3.1中仍然会发生这种情况,因此我将条件更改为<code>(= emacs-major-version 23)(> = emacs-minor-version 1)(<= emacs-minor-version 3)</ code>但是如果在23.4中未解决此问题,则需要更新...。因此,请参阅@ user160983的以下注释,该注释将忽略emacs-minor-version
djb

1
正如我在较早答案中评论的那样,该问题存在于emacs 24中,因此条件应该为(> = emacs-major-version 24)
mcheema 2013年

1
我修复了@mcheema (>= emacs-major-version 23)。感谢+1
Givenkoa

14

这是Windows上已知的Emacs错误。一种解决方法是注释掉server.el中server-ensure-safe-dir中的这一行,更改后您要字节重新编译:

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

3
您的解决方案解决了我的问题。我将在以后对此进行进一步调查,并在此处添加我的发现。谢谢!
λ乔纳斯Gorauskas

10

为了避免在lisp目录中被黑客入侵,您只需将以下内容添加到.emacs中:

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


我在Cygwin中遇到了Emacs的上述问题,并且上述命令有效。
MikeHoss

1
该问题也发生在emacs 24中,所以也许(> = emacs-major-version 23)是合适的
mcheema 2013年

在使用Emacs 24的Windows 7上对我来说不起作用,直到我(require 'server)在代码上方添加了这一行
MostlyHarmless 2014年

这对我已经工作了好多年,直到我在MacOS 10.14(Mojave)上使用了它,这时它打破了混乱(我在所有平台上共享我的初始化文件)。使用上面的grantnkoa的答案,其中也包括将更改限制为Windows的约束。
史蒂夫·布罗伯格

7

此外,您不希望服务器以批处理模式启动。因此,在我的.emacs中,我使用

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

然后

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

服务器功能仍然是反复无常的:server-start%HOME%/。emacs.d / server目录不存在时抛出。相继Emacs将不会再次启动!显而易见的解决方案是创建丢失的目录,然后重试。我在网上某个地方找到了解决方案,但真的不记得在哪里。以下代码已在我的多台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))))
    )
  )

从摇杆运行Emacs时,此代码也适用。

希望这可以帮助。


嗨,您好!这在Linux上不起作用。命令行参数永远不会包含我的--batch参数。这有效:(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka 2012年

好,谢谢。因此,我们应该将细化--batch-mode(defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args)))。我在上面修好了。
Andreas Spindler 2012年

6

在Windows 7中对我不起作用。

我改为阅读server-ensure-safe-dir中的注释,然后继续获取%APPDATA%forlder和子文件夹的所有权。他们归本地管理员所有,而不是我所有。

有帮助!


1
详细说明:确保目录%HOME%\。emacs.d \ server由您拥有,而不是本地Administrators组拥有。
克里斯托弗·约翰逊

3

Givenkoa的回答很有帮助。我在Windows 2003的Emacs 24.1上遇到此问题。

不幸的是,如您在第一段代码中建议的那样,将server-ensure-safe-dir覆盖为noop并非在所有情况下都对我有用。具体来说,它在(server-start)至少执行一次之前应用时不起作用,因为初始执​​行还会创建目录(如果不存在)。使用noop版本时,将根本不会创建目录。

从某种意义上说,它对我有效的解决方法是消除了错误消息,同时仍然可以正确创建目录,但下面的代码则放在了Emacs初始化文件中的(服务器启动)之前。它围绕server-ensure-safe-dir提出了一个建议,以忽略那里提出的任何错误。不能解决问题的根本原因,但对我来说足够好了。

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

2

以下步骤对我有用:1.以.reg文件执行以下代码。Emacs Win版本会将注册表中的任何值都视为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. 将以下代码添加到您的.emacs / init.el。此处的密钥应为“ server-auth-dir”。
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

通过以上步骤,服务器模式对我而言正确而完美。


1

万一这偶尔引起人们的注意,我的工作站刚刚经历了“域迁移”,该迁移为盒子上的每个文件添加了另一个权限,然后我开始遇到此错误。在添加表达式以虚拟出“ server-ensure-safe-dir”后,这停止了失败。

(如果您想知道,迁移将在2-3个步骤中进行。第一个步骤将在目标域中为我添加权限,然后将我移至目标域,然后他们可能会(我不确定)删除旧域的权限。这是一家大公司,并且有许多用户,因此他们需要分步进行此操作。)


1

上一次我尝试使用“ Take owner” shell扩展来完成这项工作


1

如果是RealityMonster识别的服务器文件夹所有权问题,则可以在Windows命令提示符下运行此问题来修复此问题:

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

这是对我真正有效的唯一答案(Windows 10和Emacs 27.0.50)。谢谢。
gsl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.