2010-09-17 31 views
8

Tôi đang cố gắng tìm một cái móc trong Emacs, nó sẽ kích hoạt ngay trước khi máy chủ emacs tắt máy duyên dáng. tôi đã cố gắng kill-emacs-query-chức năng, kill-emacs-móc, máy chủ thực hiện-móc với elisp như:Móc treo trên thiết bị giết

(add-hook 'server-done-hook 
      '(lambda() 
      (savehist-save) 
      ) 
     ) 

... nhưng không ai trong số họ được gọi khi hệ điều hành tắt, vì vậy lịch sử là chưa được lưu.

Có thể ai đó có thể đưa ra gợi ý?

P.S. Tôi đang sử dụng gói Gentoo Linux, emacs-vcs-23.2.9999, chỉ thiết bị đầu cuối. Để kiểm tra hành vi mong muốn, Emacs bị ngừng sử dụng tiện ích start-stop-daemon.

Trả lời

14

Nơi phù hợp để chạy thứ gì đó trước khi Emacs tắt là kill-emacs-query-function nếu bạn muốn có thể hủy tắt máy hoặc kill-emacs-hook nếu không. Vấn đề bạn đang gặp phải là hệ điều hành của bạn không thông báo cho Emacs để tắt một cách duyên dáng theo cách mà Emacs hiểu, hoặc để xem nó theo cách khác, Emacs không hiểu yêu cầu của hệ điều hành của bạn để suht xuống một cách duyên dáng.

Một cách duyên dáng để tắt Emacs 23 từ bên ngoài là chạy emacsclient -n -e '(kill-emacs)'. Đó rõ ràng không phải là một cách chung chung để nói một chương trình để tắt một cách duyên dáng.

Cách thông thường để tắt quy trình một cách duyên dáng trên Unix là gửi tín hiệu SIGHUP hoặc SIGTERM. Thật không may, Emacs xử lý gần như tất cả các tín hiệu như là gây tử vong, và chỉ chạy một tiết kiệm tự động khẩn cấp và không có mã lisp khi nó nhận được chúng. Đây không phải là cấu hình từ lisp. A different behavior has been requested, but turned down.

Giải pháp một phần (found here) là chạy móc lưu phiên trong delete-frame-functions. Móc này có thể được chạy trước khi hệ thống tắt trình tự, hoặc khi bạn đóng khung cuối cùng của bạn hoặc khi máy chủ X chết (lấy thiết bị đầu cuối của bạn với họ nếu bạn chạy Emacs trong một thiết bị đầu cuối). Hãy chắc chắn rằng bạn không chạy móc mà giết chết máy chủ trong delete-frame-functions.

Nhân tiện, nếu bạn định sử dụng móc chính xác này, hãy lưu ý rằng mã của bạn là cách viết phức tạp (add-hook 'server-done-hook 'savehist-save) và điều đó không hữu ích vì đã có savehist-autosave trong kill-emacs-hook.

+0

Tôi đã thêm thông tin OS. Vâng, tôi biết đó là một chút phức tạp sau đó cần phải được. – MageSlayer

+0

Nếu bạn gửi đến emacs một tín hiệu QUIT, emacs có thể tắt một cách duyên dáng như '(kill-emacs)'. ví dụ. pkill -3 emacs HOẶC pkill -QUIT emacs, Thật không may, một số hệ điều hành gửi tín hiệu TERM, emacs không hoạt động tốt với nó. – zw963

Các vấn đề liên quan