Emacs - Arama sırasında hata (sunucu başlangıcı)


82

Şu anda Windows Vista SP1'de GNU Emacs 23.0.93.1 kullanıyorum. .Emacs dosyamda arama yapıyorum (server-start)ve bu mesajla hataya neden oluyor ~ / .emacs.d / server dizini güvenli değil . Bunu gören ve bir düzeltme veya geçici çözüm bilen var mı? ... sunucuyu kapatmak dışında;)

İşte yığın izleme:

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
Bir Unix kutusunda Emacs'ı başlatırken benzer bir hata yaşadım; Bunun sebebi ~ / .emacs.d'mi Subversion'da tutmam ve kontrol sırasında svnistemcinin ~ / .emacs.d / server'ı umask'ım başına 0755 olarak ayarlamasıydı. Bunun yerine sarma svnyaşamasına Subversion Emacs özelleştirmek için gereken her şeyi olması amacı yendi bir kabuk komut dosyası, içinde aşağıdaki eklenerek, başladığında, sadece Emacs doğru izinlere zorlamak zorunda ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller

Yanıtlar:


151

Bu çözümü EmacsWiki'de buldum:

"Sorun, hesabınızda" Yönetici "haklarına sahip olduğunuzda ~ / .emacs.d / server dizininin sahipliğidir. ~ / .Emacs.d / server dizinini oluşturun ve bu dizinin sahibini oturum açma bilgilerinize ayarlayın Windows 7'nin "Hollandaca" bir sürümüne sahip olduğum için İngilizce terimleri tam olarak bilmiyorum ama işte prosedür:

~ / .Emacs.d / server üzerinde R-mouse'a tıklayın ve “Özellikler” i seçin (menüdeki son öğe). Özellikler'den "Güvenlik" sekmesini seçin ve ardından "Gelişmiş" düğmesini seçin. Sonra Sekme “Sahip” seçin ve gelen sahibini değiştirmek Administrators (<your-pc-name>\Administrators)içine <your-login-name> (<your-pc-name>\<your-login-name>. Şimdi sunucu kodu, sahibi siz olduğunuz için bu dizini güvenli olarak kabul edecektir.

Umarım bu hepinize yardımcı olur, yine de benim için sorunu çözmüştür.

WKR Reutefleut "

Emacs 23.2.1 ile kesinlikle Vista'da çalışır.


3
Onu düzeltti! Keşke bu yorumun google sıralamasında daha yüksek olması ve bu sorunun da cevabı olması lazım.
Drew

Windows 7'de de sorun düzeltildi. Bash'dan, $ chown -R "$ {USER}" ~ / .emacs.d
luke h

Spacemacs 0.200.1@25.1.1 üzerinde çalışır (bu nedenle, düz emacs 25.1.1 üzerinde de çalışmalıdır).
gemantzu

1
chmod 700 de tamam.
netawater

29

Geniş bir yelpazeden hoşlanıyorum, ancak kullanıma hazır kod:

('sunucu gerektirir)
(ne zaman (ve (> = emacs-major-version 23)
           (eşit pencere sistemi 'w32))
  (defun server-sure-safe-dir (dir) "Noop" t)); Hata "dizinini göster
                                                 ; ~ / .emacs.d / server güvenli değil "
                                                 ; pencerelerde.
(sunucu başlangıcı)

Bu sorunu blog makalemde açıklıyorum http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

Ayrıca 2009-09-19'da server-sure-safe-dir ile ilgili 4197 numaralı hatanın düzeltildiğini ve bu nedenle gelen Emacs 23.2'de bu geçici çözümün gerekli olmadığını unutmayın.

Yakın zamanda piyasaya sürülen Emacs 23.2 kapsamında böyle bir uyarı alıyorum:

Uyarı (sunucu): ~/.emacs.d/serverEmacs sunucusu kimlik doğrulama dosyalarını saklamak için kullanma . FAT32 dosya sistemlerindeki dizinler kurcalanmaya karşı güvenli DEĞİLDİR. Ayrıntılar için değişkene server-auth-dirbakın.

Bunu bir uyarı olarak düzeltmek için sunucu-auth-dir'i NTFS bölümüne yönlendirebilirsiniz ( %APPDATA%genellikle Windows'ta bulunur %SYSTEMDRIVE%ve kullanıcı genellikle sistem sürücüsünü NTFS bölümü olarak biçimlendirir):

('sunucu gerektirir)
(ne zaman (ve (eq pencere-sistemi 'w32) (dosya-var-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (dizin-sunucu-kimlik-dizini))
(sunucu başlangıcı)

1
emacs23 ve windows vista 64b kullanarak, bu benim için düzeltti. Gerekli sunucu olmadan çalışmadı.
Mario F

1
Teşekkürler, bu benim için Win7-64'te çalışıyor. EmacsW32 ile sunucu başlangıcını daha sonra yapacağı için atlayabilirsiniz.
harpo

1
Bu hala Emacs 23.3.1'de gerçekleşiyor, bu yüzden koşulu <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </code> olarak değiştirdim ancak bu, 23.4'te düzeltilmezse güncellenmesi gerekecek .... Bu nedenle, aşağıdaki emacs-minor-version
djb

1
Daha önce cevap yorumladı olarak koşullu olmalıdır böylece sorun Emacs 24 bulunmaktadır (> = emacs-majör sürüm 24)
mcheema

1
@mcheema Ben düzeltiyorum (>= emacs-major-version 23). Teşekkürler +1
gavenkoa

14

Bu, Windows'ta bilinen bir Emacs hatasıdır. Bir geçici çözüm, sunucu-garantili-güvenli-dizindeki bu satırı, değişiklikten sonra bayt yeniden derlemek isteyeceğiniz şekilde yorumlamaktır:

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

3
Çözümünüz sorunumu çözüyor. Bunu daha sonra araştıracağım ve bulgularımı buraya ekleyeceğim. Teşekkürler!
λ Jonas Gorauskas

10

Lisp dizinine girmekten kaçınmak için, aşağıdakileri .emac'lerinize ekleyebilirsiniz:

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


Cygwin'de Emacs ile yukarıdaki sorunu yaşadım ve yukarıdaki komut işe yaradı.
MikeHoss

1
sorun aynı zamanda emacs 24'te de ortaya çıkıyor, bu yüzden belki bir (> = emacs-major-sürüm 23) uygun olabilir
mcheema

Emacs 24 ile Windows 7'de benim için bu (require 'server), kodun üstündeki satırı ekleyene kadar işe yaramadı
MostlyHarmless

Bu, bunu MacOS 10.14'te (Mojave) kullanana kadar yıllarca çalıştı ve bu noktada magit'i kırdı (init dosyalarımı tüm platformlarda paylaşıyorum). Değişikliği Windows ile kısıtlamak için kısıtlamayı da içeren yukarıdaki gavenkoa yanıtını kullanın.
Steve Broberg

7

Ek olarak, sunucunun toplu modda başlatılmasını istemezsiniz. Benim içinde .emacs Bu nedenle kullanmak

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

ve sonra

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

Yine de sunucu özelliği kaprislidir: % HOME% /. Emacs.d / server dizini olmadığında server-startatar . Art arda Emacs yeniden başlamayacak! Açık çözüm, eksik dizini oluşturmak ve tekrar denemektir; Çözümü internette bir yerde buldum ama nerede olduğunu gerçekten hatırlayamıyorum. Aşağıdaki kod, birkaç Windows makinemde yıllardır başarıyla çalışıyor:

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

Bu kod, Emacs'i bir çubuktan çalıştırırken de çalışır.

Bu yardımcı olur umarım.


Merhaba! Bu Linux'ta çalışmıyor. komut satırı bağımsız değişkenleri hiçbir zaman --batch argümanımı içermez. Bu işe yarıyor:(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka

Tamam teşekkürler. Öyleyse --batch-modeolarak rafine etmeliyiz (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Yukarıda düzeltirim.
Andreas Spindler

6

Windows 7'de benim için çalışmadı.

Bunun yerine server-sure-safe-dir içindeki yorumları okudum ve% APPDATA% forlder ve alt klasörlerin sahipliğini alarak ilerledim. Onlar bana değil yerel Yöneticilere aitti.

Bu yardımcı oldu!


1
Ayrıntılı bilgi için:% HOME% \. Emacs.d \ sunucusunun yerel Administrators grubuna değil size ait olduğundan emin olun.
Kristopher Johnson

3

Gavenkoa'dan çok faydalı cevap. Emacs 24.1, Windows 2003'te bu sorunu yaşıyorum.

Ne yazık ki, ilk ön bilginizde önerildiği gibi, server-sure-safe-dir'in noop olmasını geçersiz kılmak benim için her durumda işe yaramadı. Spesifik olarak, daha önce uygulandığında (server-start) en az bir kez çalıştırıldığında işe yaramadı, çünkü ilk yürütme , eğer yoksa dizini de oluşturacaktır . Noop sürümü ile dizin hiç oluşturulmayacaktır.

Dizini düzgün bir şekilde oluştururken hata mesajını ortadan kaldırması anlamında benim için işe yarayan geçici çözüm, Emacs başlatma dosyamda (server-start) öncesine yerleştirilen aşağıdaki koddu. Buradan kaynaklanan hataları göz ardı etmek için server-sure-safe-dir etrafına bir tavsiye koyar. Sorunun temel nedenini çözmüyor, ama benim için yeterince iyi.

(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

Aşağıdaki adım benim için çalışıyor: 1. Aşağıdaki kodu .reg dosyası olarak çalıştırın. Emacs win sürümü, kayıt defterindeki tüm değerleri Env Var olarak değerlendirir.

[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'inize aşağıdaki kodu ekleyin. Buradaki anahtar "server-auth-dir" olmalıdır.
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

Yukarıdaki adımlarla sunucu modu benim için doğru ve mükemmel çalışıyor.


1

Bunun zaman zaman insanlara çarpması durumunda, iş istasyonum kutudaki her dosyaya başka bir izin ekleyen bir "etki alanı geçişinden" geçti ve sonra bu hatayı almaya başladım. "Server-sure-safe-dir" ifadesini ekledikten sonra bu başarısız olmayı durdurdu.

(Merak ediyorsanız, geçiş 2-3 adımda olacaktır. İlki benim için hedef etki alanına izin ekler, sonra hedef etki alanına taşınırım, sonra onlar olabilir (Bundan emin değilim ) eski alanın iznini kaldırın. Bu büyük bir şirket ve birçok kullanıcı, bu nedenle bunu ayrı adımlarda yapıyorlar.)



1

RealityMonster'ın belirlediği sunucu klasörü sahipliği sorunu buysa, düzeltmek için bunu Windows komut isteminde çalıştırabilirsiniz:

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

Benim için gerçekten işe yarayan tek cevap budur (Windows 10 ve Emacs 27.0.50). Teşekkürler.
gsl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.