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

我目前在Windows Vista SP1中使用GNU Emacs 23.0.93.1。 在我的.emacs文件中,我打电话给(server-start) ,这是导致与消息目录〜/ .emacs.d /服务器是不安全的 。 有没有人看到这个,知道一个修复或解决方法? …除了closures服务器以外)

这是堆栈跟踪:

 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) 

我在EmacsWiki上find了这个解决scheme:

“问题是当你的帐户拥有”pipe理员“权限时,目录〜/ .emacs.d /服务器的所有权。创build目录〜/ .emacs.d /服务器并将此目录的所有者设置为你的login名称和问题已经消失了,因为我有一个“荷兰语”版本的Windows 7,我不完全知道英文术语,但是这里的过程是:

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

希望这有助于你们所有人,无论如何,它解决了我的问题。

WKR Reutefleut“

它绝对适用于Vista,Emacs 23.2.1。

我喜欢放松,但complite准备使用的代码:

 (要求'服务器)
 (当(和(> = 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-server身份validation文件。 在FAT32文件系统上的目录是不安全的篡改。 有关详细信息,请参阅variablesserver-auth-dir

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

 (要求'服务器)
 (当(和(eq窗口系统'w32)(file-exists-p(getenv“APPDATA”)))
   (setq server-auth-dir(concat(getenv“APPDATA”)“/.emacs.d/server”))
   (make-directory server-auth-dir))
 (服务器启动)

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

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

为了避免在lisp目录中发生黑客攻击,您可以将以下内容添加到.emacs中:

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

另外,您不希望服务器以批处理模式启动。 因此,我使用.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)) 

仍然服务器function是反复无常的:当%HOME%/。emacs.d /服务器目录不存在时, server-start引发。 接下来Emacs将不会再启动! 显而易见的解决scheme是创build丢失的目录并重试; 我发现网上的解决scheme,但真的不记得在哪里。 以下代码现在可以在几台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时,这个代码也可以工作。

希望这可以帮助。

在Windows 7中没有为我工作。

我改为读取server-ensure-safe-dir中的注释,然后继续为%1和子文件夹获取%APPDATA%的所有权。 他们由当地的pipe理员拥有,而不是由我。

这有帮助!

gavenkoa非常有帮助的回答。 我在Emacs 24.1,Windows 2003上遇到这个问题。

不幸的是,覆盖服务器确保安全目录成为一个noop,如你的第一个片段中所build议的,在任何情况下都不适用于我。 具体来说,在(server-start)执行至less执行一次之前,它不起作用,因为初始执​​行也会创build目录 (如果不存在)。 使用noop版本,根本不会创build目录。

在我的Emacs初始化文件中,在(server-start)之前放置了下面的代码,它在消除错误消息的同时还能正确创build目录。 它提供了一个围绕server-ensure-safe-dir的build议来忽略从那里引发的任何错误。 没有解决问题的根本原因,但对我来说足够好。

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

如果偶尔碰到人,我的工作站刚刚经历了一个“域迁移”,这个迁移又增加了另一个权限,然后我开始出现这个错误。 在我将expression式添加到“server-ensure-safe-dir”之后,这个停止失败。

(如果你想知道,这个迁移将会在2-3个步骤中完成,第一个在目标域中添加我的权限,然后移动到目标域,然后他们可能(我不确定这个)删除旧域的权限,这是一个大公司,还有很多用户,所以他们分开来做)。

上次我试了一下,“Take ownership”shell extension做了这个工作

下面的步骤对我有用:1.以.reg文件的forms执行下面的代码。 Emacs win版本会将registry中的任何值视为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) 

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

如果这是RealityMonster标识的服务器文件夹所有权问题,那么您可以在Windows命令提示符下运行以解决此问题:

 takeown /f %USERPROFILE%\.emacs.d\server /r /dy 
Interesting Posts