Emacs - कॉल करते समय त्रुटि (सर्वर-स्टार्ट)


82

मैं वर्तमान में Windows Vista SP1 में GNU Emacs 23.0.93.1 का उपयोग कर रहा हूं। मेरी .emacs फ़ाइल में मैं एक कॉल करता हूं (server-start)और वह संदेश के साथ एक त्रुटि पैदा कर रहा है । निर्देशिका ~ / .emacs.d / सर्वर असुरक्षित है । क्या किसी ने इसे देखा है और एक फिक्स या वर्कअराउंड पता है? ... सर्वर छोड़ने के अलावा अन्य बंद;)

यहाँ स्टैक ट्रेस है:

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 शुरू करने में एक समान त्रुटि थी; यह इसलिए निकला क्योंकि मैं तोड़फोड़ में अपने ~ / .emacs.d को रखता हूं, और svnग्राहक को मेरे umask प्रति 0755 के लिए ~ / .emacs.d / सर्वर सेट की जांच करता हूं। svnशेल स्क्रिप्ट में लपेटने के बजाय , जो सब कुछ होने के उद्देश्य को पराजित करता है जिसे मुझे Emacs को लाइव करने की आवश्यकता होती है, Subversion में रहते हैं, मेरे पास Emacs को सही अनुमतियों को लागू करने के लिए मजबूर करता है, इसे निम्न जोड़कर ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
हारून मिलर

जवाबों:


151

मुझे यह समाधान EmacsWiki पर मिला:

"समस्या निर्देशिका ~ / .emacs.d / सर्वर के स्वामित्व की है जब आपके खाते में" व्यवस्थापक "अधिकार भी होते हैं। निर्देशिका ~ / .emacs.d / सर्वर बनाएं और इस निर्देशिका के स्वामी को अपने लॉगिन पर सेट करें। नाम और समस्या दूर हो गई है। जैसा कि मेरे पास विंडोज 7 का "डच" संस्करण है, मैं अंग्रेजी शब्दों को ठीक से नहीं जानता, लेकिन यहां प्रक्रिया है:

~ / .Emacs.d / सर्वर पर R- माउस पर क्लिक करें और "गुण" (मेनू में अंतिम आइटम) का चयन करें। गुण से टैब "सुरक्षा" का चयन करें और फिर "उन्नत" बटन का चयन करें। फिर टैब "ओनर" चुनें और मालिक को इसमें से Administrators (<your-pc-name>\Administrators)बदल दें <your-login-name> (<your-pc-name>\<your-login-name>। अब सर्वर कोड इस निर्देशिका को सुरक्षित मान लेगा क्योंकि आप इसके मालिक हैं।

आशा है कि यह आप सभी लोगों के लिए मदद करता है, इसने वैसे भी मेरे लिए समस्या हल कर दी।

WKR रीटफ्लेट "

यह निश्चित रूप से विस्टा पर काम करता है, Emacs 23.2.1 के साथ।


3
ठीक कर दिया! मेरी इच्छा है कि इस टिप्पणी की उच्च रैंकिंग थी और इसे इस प्रश्न का उत्तर भी होना चाहिए।
ड्रू

विंडोज 7 पर भी समस्या का समाधान किया। बैश से, $ chown -R "$ {USER}" ~ / .emacs.d
luke h

यह स्पेसमैक्स 0.200.1@25.1.1 पर काम करता है (इसलिए इसे सादा इमैक 25.1.1 पर भी काम करना चाहिए)।
जेमांत्ज़ु

chmod 700 भी ठीक है।
नेटवॉटर

29

मुझे लार्वेस के एवर का आनंद मिलता है, लेकिन शिकायत कोड का उपयोग करने के लिए तैयार है:

(सर्वर की आवश्यकता है)
(जब (और> = emacs-major-version 23)
           (समान विंडो-सिस्टम 'w32))
  (defun server-सुनिश्चित- safe-dir (dir) "Noop" t)); दमन त्रुटि "निर्देशिका
                                                 ; ~ / .emacs.d / सर्वर असुरक्षित है "
                                                 ; खिड़कियों पर।
(सर्वर शुरू)

मैं इस मुद्दे को अपने ब्लॉग लेख http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html में डिस्कस करता हूं

यह भी ध्यान दें कि 2009-09-19 में फिक्स्ड बग # 4197 सर्वर-सुनिश्चित-सुरक्षित-डीआईआर के बारे में है ताकि आने वाले Emacs 23.2 में इस वर्कअराउंड की जरूरत न हो।

हाल ही में जारी Emacs 23.2 के तहत मुझे ऐसी चेतावनी दी गई है:

चेतावनी (सर्वर): ~/.emacs.d/serverEmacs- सर्वर प्रमाणीकरण फ़ाइलों को संग्रहीत करने के लिए उपयोग करना । FAT32 filesystems पर निर्देशिकाएँ छेड़छाड़ के खिलाफ सुरक्षित नहीं हैं। server-auth-dirविवरण के लिए चर देखें।

चेतावनी के रूप में इसे ठीक करने के लिए आप सर्वर-नीति-डीआईआर को एनटीएफएस विभाजन ( %APPDATA%आमतौर पर स्थित विंडोज %SYSTEMDRIVE%और उपयोगकर्ता आमतौर पर NTFS विभाजन के रूप में सिस्टम ड्राइव को प्रारूपित कर सकते हैं) को इंगित कर सकते हैं :

(सर्वर की आवश्यकता है)
(जब (और eq विंडो-सिस्टम 'w32) (फ़ाइल-अस्तित्व-पी (getenv "APPDATA"))
  (सेटक सर्वर-कोर-डीआईआर (कॉन्कटैट (गेटेनव "एपीडीडीएटीए") "/.emacs.d/server"))
  (मेक-डायरेक्टरी सर्वर-ऑर्ट-दिर)
(सर्वर शुरू)

1
Emacs23 और विंडोज़ विस्टा 64 बी का उपयोग करते हुए, इसने मेरे लिए इसे ठीक कर दिया। सर्वर की आवश्यकता के बिना काम नहीं किया।
मारियो एफ

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 जो एमएसीएस-माइनर-वर्जन को नजरअंदाज करता है
djb

1
जैसा कि मैंने पहले उत्तर में टिप्पणी की थी कि समस्या emacs 24 में मौजूद है इसलिए सशर्त होना चाहिए (> = emacs-major-version 24)
mcheema

1
@ मिचिमा मैं ठीक करता हूं (>= emacs-major-version 23)। धन्यवाद +1
gavenkoa

14

यह विंडोज पर एक ज्ञात Emacs बग है। एक वर्कअराउंड सर्वर-सुनिश्चित-सुरक्षित-डीर में इस लाइन को सर्वर पर टिप्पणी करने के लिए है। यदि आप परिवर्तन के बाद recompile करना चाहते हैं:

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

3
आपका समाधान मेरी समस्या को ठीक करता है। मैं बाद में इसकी जांच करूंगा और अपने निष्कर्ष यहां जोड़ूंगा। धन्यवाद!
λ जोनास गोर्स्कस

10

लिस्प निर्देशिका में हैकिंग से बचने के लिए, आप बस अपने .emacs में निम्नलिखित जोड़ सकते हैं:

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


मेरे पास उपरोक्त मुद्दे साइगविन में Emacs के साथ थे और उपरोक्त कमांड ने काम किया।
मीकहॉस

1
समस्या भी emacs 24 में होती है इसलिए शायद (a = emacs-major-version 23) उपयुक्त होगा
mcheema

मेरे लिए विंडोज 7 पर Emacs 24 के साथ यह तब तक काम नहीं किया जब तक मैंने (require 'server)कोड के ऊपर लाइन नहीं जोड़ी
MostlyHarmless

यह मेरे लिए वर्षों तक काम करता रहा जब तक कि मैंने इसका इस्तेमाल MacOS 10.14 (Mojave) पर नहीं किया, जिस समय यह मैगिट को तोड़ता है (मैं सभी प्लेटफार्मों में अपनी इनिट फ़ाइलों को साझा करता हूं)। ऊपर gavenkoa द्वारा उत्तर का उपयोग करें जिसमें विंडोज में परिवर्तन को प्रतिबंधित करने के लिए बाधा भी शामिल है।
स्टीव ब्रबर्ग

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फेंकता है जब % गृह% / emacs.d / सर्वर। निर्देशिका मौजूद नहीं है। उत्तराधिकार में Emacs फिर से शुरू नहीं होगा! स्पष्ट समाधान लापता निर्देशिका बनाना और फिर से प्रयास करना है; मैं नेट पर कहीं न कहीं समाधान पाया, लेकिन वास्तव में याद नहीं कर सकते। निम्न कोड अब मेरी कई विंडोज़ मशीनों पर वर्षों तक सफलतापूर्वक चलता है:

(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 चलाते समय भी काम करता है।

उम्मीद है की यह मदद करेगा।


नमस्ते! यह लिनक्स पर काम नहीं कर रहा है। कमांड-लाइन-आर्ग्स में मेरा --बैच तर्क शामिल नहीं है। यह काम करता है:(if (not noninteractive) (progn (require 'server) (server-start)))
gizka

ठीक है धन्यवाद। तो हम के --batch-modeरूप में परिष्कृत करना चाहिए (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args)))। मैं इसे ऊपर ठीक करता हूं।
एंड्रियास स्पिंडलर

6

विंडोज 7 में मेरे लिए काम नहीं किया।

इसके बजाय मैंने सर्वर-सुनिश्चित-सुरक्षित-डीआईआर में टिप्पणियों को पढ़ा और% APPDATA% फॉरेन्ड और सबफ़ोल्डर्स के लिए स्वामित्व लेने के साथ आगे बढ़ा। वे स्थानीय प्रशासकों के स्वामित्व में थे, मेरे द्वारा नहीं।

इससे मदद मिली!


1
विस्तृत करने के लिए: सुनिश्चित करें कि निर्देशिका% HOME% \। Emacs.d \ सर्वर आपके पास है, स्थानीय व्यवस्थापक समूह द्वारा नहीं।
क्रिस्टोफर जॉनसन

3

गवेंको से बहुत मददगार जवाब। मुझे एमएसीएस 24.1, विंडोज 2003 पर यह समस्या हो रही है।

दुर्भाग्य से, सर्वर को सुनिश्चित करने के लिए एक noop बनने के लिए सुनिश्चित करना, जैसा कि आपके पहले स्निपेट में सुझाया गया है, मेरे लिए सभी स्थितियों में काम नहीं किया। विशेष रूप से, यह तब काम नहीं करता था जब पहले (सर्वर-स्टार्ट) लागू किया गया था, कम से कम एक बार निष्पादित किया गया था, क्योंकि प्रारंभिक निष्पादन भी निर्देशिका का निर्माण करेगा , अगर यह मौजूद नहीं है। नूप संस्करण के साथ, निर्देशिका बिल्कुल नहीं बनाई जाएगी।

वर्कअराउंड ने मेरे लिए इस अर्थ में काम किया कि इसने त्रुटि संदेश को समाप्त कर दिया, जबकि अभी भी डायरेक्टरी को ठीक से बनाते हुए, निम्नलिखित कोड था, (Emacs initialization फाइल में) पहले (सर्वर-स्टार्ट)। यह सर्वर-सुनिश्चित-सुरक्षित-डीआर के आसपास एक सलाह देता है जो वहां से उठाई गई किसी भी त्रुटि को अनदेखा करता है। समस्या की जड़ को हल नहीं करता है, लेकिन मेरे लिए काफी अच्छा है।

(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 विन संस्करण रजिस्ट्री में किसी भी मान को 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 के नीचे कोड जोड़ें। यहां कुंजी "सर्वर-ऑक्टोर-डीआईआर" होनी चाहिए।
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

सर्वर मोड के ऊपर के स्टेप्स मेरे लिए सही और परफेक्ट काम करते हैं।


1

यदि यह कभी-कभी लोगों को मारता है, तो मेरा कार्य केंद्र सिर्फ एक "डोमेन माइग्रेशन" के माध्यम से चला गया, जिसने बॉक्स पर प्रत्येक फ़ाइल के लिए एक और अनुमति जोड़ दी, फिर मुझे यह त्रुटि मिलनी शुरू हो गई। के बाद मैंने "सर्वर-सुनिश्चित-सुरक्षित-दिर" डमी को अभिव्यक्ति को जोड़ा, यह विफल हो गया।

(यदि आप सोच रहे हैं, तो माइग्रेशन 2-3 चरणों में होगा। पहले व्यक्ति मेरे लिए लक्ष्य डोमेन में अनुमति जोड़ता है, फिर मैं लक्ष्य डोमेन में स्थानांतरित हो जाता हूं, फिर वे हो सकते हैं (मुझे इस बारे में निश्चित नहीं है) ) पुराने डोमेन की अनुमति को हटा दें। यह एक बड़ी कंपनी है, और कई उपयोगकर्ता हैं, इसलिए वे इसे अलग चरणों में कर रहे हैं।)


1

पिछली बार मैंने कोशिश की थी, "स्वामित्व ले लो" शेल एक्सटेंशन ने काम किया


1

यदि यह सर्वर फ़ोल्डर स्वामित्व समस्या है जिसे RealityMonster ने पहचाना है, तो आप इसे ठीक करने के लिए विंडोज़ कमांड प्रॉम्प्ट पर चला सकते हैं:

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

यह एकमात्र उत्तर है जिसने वास्तव में मेरे लिए काम किया (विंडोज 10 और एमएसीएस 27.0.50)। धन्यवाद।
gsl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.