2012-04-03 27 views
11

Tôi đang cố gắng kiểm tra xem server-running-p có sẵn trong tệp .emacs của tôi trước khi gọi không. Tôi đã có những điều sau đây:Cách kiểm tra xem chức năng (ví dụ: máy chủ chạy-p) có sẵn trong Emacs không?

(if (not (server-running-p)) 
    (server-start)) 

Nhưng trên một số máy tính mà tôi sử dụng Emacs, gọi (server-running-p) đưa ra một lỗi vì nói gọi là không có sẵn. Vì vậy, tôi muốn kiểm tra xem nếu server-running-p có sẵn trước khi gọi nó. Tôi nghĩ rằng boundp sẽ thực hiện việc thử nhưng hãy gọi số (boundp 'server-running-p) trả lại nil ngay cả khi cuộc gọi (server-running-p) thành công. Cách đúng để kiểm tra rằng việc gọi server-running-p sẽ không thành công ... hoặc ít nhất là để ngăn chặn lỗi nếu cuộc gọi được nói không thành công. (Và loại đối tượng kỳ lạ nào là server-running-p dù sao rằng boundp trả về nil, nhưng gọi nó thành công?)

Đây là trên Emacs 23.2.1, nếu có sự khác biệt.


Thực sự tìm thấy câu trả lời. Bạn phải sử dụng fboundp cho điều này thay vì boundp, vì một số lý do.

+3

Lý do là bạn có thể có hàm và biến có cùng tên (ví dụ: 'font-lock-mode'). Do đó bạn cần các hàm khác nhau để hỏi "Đây có phải là một biến không?" và "Đây có phải là một chức năng không?" – cjm

+0

Cảm ơn. Tôi đã hoàn toàn quên mất tính đặc thù của một số ngôn ngữ Lisp. Làm cho ý nghĩa hơn bây giờ. –

Trả lời

21

boundp kiểm tra xem có biến số không. Vì server-running-p là một chức năng , bạn sẽ muốn sử dụng fboundp. Giống như vậy:

(if (and (fboundp 'server-running-p) 
     (not (server-running-p))) 
    (server-start)) 
12

Cách đơn giản hơn là sử dụng "yêu cầu" để đảm bảo mã máy chủ được tải. Đây là những gì tôi sử dụng: gợi ý

(require 'server) 
(unless (server-running-p) 
    (server-start)) 
+2

Tôi cũng đang cố giữ các .emac tương thích với cả Emacs và XEmac. Trong trường hợp đó, việc sử dụng 'fbounpd' có vẻ an toàn hơn với tôi, phải không? –

+0

@ChristianHudon, đây không chỉ là về khả năng tương thích. Phiên bản này và phiên bản kia làm hai việc khác nhau. Cái này tải gói 'server' nếu nó chưa được tải. Phiên bản khác chỉ khởi động máy chủ nếu gói 'server' đã được tải ở nơi khác. Vì vậy, tôi nghĩ rằng phiên bản này là khép kín hơn. Tôi không biết về XEmacs, nhưng một sự thay thế tương thích hơn có thể là sử dụng '(tải" máy chủ ")' thay vì (thay vì '(yêu cầu 'máy chủ)', đó là). – harpo

3

ryuslash là thực sự hữu ích, nhưng tôi sửa đổi nó cho emacs của tôi:

(unless (and (fboundp 'server-running-p) 
      (server-running-p)) 
    (server-start)) 

này được máy chủ chạy ngay cả khi server.el vẫn chưa loaded- server-running-p chỉ được xác định khi server.el được tải và server-start được tải tự động.

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