Câu hỏi Emacs - Lỗi khi gọi (máy chủ bắt đầu)


Tôi hiện đang sử dụng GNU Emacs 23.0.93.1 trong Windows Vista SP1. Trong tệp .emacs của tôi, tôi gọi điện tới (server-start) và điều đó gây ra lỗi với thông báo Thư mục ~ / .emacs.d / server không an toàn. Có ai nhìn thấy điều này và biết một sửa chữa hoặc workaround? ... ngoài việc tắt máy chủ;)

Đây là dấu vết ngăn xếp:

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)

76
2018-05-20 01:35


gốc


Tôi đã có một lỗi tương tự như bắt đầu Emacs trên một hộp Unix; điều này hóa ra là vì tôi giữ ~ / .emacs.d trong Subversion, và khi thanh toán svn khách hàng đặt ~ / .emacs.d / server thành 0755 cho mỗi umask của tôi. Thay vì gói svn trong một kịch bản trình bao, mà đánh bại mục đích của việc có tất cả mọi thứ tôi cần để tùy chỉnh Emacs sống trong Subversion, tôi chỉ có Emacs buộc các quyền chính xác khi nó khởi động, bằng cách thêm những điều sau đây ~/.emacs.d/init.el: (set-file-modes (expand-file-name "~/.emacs.d/server") #o700) - Aaron Miller


Các câu trả lời:


Tôi tìm thấy giải pháp này trên EmacsWiki:

"Vấn đề là quyền sở hữu thư mục ~ / .emacs.d / server khi bạn cũng có quyền" Quản trị viên "trên tài khoản của mình. Tạo thư mục ~ / .emacs.d / server và đặt chủ nhân của thư mục này thành thông tin đăng nhập của bạn tên và vấn đề đã biến mất Vì tôi có phiên bản "Hà Lan" của Windows 7, tôi không biết chính xác các thuật ngữ tiếng Anh nhưng đây là quy trình:

Nhấn R-mouse trên ~ / .emacs.d / server và chọn “Properties” (mục cuối cùng trong menu). Từ Properties chọn Tab “Security” và sau đó chọn nút “Advanced”. Sau đó chọn Tab “Chủ sở hữu” và thay đổi chủ sở hữu từ Administrators (<your-pc-name>\Administrators) vào <your-login-name> (<your-pc-name>\<your-login-name>. Bây giờ mã máy chủ sẽ chấp nhận thư mục này là an toàn vì bạn là chủ sở hữu.

Hy vọng điều này sẽ giúp cho tất cả các bạn, nó vẫn giải quyết vấn đề cho tôi.

W.K.R. Reutefleut "

Nó chắc chắn hoạt động trên Vista, với Emacs 23.2.1.


141
2018-05-31 14:37



Đã sửa nó! Tôi muốn nhận xét này có thứ hạng google cao hơn và nó cũng là câu trả lời cho câu hỏi này. - Drew
Cảm ơn - điều đó cũng đã hoạt động trên Windows 7 đối với tôi. - steglig
Đã khắc phục sự cố trên Windows 7. Từ bash, $ chown -R "$ {USER}" ~ / .emacs.d - luke h
Nó hoạt động trên các spacemacs 0.200.1@25.1.1 (do đó nó cũng hoạt động trên các emacs đồng bằng 25.1.1). - gemantzu
chmod 700 cũng được. - netawater


Tôi thích thú với an toàn của larsreed, nhưng complite code đã sẵn sàng để sử dụng:

(yêu cầu 'máy chủ)
(khi (và (> = emacs-chính-phiên bản 23)
           (hệ thống cửa sổ bằng nhau 'w32))
  (defun server-đảm bảo-an toàn-dir (dir) "Noop" t)); Ngăn chặn lỗi "thư mục
                                                 ; ~ / .emacs.d / server không an toàn "
                                                 ; trên cửa sổ.
(máy chủ bắt đầu)

Tôi bỏ qua vấn đề này trong bài viết trên blog của mình http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

Cũng lưu ý rằng trong 2009-09-19 lỗi cố định # 4197 về máy chủ-đảm bảo-an toàn-dir như vậy trong Emacs đến 23,2 workaround này là không cần thiết.

Theo Emacs phát hành gần đây 23,2 tôi có cảnh báo như vậy:

Cảnh báo (máy chủ): Sử dụng ~/.emacs.d/server để lưu trữ các tệp xác thực máy chủ Emacs. Thư mục trên hệ thống tập tin FAT32 KHÔNG an toàn chống giả mạo. Xem biến server-auth-dir để biết chi tiết.

Để khắc phục điều này như cảnh báo bạn có thể trỏ server-auth-dir sang phân vùng NTFS (%APPDATA% thường nằm Windows %SYSTEMDRIVE% và người dùng thường định dạng ổ đĩa hệ thống dưới dạng phân vùng NTFS):

(yêu cầu 'máy chủ)
(khi (và (eq window-system 'w32) (tệp-tồn tại-p (getenv "APPDATA"))))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(máy chủ bắt đầu)

27
2017-10-14 14:25



sử dụng emacs23 và windows vista 64b, điều này đã sửa nó cho tôi. Nếu không có máy chủ yêu cầu không hoạt động. - Mario F
Cảm ơn, điều này làm việc cho tôi trên Win7-64. Lưu ý với EmacsW32 bạn có thể bỏ qua máy chủ-bắt đầu, vì nó sẽ làm điều đó sau. - harpo
Điều này vẫn xảy ra trong Emacs 23.3.1 vì vậy tôi đã thay đổi điều kiện thành <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </ code> nhưng điều đó sẽ cần cập nhật nếu điều này không được khắc phục trong 23.4 .... Vì vậy, hãy xem nhận xét bên dưới bằng @ user160983 để bỏ qua phiên bản emacs-minor - djb
như tôi đã nhận xét về câu trả lời trước đó, vấn đề tồn tại trong emacs 24 nên điều kiện nên là (> = emacs-major-version 24) - mcheema
@mcheema tôi sửa chữa (>= emacs-major-version 23). Cảm ơn +1 - gavenkoa


Đây là lỗi Emacs đã biết trên Windows. Cách giải quyết là nhận xét ra dòng này trong máy chủ-đảm bảo-an toàn-dir trong server.el bạn sẽ muốn byte biên dịch lại sau khi thay đổi:

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

13
2018-05-20 01:56



Giải pháp của bạn khắc phục sự cố của tôi. Tôi sẽ điều tra thêm về sau và thêm những phát hiện của tôi ở đây. Cảm ơn! - λ Jonas Gorauskas


Để tránh hack trong thư mục lisp, bạn chỉ có thể thêm thông tin sau vào .emacs của bạn:

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


9
2017-08-21 18:32



Tôi đã có vấn đề trên với Emacs trong Cygwin và lệnh trên đã làm việc. - MikeHoss
vấn đề cũng xảy ra trong emacs 24 vì vậy có thể một (> = emacs-major-phiên bản 23) sẽ là thích hợp - mcheema
cho tôi trên Windows 7 với Emacs 24 điều này đã không hoạt động cho đến khi tôi thêm dòng (require 'server) phía trên mã - MostlyHarmless


Ngoài ra, bạn không muốn máy chủ được bắt đầu ở chế độ hàng loạt. trong tôi .emacs Do đó tôi sử dụng

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

và sau đó

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

Tuy nhiên, tính năng của máy chủ rất phức tạp: server-start ném khi % HOME% /. Emacs.d / máy chủ thư mục không tồn tại. Trong kế tiếp Emacs sẽ không khởi động lại! Giải pháp hiển nhiên là tạo thư mục còn thiếu và thử lại; Tôi tìm thấy giải pháp ở đâu đó trên mạng nhưng thực sự không thể nhớ được ở đâu. Các mã sau đây chạy thành công trong nhiều năm nay trên một số máy Windows của tôi:

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

Mã này cũng hoạt động khi chạy Emacs từ một cây gậy.

Hi vọng điêu nay co ich.


6
2017-08-10 11:20



Xin chào! Điều này không hoạt động trên Linux. command-line-args không bao giờ có đối số --batch của tôi. Những công việc này: (if (not noninteractive) (progn (require 'server) (server-start))) - gaizka
Được rồi cảm ơn. Vì vậy, sau đó chúng ta nên tinh chỉnh --batch-mode như (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Tôi sửa nó ở trên. - Andreas Spindler


Đã không làm việc cho tôi trong Windows 7.

Thay vào đó, tôi đọc các nhận xét trong máy chủ-đảm bảo-an toàn-dir và tiến hành việc sở hữu% forDer và thư mục con% APPDATA. Chúng thuộc sở hữu của quản trị viên địa phương, không phải bởi tôi.

Điều đó đã giúp!


5
2018-03-29 06:39



Để xây dựng: Đảm bảo rằng thư mục% HOME% \. Emacs.d \ server thuộc sở hữu của bạn, không phải bởi nhóm quản trị viên cục bộ. - Kristopher Johnson


Câu trả lời rất hữu ích từ gavenkoa. Tôi đang gặp sự cố này trên Emacs 24.1, Windows 2003.

Thật không may, ghi đè máy chủ-đảm bảo-an toàn-dir để trở thành một noop, như được đề xuất trong đoạn trích đầu tiên của bạn, không hoạt động cho tôi trong mọi tình huống. Cụ thể, nó không hoạt động khi được áp dụng trước (server-start) đã thực hiện ít nhất một lần, vì thực thi ban đầu cũng sẽ tạo thư mục, nếu nó không tồn tại. Với phiên bản noop, thư mục sẽ không được tạo ra chút nào.

Cách giải quyết làm việc cho tôi theo nghĩa là nó loại bỏ thông báo lỗi, trong khi vẫn tạo thư mục đúng cách, là đoạn mã sau, đặt trước (server-start) trong tệp khởi tạo Emacs của tôi. Nó đặt một lời khuyên xung quanh máy chủ-đảm bảo an toàn-dir để bỏ qua bất kỳ lỗi nào được nêu ra từ đó. Không giải quyết được nguyên nhân gốc rễ của vấn đề, nhưng đủ tốt cho tôi.

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

3
2018-06-12 15:21





Trong trường hợp điều này thỉnh thoảng xảy ra với mọi người, máy trạm của tôi vừa trải qua "di chuyển miền", thêm một quyền khác cho mỗi tệp trên hộp, sau đó tôi bắt đầu nhận được lỗi này. Sau khi tôi thêm biểu thức để giả ra "máy chủ-đảm bảo-an toàn-dir" này dừng lại thất bại.

(Nếu bạn đang băn khoăn, quá trình di chuyển sẽ diễn ra trong 2-3 bước. Người đầu tiên thêm quyền cho tôi vào miền mục tiêu, sau đó tôi được chuyển sang miền mục tiêu, sau đó họ có thể (tôi không chắc chắn về điều này ) xóa quyền cho miền cũ. Đó là một công ty lớn và nhiều người dùng, vì vậy họ đang thực hiện nó theo các bước riêng biệt.)


1
2017-08-09 23:15





lần cuối cùng tôi thử, tiện ích mở rộng vỏ "Take ownership" đã thực hiện công việc


1
2017-07-03 22:17





Bước dưới đây làm việc cho tôi: 1. Thực thi mã dưới đây dưới dạng tệp .reg. Emacs giành chiến thắng phiên bản sẽ xử lý bất kỳ giá trị trong registry như 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. Thêm mã bên dưới vào .emacs / init.el của bạn. Chìa khóa ở đây phải là "server-auth-dir".
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

Bởi các bước trên chế độ máy chủ hoạt động cho tôi một cách chính xác và hoàn hảo.


1
2018-01-02 16:51