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

Windows Emacs-调用时出错(服务器启动),windows,emacs,elisp,dot-emacs,server-mode,Windows,Emacs,Elisp,Dot Emacs,Server Mode,我目前正在Windows Vista SP1中使用GNU Emacs 23.0.93.1。在我的.emacs文件中,我调用了(服务器启动),这导致了一个错误消息~/.emacs.d/server目录不安全。是否有人看到了这一点,并知道修复或解决方法。。。不关闭服务器;) 以下是堆栈跟踪: Debugger entered--Lisp error: (error "The directory ~/.emacs.d/server is unsafe") signal(error ("The di

我目前正在Windows Vista SP1中使用GNU Emacs 23.0.93.1。在我的.emacs文件中,我调用了
(服务器启动)
,这导致了一个错误消息~/.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)

这是Windows上已知的Emacs错误。解决方法是在中注释掉这一行 服务器确保server.el中的safe dir在更改后需要重新编译字节:

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

要避免在lisp目录中进行黑客攻击,只需将以下内容添加到.emacs:

(需要“服务器”)
(和(>=emacs主要版本23)

(defun server sure safe dir(dir)“Noop”t))

我很喜欢larsreed的anwer,但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)
在Windows 7中不适用于我

相反,我阅读了server Survey safe dir中的注释,并继续获取文件夹和子文件夹的%APPDATA%的所有权。它们是本地管理员的,不是我的


那有帮助

我在EmacsWiki上找到了这个解决方案:

“问题是~/.emacs.d/server目录的所有权,而您的帐户也具有“管理员”权限。创建~/.emacs.d/server目录,并将此目录的所有者设置为您的登录名,问题就消失了。因为我有一个“荷兰语”Windows 7的版本我不知道确切的英文术语,但以下是程序:

在~/.emacs.d/server上单击鼠标右键并选择“属性”(菜单中的最后一项)。从属性中选择选项卡“安全性”,然后选择按钮“高级”。然后选择选项卡“所有者”,并将所有者从
管理员(\Administrators)
更改为
(\
。现在服务器代码将接受此目录作为安全目录,因为您是所有者

希望这对你们所有人都有帮助,不管怎样,它解决了我的问题

W.K.R.鲁特弗勒特“


它肯定能在Vista上运行,使用Emacs 23.2.1。

如果偶尔有人会遇到这种情况,我的工作站只是经历了一次“域迁移”,它为该框中的每个文件添加了另一个权限,然后我开始出现此错误。在我添加表达式以伪造“服务器确保安全目录”后,此操作停止失败


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

上次我尝试时,“获取所有权”shell扩展完成了任务

此外,您不希望服务器以批处理模式启动。 因此,我在.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时,此代码也起作用


希望这有帮助。

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

不幸的是,正如您在第一个代码片段中所建议的那样,重写server Survey dir以使其成为noop并不是在所有情况下都适用于我。具体地说,在之前(服务器启动)应用时它不起作用至少执行了一次,因为如果目录不存在,初始执行也会创建目录。对于noop版本,根本不会创建目录

对于我来说,在正确创建目录的同时消除了错误消息的解决方法是将以下代码放在(服务器启动)之前在我的Emacs初始化文件中。它在server sure 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))
下面的步骤对我很有用: 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"

通过以上步骤,服务器模式对我来说是正确和完美的。

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

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

您的解决方案解决了我的问题。我稍后将对此进行进一步调查,并在此处添加我的发现。谢谢!我在Cygwin中遇到了上述Emacs问题,并且上述命令正常工作。该问题也出现在Emacs 24中,因此可能是(>=Emacs主版本23)对于我来说,在使用Emacs 24的Windows 7上是合适的。直到我在代码上方添加了一行
(require'server)
,这才起作用。在我在MacOS 10.14(Mojave)上使用这行代码之前,我已经工作了多年,在这一点上它破坏了magit(我在所有平台上共享我的init文件)。使用上面gavenkoa的答案,其中还包括限制对Windows的更改的约束。使用emacs23和Windows vista 64b,这为我解决了问题。如果没有必需的服务器,则无法工作。谢谢,这在Win7-64上对我有效。请注意,使用EmacsW32,您可以省去服务器启动,因为稍后会这样做。在Emacs 2中仍然会发生这种情况3.3.1因此,我将条件更改为
(=emacs主要版本23)(>=emacs次要版本1)(正如我在前面的回答中所评论的,问题存在于emacs 24中,因此条件应为(>=emacs主要版本24)@mcheema I fix为
(>=emacs主要版本23)
。感谢+1详细说明:确保目录%HOME%\.emacs.d\server归您所有,而不是由本地管理员组所有。修复了它!我希望此评论具有更高的google ranki
takeown /f %USERPROFILE%\.emacs.d\server /r /d y