Emacs - Помилка під час виклику (запуск сервера)


82

Зараз я використовую 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)

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, я точно не знаю англійських термінів, але ось процедура:

Клацніть мишкою R на ~ / .emacs.d / сервері та виберіть «Властивості» (останній пункт меню). У меню Властивості виберіть вкладку «Безпека», а потім натисніть кнопку «Додатково». Потім виберіть вкладку «Власник» і змініть власника 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
luke h

Він працює на spacemacs 0.200.1@25.1.1 (тому він також повинен працювати на звичайному emacs 25.1.1).
gemantzu

chmod 700 теж добре.
Нетавотер

29

Мені подобається відповідати на запит larsreed, але complite-код готовий до використання:

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

Я обговорюю це питання у своїй статті в блозі http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

Також зверніть увагу, що у 19.09.2009 виправлено помилку # 4197 про server-secure-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) (файл-існує-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(запуск сервера)

1
використовуючи emacs23 та windows vista 64b, це мені це виправлено. Без сервера вимагати не працював.
Mario F

1
Дякую, це працює для мене на Win7-64. Зверніть увагу, що з EmacsW32 ви можете не використовувати запуску сервера, оскільки це буде зроблено пізніше.
гарпо

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, тому умовною має бути (> = emacs-major-version 24)
mcheema

1
@mcheema, який я виправляю (>= emacs-major-version 23). Дякуємо +1
gavenkoa

14

Це відома помилка Emacs у Windows. Обхідним шляхом є коментування цього рядка в server-secure-safe-dir на сервері.el, коли ви захочете перекомпілювати байт після зміни:

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

3
Ваше рішення вирішує мою проблему. Я досліджу це далі пізніше і додам свої висновки сюди. Дякую!
λ Йонас Гораускас

10

Щоб уникнути злому в каталозі lisp, ви можете просто додати наступне у свій .emacs:

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


У мене була вищезазначена проблема з Emacs у Cygwin, і вищевказана команда спрацювала.
MikeHoss

1
проблема також виникає в emacs 24, тому, можливо, ((= = emacs-major-version 23) буде доречним
mcheema

для мене в Windows 7 з Emacs 24 це не спрацювало, доки я не додав рядок (require 'server)над кодом
основному без шкоди

Це працювало у мене роками, поки я не використав це на MacOS 10.14 (Mojave), після чого він зламає magit (я розподіляю свої файли init на всіх платформах). Використовуйте відповідь 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 / сервер. Каталог не існує. Послідовно 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)))
gaizka

Добре, дякую. Тоді нам слід уточнити --batch-modeяк (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Я це виправляю вище.
Андреас Шпіндлер,

6

Не працював у мене в Windows 7.

Натомість я прочитав коментарі в сервер-перевірте-безпечно-директорію і продовжив з тим, що взяв право власності на% APPDATA% фордер та підпапки. Вони належали місцевим адміністраторам, а не мені.

Це допомогло!


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

3

Дуже корисна відповідь від gavenkoa. У мене ця проблема на Emacs 24.1, Windows 2003.

На жаль, перевизначення сервера-secure-safe-dir, щоб стати кругом, як було запропоновано у вашому першому фрагменті, не спрацювало для мене у всіх ситуаціях. Зокрема, він не працював, коли застосовувався до (запуск сервера) принаймні один раз, оскільки початкове виконання також створило б каталог , якщо він не існує. З версією noop каталог взагалі не створювався.

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

2

Для мене працює наступний крок: 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)

Крок вище серверний режим працює для мене правильно і досконало.


1

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

(Якщо вам цікаво, міграція буде виконана у 2-3 кроки. Перший додає дозвіл для мене в цільовому домені, потім я переїжджаю до цільового домену, тоді вони можуть (я не впевнений у цьому) ) видалити дозвіл для старого домену. Це велика компанія, і багато користувачів, тому вони роблять це окремими кроками.)


1

Востаннє, коли я намагався, розширення оболонки "Прийняти право власності" зробило свою справу


1

Якщо проблему власності на папку сервера визначив RealityMonster, тоді ви можете запустити це в командному рядку Windows, щоб виправити це:

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

Це єдина відповідь, яка справді спрацювала для мене (Windows 10 та Emacs 27.0.50). Дякую.
gsl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.