Emacs - Ошибка при вызове (запуск сервера)

В настоящее время я использую GNU Emacs 23.0.93.1 в Windows Vista SP1. В моем файле.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 ответов

Решение

Я нашел это решение на EmacsWiki:

"Проблема заключается в том, что вы владеете каталогом ~/.emacs.d/server, если у вас также есть права" Администраторы "для вашей учетной записи. Создайте каталог ~/.emacs.d/server и установите для владельца этого каталога свой логин. название и проблема исчезла. Поскольку у меня есть "голландская" версия Windows 7, я точно не знаю английские термины, но вот процедура:

Нажмите R-мышь на ~/.emacs.d/server и выберите "Свойства" (последний пункт в меню). В Свойствах выберите вкладку "Безопасность", а затем нажмите кнопку "Дополнительно". Затем выберите вкладку "Владелец" и измените владельца с Administrators (<your-pc-name>\Administrators) в <your-login-name> (<your-pc-name>\<your-login-name>, Теперь код сервера примет этот каталог как безопасный, потому что вы являетесь его владельцем.

Надеюсь, это поможет всем вам, ребята, это все равно решило проблему для меня.

WKR Reutefleut "

Это определенно работает на Vista, с Emacs 23.2.1.

Мне нравится ответ на larsreed, но полный код готов к использованию:

(требуется сервер)
(когда (и (>= emacs-major-version 23)
           (равная оконная система 'w32))
  (defun server-sure-safe-dir (dir) "Noop" t)); Подавить ошибку "каталог; ~/.emacs.d/server небезопасен "; на окнах.
(Сервер-старт)

Я обсуждаю эту проблему в своей статье в блоге http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

Также обратите внимание, что в 2009-09-19 исправлена ​​ошибка № 4197 в server-sure-safe-dir, поэтому во входящем Emacs 23.2 этот обходной путь не требуется.

Под недавно выпущенным Emacs 23.2 у меня есть такое предупреждение:

Предупреждение (сервер): Использование ~/.emacs.d/server хранить файлы аутентификации Emacs-сервера. Каталоги в файловых системах FAT32 НЕ защищены от подделки. См переменная server-auth-dir для деталей.

Чтобы исправить это, как, скажем, предупреждение, вы можете указать server-auth-dir на раздел NTFS (%APPDATA% обычно расположенные окна %SYSTEMDRIVE% и пользователь обычно форматирует системный диск как раздел NTFS):

(требуется сервер)
(когда (и (eq window-system 'w32) (file-существующие-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(Сервер-старт)

Это известная ошибка Emacs в Windows. Обходной путь - закомментировать эту строку в server-sure-safe-dir в server.el, которую вы хотите перекомпилировать байтом после изменения:

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

Тем не менее, функция сервера капризна: 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 с флешки.

Надеюсь это поможет.

У меня не работало в Windows 7.

Вместо этого я прочитал комментарии в server-sure-safe-dir и приступил к приобретению прав владения для%APPDATA% forlder и вложенных папок. Они принадлежали местным администраторам, а не мне.

Это помогло!

Очень полезный ответ от gavenkoa. У меня эта проблема на Emacs 24.1, Windows 2003.

К сожалению, переопределение server-sure-safe-dir, чтобы стать noop, как предложено в вашем первом фрагменте, не сработало для меня во всех ситуациях. В частности, он не работал при применении до того, как (запуск сервера) был выполнен хотя бы один раз, потому что первоначальное выполнение также создало бы каталог, если он не существует. С версией noop каталог не будет создан вообще.

Обходной путь, который работал для меня в том смысле, что он устранял сообщение об ошибке, при этом создавая каталог должным образом, заключался в следующем коде, помещенном перед (server-start) в моем файле инициализации 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))

Если RealityMonster обнаружил проблему с владением папкой на сервере, вы можете запустить ее в командной строке Windows, чтобы исправить это:

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

У меня работает следующий шаг: 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. Ключ здесь должен быть "server-auth-dir".
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

По шагам выше серверный режим работает у меня правильно и безупречно.

На случай, если это случайно ударит по людям, моя рабочая станция только что прошла "миграцию домена", которая добавила другое разрешение для каждого файла на коробке, и я начал получать эту ошибку. После того, как я добавил выражение в dummy out "server-sure-safe-dir", это перестало работать.

(Если вам интересно, миграция будет происходить за 2-3 шага. Первый добавляет мне разрешение в целевом домене, затем я перемещаюсь в целевой домен, тогда они могут (я не уверен в этом) удалите разрешение для старого домена. Это большая компания и множество пользователей, поэтому они делают это отдельными шагами.)

В прошлый раз, когда я пытался, расширение оболочки "Взять на себя ответственность" сделал свою работу

Другие вопросы по тегам