2012-04-03 28 views
11

我試圖在調用它之前檢查我的.emacs文件中是否有server-running-p。我已經有以下幾點:因爲所述呼叫不可用如何檢查一個函數(例如server-running-p)在Emacs下是否可用?

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

但在某些電腦上,我使用Emacs,調用(server-running-p)給出了一個錯誤。所以我想在調用之前檢查server-running-p是否可用。我認爲boundp會嘗試,但即使(server-running-p)調用成功,調用(boundp 'server-running-p)也會返回nil。如果呼叫失敗,檢查撥打server-running-p的正確方法不會失敗......或者至少可以抑制錯誤。 (還有什麼奇怪的對象server-running-p無論如何boundp返回nil,但調用它成功?)

這是在Emacs 23.2.1,如果它有任何區別。


其實找到了答案。出於某種原因,您必須使用fboundp代替boundp

+3

原因是你可以有一個同名的函數和變量(例如'font-lock-mode')。因此你需要不同的功能來問「這是一個變量嗎?」和「這是一個功能?」 – cjm 2012-04-03 19:30:52

+0

謝謝。我完全忘記了一些Lisp語言的特殊性。現在更有意義。 – 2012-04-04 20:41:27

回答

21

boundp檢查以查看變量是否被綁定。由於server-running-p函數您將要使用fboundp。像這樣:

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

更簡單的方法是使用「require」來確保服務器代碼已加載。下面是我用什麼:

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

我也試圖讓我的.emacs兼容Emacs和XEmacs。在那種情況下,使用'fbounpd'似乎對我更安全,不是嗎? – 2012-07-04 21:32:57

+0

@ChristianHudon,這不僅僅是兼容性。這個版本和另一個版本做兩件不同的事情。如果它尚未加載,則加載'server'包。另一個版本只在服務器包已經加載到其他地方時才啓動服務器。所以我認爲這個版本更加獨立。我不知道XEmacs,但是一個更兼容的替代方案可能是使用'(load「server」)'而不是'(require'server)',就是這樣)。 – harpo 2016-09-01 16:17:15

3

ryuslash的建議是真正有用的,但是我修改了我的.emacs:

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

這得到運行,即使server.el一直沒有在裝載時服務器server-running-p僅在加載server.el時定義,而server-start自動加載。

相關問題