代码之家  ›  专栏  ›  技术社区  ›  λ Jonas Gorauskas

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

  •  79
  • λ Jonas Gorauskas  · 技术社区  · 15 年前

    我目前正在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 回复  |  直到 7 年前
        1
  •  144
  •   Justin M. Keyes    10 年前

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

    “问题在于目录~/.emacs.d/server的所有权,而您的帐户上也有__administrators_权限。创建目录~/.emacs.d/server并将此目录的所有者设置为您的登录名,问题就消失了。由于我有Windows 7的__荷兰语_版本,我不清楚英文术语,但这里的程序是:

    在~/.emacs.d/server上单击鼠标右键,然后选择__properties_(菜单中的最后一项)。从属性中选择选项卡__security_,然后选择按钮__advanced_。然后选择选项卡__owner_157;并将owner从 Administrators (<your-pc-name>\Administrators) 进入之内 <your-login-name> (<your-pc-name>\<your-login-name> . 现在服务器代码将接受此目录作为安全目录,因为您是所有者。

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

    W.K.R.Reutefleut“

    它绝对适用于Vista,Emacs23.2.1。

        2
  •  28
  •   gavenkoa    11 年前

    我喜欢Larsreed,但Compalite代码随时可用:

    (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中,修复了有关服务器的错误4197,确保了目录的安全性,因此在传入的emacs 23.2中,不需要这种解决方法。

    根据最近发布的Emacs23.2,我有这样的警告:

    警告(服务器):使用 ~/.emacs.d/server 存储Emacs服务器身份验证文件。 FAT32文件系统上的目录不受篡改的保护。 参阅变量 server-auth-dir 详情。

    要解决这个问题,如警告,您可以将server auth dir指向ntfs分区( %APPDATA% 通常安装的窗户 %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)
    
        3
  •  14
  •   brlcad    15 年前

    这是Windows上已知的Emacs错误。解决方法是在 server确保server.el中的safe dir更改后要重新编译字节:

    ;; FIXME: Busted on Windows. 
    ;; (eql (nth 2 attrs) (user-uid)) 
    
        4
  •  10
  •   MostlyHarmless    10 年前

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

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

        5
  •  7
  •   Andreas Spindler    12 年前

    另外,您不希望服务器以批处理模式启动。 在我的 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/服务器 目录不存在。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时,此代码也有效。

    希望这有帮助。

        6
  •  6
  •   KTa    14 年前

    在Windows7中不适用于我。

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

    这有帮助!

        7
  •  3
  •   lbo    11 年前

    加文科的回答很有帮助。我在Emacs24.1Windows2003上遇到了这个问题。

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

    对于我来说,解决方法可以消除错误消息,同时仍然正确地创建目录,它是以下代码,放在我的emacs初始化文件中(服务器启动)之前。它在服务器上给出了一个建议,确保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
  •  1
  •   David M. Karr    14 年前

    如果偶尔有人遇到这种情况,我的工作站刚刚进行了一次“域迁移”,它向框中的每个文件添加了另一个权限,然后我开始得到这个错误。在我将表达式添加到虚拟的“server-secure-dir”之后,这就停止了失败。

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

        9
  •  1
  •   insomniaSalt    13 年前

    上次我试过的时候,“取得所有权”的外壳扩展完成了任务

        10
  •  1
  •   Jesse Peng    10 年前

    以下步骤适用于我: 1。将下面的代码作为.reg文件执行。EmacsWin版本将把注册表中的任何值视为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)
    

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

        11
  •  0
  •   Sam Hasler    7 年前

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

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