Emacs - 调用时出错(服务器启动)
Posted
技术标签:
【中文标题】Emacs - 调用时出错(服务器启动)【英文标题】:Emacs - Error when calling (server-start) 【发布时间】:2010-10-27 12:19:12 【问题描述】:我目前在 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)
【问题讨论】:
我在 Unix 机器上启动 Emacs 时遇到了类似的错误;这原来是因为我将我的 ~/.emacs.d 保存在 Subversion 中,并且在结帐时svn
客户端根据我的 umask 将 ~/.emacs.d/server 设置为 0755。我没有将 svn
包装在 shell 脚本中,这违背了让我在 Subversion 中自定义 Emacs 所需的一切的目的,我只是让 Emacs 在启动时强制正确的权限,方法是将以下内容添加到 ~/.emacs.d/init.el
:@ 987654326@
【参考方案1】:
我在 EmacsWiki 上找到了这个解决方案:
“问题是目录 ~/.emacs.d/server 的所有权,而您的帐户也拥有“管理员”权限。创建目录 ~/.emacs.d/server 并设置该目录的所有者到您的登录名,问题就消失了。因为我有一个“荷兰语”版本的 Windows 7,所以我不知道确切的英文术语,但程序如下:
在 ~/.emacs.d/server 上单击 R 鼠标并选择“属性”(菜单中的最后一项)。从“属性”中选择“安全”选项卡,然后选择“高级”按钮。然后选择“所有者”选项卡并将所有者从Administrators (<your-pc-name>\Administrators)
更改为<your-login-name> (<your-pc-name>\<your-login-name>
。现在服务器代码将接受此目录作为安全目录,因为您是所有者。
希望这对你们所有人都有帮助,无论如何它为我解决了问题。
W.K.R.罗特弗勒特”
它绝对适用于带有 Emacs 23.2.1 的 Vista。
【讨论】:
修复了!我希望这条评论有更高的谷歌排名,它也应该是这个问题的答案。 也修复了 Windows 7 上的问题。从 bash,$ chown -R "$USER" ~/.emacs.d 它适用于 spacemacs 0.200.1@25.1.1(因此它也应该适用于普通的 emacs 25.1.1)。 chmod 700 也可以。【参考方案2】:我喜欢回答 larsreed,但可以使用复杂的代码:
(需要'服务器) (当(和(> = emacs-major-version 23) (等于窗口系统'w32)) (defun server-ensure-safe-dir (dir) "Noop" t)) ;抑制错误“目录 ; ~/.emacs.d/server 不安全” ;在窗户上。 (服务器启动)我在我的博客文章http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html中讨论了这个问题
另请注意,在 2009 年 9 月 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 分区):
【讨论】:
使用 emacs23 和 windows vista 64b,这为我修复了它。没有 require 服务器就无法工作。 谢谢,这适用于我在 Win7-64 上。请注意,使用 EmacsW32 您可以省略 server-start,因为稍后会这样做。 这仍然发生在 Emacs 23.3.1 所以我将条件更改为 (= emacs-major-version 23) (>= emacs-minor-version 1) ( 但如果在 23.4 中未修复,则需要更新 .... 因此,请参阅下面 @user160983 的评论,它忽略了 emacs-minor-version
正如我之前评论的那样,问题存在于 emacs 24 中,因此条件应该是 (>= emacs-major-version 24)
@mcheema 我固定为(>= emacs-major-version 23)
。谢谢+1【参考方案3】:
这是 Windows 上一个已知的 Emacs 错误。一种解决方法是注释掉这一行 server.el 中的 server-ensure-safe-dir ,您需要在更改后重新编译字节:
;; FIXME: Busted on Windows.
;; (eql (nth 2 attrs) (user-uid))
【讨论】:
您的解决方案解决了我的问题。稍后我将对此进行进一步调查,并在此处添加我的发现。谢谢!【参考方案4】:为避免在 lisp 目录中被黑客入侵,您只需将以下内容添加到您的 .emacs 中:
(require 'server)
(and (>= emacs-major-version 23)
(defun server-ensure-safe-dir (dir) "Noop" t))
【讨论】:
我在 Cygwin 中遇到了 Emacs 的上述问题,并且上述命令有效。 该问题也出现在 emacs 24 中,因此 (>= emacs-major-version 23) 可能是合适的 对我来说,在带有 Emacs 24 的 Windows 7 上,这直到我在代码上方添加了(require 'server)
行之后才起作用
这对我有用多年,直到我在 MacOS 10.14 (Mojave) 上使用它,此时它破坏了 magit(我在所有平台上共享我的 init 文件)。使用上面 givenkoa 的答案,其中还包括限制对 Windows 的更改的约束。【参考方案5】:
此外,您不希望服务器以批处理模式启动。 因此,在我的 .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)))
好的,谢谢。那么我们应该将--batch-mode
细化为(defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args)))
。我在上面修复它。【参考方案6】:
在 Windows 7 中不适合我。
我改为阅读 server-ensure-safe-dir 中的 cmets 并继续获取 %APPDATA% forlder 和子文件夹的所有权。它们归本地管理员所有,而不是我。
这有帮助!
【讨论】:
详细说明:确保目录 %HOME%\.emacs.d\server 归您所有,而不是本地管理员组。【参考方案7】:givenkoa 提供了非常有帮助的答案。我在 Emacs 24.1、Windows 2003 上遇到了这个问题。
不幸的是,正如您在第一个 sn-p 中所建议的那样,将 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))
【讨论】:
【参考方案8】:如果是 RealityMonster 发现的服务器文件夹所有权问题,那么您可以在 windows 命令提示符下运行它来修复它:
takeown /f %USERPROFILE%\.emacs.d\server /r /d y
【讨论】:
这是唯一对我有用的答案(Windows 10 和 Emacs 27.0.50)。谢谢。【参考方案9】:以下步骤对我有用: 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"
-
将以下代码添加到您的 .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)
通过以上步骤,服务器模式对我来说正确且完美。
【讨论】:
【参考方案10】:万一这偶尔打到人,我的工作站刚刚经历了“域迁移”,这为盒子上的每个文件添加了另一个权限,然后我开始收到这个错误。在我将表达式添加到虚拟“server-ensure-safe-dir”之后,这停止了失败。
(如果您想知道,迁移将分 2-3 步。第一个在目标域中为我添加权限,然后我被移动到目标域,然后他们可能(我不是确定这一点)删除旧域的权限。这是一家大公司,有很多用户,所以他们分步进行。)
【讨论】:
【参考方案11】:我上次尝试时,“取得所有权”外壳扩展完成了这项工作
【讨论】:
以上是关于Emacs - 调用时出错(服务器启动)的主要内容,如果未能解决你的问题,请参考以下文章