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

时间:2009-05-20 01:35:45

标签: windows emacs elisp dot-emacs server-mode

我目前在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)

11 个答案:

答案 0 :(得分:144)

我在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>。现在,服务器代码将接受此目录为安全,因为您是所有者。

希望这对你们所有人都有帮助,无论如何它为我解决了这个问题。

W.K.R。 Reutefleut“

它绝对适用于Vista,使用Emacs 23.2.1。

答案 1 :(得分:29)

我很喜欢larsreed,但是可以使用complite代码:

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

我在我的博客文章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分区):

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

答案 2 :(得分:14)

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

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

答案 3 :(得分:10)

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

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

答案 4 :(得分: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))

%HOME%/。emacs.d / server 目录不存在时,服务器功能仍然是反复无常的:server-start抛出。 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时也有效。

希望这有帮助。

答案 5 :(得分:6)

在Windows 7中对我不起作用。

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

这有帮助!

答案 6 :(得分:3)

来自gavenkoa的非常有用的答案。我在Emacs 24.1,Windows 2003上遇到了这个问题。

不幸的是,如第一个代码段所示,覆盖server-ensure-safe-dir成为noop,在所有情况下都不适用于我。具体来说,在应用之前(服务器启动)至少执行一次后,它不起作用,因为初始执行也会创建目录,如果它不存在。使用noop版本,根本不会创建目录。

在我正确创建目录的同时消除错误消息的意义上的解决方法是以下代码,在我的Emacs初始化文件中放入(server-start)之前。它围绕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))

答案 7 :(得分:1)

如果偶尔遇到这些人,我的工作站只是进行了“域迁移”,它为盒子上的每个文件添加了另一个权限,然后我开始收到此错误。在我将表达式添加到虚拟输出“server-ensure-safe-dir”之后,这停止了失败。

(如果您想知道,迁移将分为2-3步。第一个在目标域中为我添加权限,然后我被移动到目标域,然后他们可能(我不是确定这一点)删除旧域的权限。它是一个大公司,许多用户,所以他们分别在不同的步骤中。)

答案 8 :(得分:1)

上次我尝试过,“取得所有权”shell扩展完成了这项工作

答案 9 :(得分:1)

以下步骤对我有用: 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中。这里的关键应该是&#34; server-auth-dir&#34;。
  2. (require 'server)
    (setq server-auth-dir "~/server")  ;;Server file location
    (setq server-name "main_server")   ;;Server mutex file name
    (server-start)
    

    通过上述步骤,服务器模式对我来说正确而完美。

答案 10 :(得分:1)

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

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