Emacs - błąd podczas dzwonienia (start serwera)

82

Obecnie używam GNU Emacs 23.0.93.1 w systemie Windows Vista SP1. W moim pliku .emacs dzwonię (server-start)i powoduje to błąd z komunikatem Katalog ~ / .emacs.d / server jest niebezpieczny . Czy ktoś to widział i zna poprawkę lub obejście? ... inne niż pozostawienie wyłączonego serwera;)

Oto ślad stosu:

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)
λ Jonas Gorauskas
źródło
1
Miałem podobny błąd podczas uruchamiania Emacsa na komputerze z Uniksem; okazało się, że dzieje się tak dlatego, że trzymam mój ~ / .emacs.d w Subversion, a po svnpobraniu klient ustawił ~ / .emacs.d / server na 0755 na moją umaskę. Zamiast pakować się svnw skrypt powłoki, który jest sprzeczny z celem posiadania wszystkiego, czego potrzebuję, aby dostosować Emacsa na żywo w Subversion, po prostu mam Emacs wymuszający prawidłowe uprawnienia podczas uruchamiania, dodając następujące elementy do ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller

Odpowiedzi:

151

Znalazłem to rozwiązanie na EmacsWiki:

„Problemem jest własność katalogu ~ / .emacs.d / server, gdy masz również uprawnienia„ Administratorów ”na swoim koncie. Utwórz katalog ~ / .emacs.d / server i ustaw właściciela tego katalogu na swój login name i problem zniknął. Ponieważ mam „holenderską” wersję systemu Windows 7, nie znam dokładnie angielskich terminów, ale oto procedura:

Kliknij prawym przyciskiem myszy na ~ / .emacs.d / server i wybierz „Właściwości” (ostatnia pozycja w menu). Z Właściwości wybierz zakładkę „Bezpieczeństwo”, a następnie wybierz przycisk „Zaawansowane”. Następnie wybierz zakładkę „Właściciel” i zmień właściciela z Administrators (<your-pc-name>\Administrators)na <your-login-name> (<your-pc-name>\<your-login-name>. Teraz kod serwera zaakceptuje ten katalog jako bezpieczny, ponieważ jesteś właścicielem.

Mam nadzieję, że to pomoże wam wszystkim, ale i tak rozwiązało problem.

WKR Reutefleut ”

To zdecydowanie działa na Vista, z Emacs 23.2.1.

RealityMonster
źródło
3
Naprawione! Chciałbym, żeby ten komentarz miał wyższą pozycję w Google i powinien być odpowiedzią na to pytanie.
Drew
Naprawiono problem również w systemie Windows 7. Z bash, $ chown -R "$ {USER}" ~ / .emacs.d
luke h
Działa na spacemacs [email protected] (dlatego powinien również działać na zwykłym emacsie 25.1.1).
gemantzu
1
chmod 700 też jest w porządku.
netawater
29

Lubię odpowiadać na larsreed, ale kompletny kod gotowy do użycia:

(wymaga 'serwera)
(kiedy (i (> = emacs-major-version 23)
           (równy system okien 'w32))
  (defun server-sure-safe-dir (dir) "Noop" t)); Pomiń katalog błędów
                                                 ; ~ / .emacs.d / server jest niebezpieczny ”
                                                 ; w oknach.
(start serwera)

Ten problem omawiam w moim artykule na blogu http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

Zauważ również, że w 2009-09-19 naprawiono błąd # 4197 dotyczący server-secure-safe-dir, więc w nadchodzącym Emacs 23.2 to obejście nie jest potrzebne.

Pod niedawno wydanym Emacsem 23.2 mam takie ostrzeżenie:

Ostrzeżenie (serwer): używanie ~/.emacs.d/serverdo przechowywania plików uwierzytelniania serwera Emacs. Katalogi na systemach plików FAT32 NIE są zabezpieczone przed manipulacją. Zobacz zmienną server-auth-dirpo szczegóły.

Aby to naprawić, jak powiedzmy ostrzeżenie, możesz wskazać server-auth-dir na partycję NTFS ( %APPDATA%zwykle znajduje się system Windows %SYSTEMDRIVE%i użytkownik zwykle formatuje dysk systemowy jako partycję NTFS):

(wymaga 'serwera)
(kiedy (i (eq window-system 'w32) (file-exist-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(start serwera)
gavenkoa
źródło
1
używając emacs23 i windows vista 64b, to naprawiło to dla mnie. Bez wymaganego serwera nie działał.
Mario F
1
Dzięki, to działa dla mnie na Win7-64. Zauważ, że w przypadku EmacsW32 możesz pominąć uruchomienie serwera, ponieważ zrobi to później.
harpo
1
To nadal występuje w Emacs 23.3.1, więc zmieniłem warunek na <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </code> ale że wymagają aktualizacji, jeśli to nie jest ustalona w 23,4 .... Więc patrz komentarz poniżej @ user160983 który ignoruje emacs-minor-version
DJB
1
jak skomentowałem wcześniejszą odpowiedź, problem istnieje w emacs 24, więc warunek powinien być (> = emacs-major-version 24)
mcheema
1
@mcheema naprawiam to (>= emacs-major-version 23). Dzięki +1
gavenkoa
14

Jest to znany błąd Emacsa w systemie Windows. Aby obejść ten problem, należy zakomentować tę linię w server-sure-safe-dir w server.el, aby po zmianie ponownie kompilować bajty:

;; FIXME: Busted on Windows. 
;; (eql (nth 2 attrs) (user-uid)) 
brlcad
źródło
3
Twoje rozwiązanie rozwiązuje mój problem. Później zbadam to dalej i dodam tutaj swoje ustalenia. Dzięki!
λ Jonas Gorauskas
10

Aby uniknąć włamań do katalogu lisp, możesz po prostu dodać do swojego .emacs:

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

lre
źródło
Miałem powyższy problem z Emacsem w Cygwin i powyższe polecenie działało.
MikeHoss
1
problem występuje również w emacs 24, więc może (> = emacs-major-version 23) byłby odpowiedni
mcheema
dla mnie na Windows 7 z Emacsem 24 to nie zadziałało, dopóki nie dodałem linii (require 'server)nad kodem
MostlyHarmless
To działało dla mnie przez lata, dopóki nie użyłem tego na MacOS 10.14 (Mojave), w którym to momencie łamie magit (udostępniam moje pliki init na wszystkich platformach). Użyj odpowiedzi Gavenkoa powyżej, która zawiera również ograniczenie, aby ograniczyć zmianę do systemu Windows.
Steve Broberg
7

Ponadto nie chcesz, aby serwer był uruchamiany w trybie wsadowym. Dlatego w moich .emacs używam

(defconst --batch-mode 
  (or noninteractive (member "--batch-mode" command-line-args))
  "True when running in batch-mode (--batch-mode command-line switch set).")

i wtedy

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

Wciąż funkcja serwera jest kapryśna: server-startwyrzuca, gdy katalog % HOME% /. Emacs.d / server nie istnieje. Po kolei Emacs nie uruchomi się ponownie! Oczywistym rozwiązaniem jest utworzenie brakującego katalogu i ponowna próba; Znalazłem rozwiązanie gdzieś w sieci, ale naprawdę nie pamiętam gdzie. Poniższy kod działa pomyślnie od lat na kilku moich komputerach z systemem 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))))
    )
  )

Ten kod działa również podczas uruchamiania Emacsa z pendrive'a.

Mam nadzieję że to pomoże.

Andreas Spindler
źródło
Cześć! To nie działa w systemie Linux. argumenty wiersza polecenia nigdy nie zawierają mojego argumentu --batch. To działa:(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka
Ok dzięki. Więc powinniśmy udoskonalić --batch-modejako (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Naprawię to powyżej.
Andreas Spindler
6

Nie działa dla mnie w Windows 7.

Zamiast tego przeczytałem komentarze w server-sure-safe-dir i przystąpiłem do przejęcia własności do% APPDATA% forlder i podfolderów. Należały do ​​lokalnych administratorów, a nie do mnie.

To pomogło!

KTa
źródło
1
Aby wyjaśnić: Upewnij się, że katalog% HOME% \. Emacs.d \ server należy do Ciebie, a nie do lokalnej grupy Administratorów.
Kristopher Johnson
3

Bardzo pomocna odpowiedź od Gavenkoa. Mam ten problem na Emacs 24.1, Windows 2003.

Niestety, zastąpienie server-secure-safe-dir jako noop, jak zasugerowano w twoim pierwszym fragmencie, nie działało dla mnie we wszystkich sytuacjach. W szczególności nie zadziałało, gdy zostało zastosowane wcześniej (uruchomienie serwera) zostało wykonane co najmniej raz, ponieważ początkowe wykonanie również utworzyłoby katalog , jeśli nie istnieje. W wersji noop katalog nie zostałby w ogóle utworzony.

Obejściem, które zadziałało w moim przypadku w tym sensie, że wyeliminowało komunikat o błędzie, podczas gdy nadal poprawnie tworzyłem katalog, był następujący kod, umieszczony przed (start serwera) w moim pliku inicjującym Emacsa. Zawiera porady dotyczące server-sure-safe-dir, aby zignorować wszelkie błędy wywołane stamtąd. Nie rozwiązuje pierwotnej przyczyny problemu, ale dla mnie wystarczająco dobre.

(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
źródło
2

Poniższy krok działa dla mnie: 1. Wykonaj poniższy kod jako plik .reg. Wersja Win Emacsa potraktuje wszystkie wartości w rejestrze jako 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. Dodaj poniższy kod do swojego .emacs / init.el. Klucz w tym miejscu powinien mieć postać „server-auth-dir”.
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

Według powyższych kroków tryb serwera działa u mnie poprawnie i idealnie.

Jesse Peng
źródło
1

W przypadku, gdy to czasami dotyka ludzi, moja stacja robocza przeszła właśnie przez „migrację domeny”, która dodała kolejne uprawnienia do każdego pliku w skrzynce, po czym zacząłem otrzymywać ten błąd. Po dodaniu wyrażenia do dummy out "server-zapewnić-bezpieczny-katalog" to przestało działać.

(Jeśli się zastanawiasz, migracja będzie przebiegać w 2-3 krokach. Pierwszy dodaje uprawnienia dla mnie w domenie docelowej, potem zostaję przeniesiony do domeny docelowej, potem mogą (nie jestem tego pewien ) usunąć uprawnienia dla starej domeny. To duża firma i wielu użytkowników, więc robią to w osobnych krokach).

David M. Karr
źródło
1

Ostatnim razem, gdy próbowałem, rozszerzenie powłoki „Przejmij własność” wykonało zadanie

bezsenność Sól
źródło
1

Jeśli jest to problem z własnością folderu serwera, który zidentyfikował RealityMonster, możesz uruchomić to w wierszu polecenia systemu Windows, aby go naprawić:

takeown /f %USERPROFILE%\.emacs.d\server /r /d y
Sam Hasler
źródło
To jedyna odpowiedź, która naprawdę mi pomogła (Windows 10 i Emacs 27.0.50). Dzięki.
gsl