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

82

В настоящее время я использую GNU Emacs 23.0.93.1 в Windows Vista SP1. В моем файле .emacs я вызываю, (server-start)и это вызывает ошибку с сообщением . Каталог ~ / .emacs.d / server is unsafe . Кто-нибудь видел это и знает исправление или обходной путь? ... кроме как оставить сервер выключенным;)

Вот трассировка стека:

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)
λ Йонас Гораускас
источник
1
У меня была аналогичная ошибка при запуске Emacs в системе Unix; Оказалось, это потому, что я храню свой ~ / .emacs.d в Subversion, и при проверке svnклиент установил ~ / .emacs.d / server на 0755 в соответствии с моей маской umask. Вместо того, чтобы заключать svnв оболочку сценарий, который лишает меня смысла иметь все, что мне нужно для настройки Emacs в Subversion, я просто заставляю Emacs принудительно выдавать правильные разрешения при запуске, добавляя следующее ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Аарон Миллер,

Ответы:

151

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

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

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

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

WKR Reutefleut "

Он определенно работает в Vista с Emacs 23.2.1.

РеальностьМонстр
источник
3
Починил это! Я бы хотел, чтобы этот комментарий имел более высокий рейтинг в Google, и он также должен быть ответом на этот вопрос.
Дрю
Исправлена ​​проблема и в Windows 7. Из bash, $ chown -R "$ {USER}" ~ / .emacs.d
h
Он работает на spacemacs 0.200.1@25.1.1 (следовательно, он также должен работать на обычном emacs 25.1.1).
gemantzu 03
1
chmod 700 тоже в порядке.
netawater
29

Мне нравится отвечать на 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%обычно находится в Windows, %SYSTEMDRIVE%и пользователь обычно форматирует системный диск как раздел NTFS):

(требуется сервер)
(когда (и (eq window-system 'w32) (file-exists-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-каталог server-auth-dir))
(запуск сервера)
гавенкоа
источник
1
используя emacs23 и windows vista 64b, это исправило для меня. Без требуемого сервера не работал.
Mario F
1
Спасибо, у меня это работает на Win7-64. Обратите внимание, что с EmacsW32 вы можете опустить server-start, так как он сделает это позже.
harpo
1
Это все еще происходит в Emacs 23.3.1, поэтому я изменил условие на <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </code> но это потребует обновления, если это не исправлено в версии 23.4 .... Итак, см. комментарий ниже @ user160983, который игнорирует emacs-minor-version
djb
1
как я прокомментировал предыдущий ответ, проблема существует в emacs 24, поэтому условное
выражение
1
@mcheema Я исправлюсь (>= emacs-major-version 23). Спасибо +1
gavenkoa 02
14

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

;; FIXME: Busted on Windows. 
;; (eql (nth 2 attrs) (user-uid)) 
brlcad
источник
3
Ваше решение решает мою проблему. Я изучу это позже и добавлю здесь свои выводы. Благодаря!
λ Йонас Гораускас
10

Чтобы избежать взлома каталога lisp, вы можете просто добавить следующее в свой .emacs:

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

lre
источник
У меня была указанная выше проблема с Emacs в Cygwin, и указанная выше команда работала.
Майк Хосс,
1
проблема также возникает в emacs 24, поэтому, возможно, подойдет (> = emacs-major-version 23)
mcheema
для меня в Windows 7 с Emacs 24 это не сработало, пока я не добавил строку (require 'server)над кодом
MostlyHarmless
Это работало у меня годами, пока я не использовал это в MacOS 10.14 (Mojave), после чего он ломает magit (я делюсь своими файлами инициализации на всех платформах). Используйте ответ от gavenkoa выше, который также включает ограничение на изменение в Windows.
Стив Броберг,
7

Кроме того, вы не хотите, чтобы сервер запускался в пакетном режиме. Поэтому в моем .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. command-line-args никогда не включает мой аргумент --batch. Это работает:(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka
Хорошо спасибо. Итак, мы должны уточнить --batch-modeкак (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Исправил выше.
Андреас Шпиндлер,
6

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

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

Это помогло!

KTa
источник
1
Для уточнения: убедитесь, что каталог% HOME% \. Emacs.d \ server принадлежит вам, а не локальной группе администраторов.
Кристофер Джонсон
3

Очень полезный ответ от гавенкоа. У меня проблема с 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))
lbo
источник
2

Для меня работает следующий шаг: 1. Выполните приведенный ниже код как файл .reg. Win-версия Emacs будет обрабатывать любые значения в реестре как 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)

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

Джесси Пэн
источник
1

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

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

Дэвид М. Карр
источник
1

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

бессонница
источник
1

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

takeown /f %USERPROFILE%\.emacs.d\server /r /d y
Сэм Хаслер
источник
Это единственный ответ, который действительно сработал для меня (Windows 10 и Emacs 27.0.50). Благодарю.
GSL