2012-04-03 7 views
11

Ich versuche zu überprüfen, ob server-running-p in meiner .emacs-Datei verfügbar ist, bevor Sie es aufrufen. Ich habe bereits folgendes:Wie überprüft man, ob eine Funktion (z. B. Server-running-p) unter Emacs verfügbar ist?

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

Aber auf einigen Computern, auf denen ich Emacs verwenden, ruft (server-running-p) gibt einen Fehler, da der Anruf nicht verfügbar ist. Also ich möchte überprüfen, ob server-running-p verfügbar ist, bevor Sie es aufrufen. Ich dachte, boundp würde den Versuch tun, aber (boundp 'server-running-p) Aufruf nil aufrufen, obwohl die (server-running-p) Aufruf erfolgreich ist. Was ist der richtige Weg zu überprüfen, dass der Aufruf server-running-p wird nicht fehlschlagen ... oder zumindest den Fehler zu unterdrücken, wenn der Anruf fehlschlägt. (Und welche Art von seltsamen Objekt ist server-running-p trotzdem, dass boundp kehrt nil, aber nannte es gelingt?)

Dies ist auf Emacs 23.2.1, ob es einen Unterschied macht.


Eigentlich die Antwort gefunden. Sie müssen dafür fboundp anstatt boundp aus irgendeinem Grund verwenden.

+3

Der Grund ist, dass Sie eine Funktion und eine Variable mit demselben Namen haben können (z. B. 'font-lock-mode'). Daher brauchen Sie verschiedene Funktionen zu fragen "Ist das eine Variable?" und "Ist das eine Funktion?" – cjm

+0

Danke. Ich hatte diese Besonderheit einiger Lisp-Sprachen völlig vergessen. Macht jetzt mehr Sinn. –

Antwort

21

boundp überprüft, ob eine Variable gebunden ist. Da server-running-p eine Funktion ist, möchten Sie fboundp verwenden. Wie so:

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

Eine einfachere Art und Weise zu verwenden ist „erfordern“, um sicherzustellen, dass der Server-Code geladen wird. Hier ist, was ich benutze:

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

Ich versuche auch, meine .emacs kompatibel mit Emacs und XEmacs zu halten. In diesem Fall scheint 'fbounpd' sicherer für mich zu sein, nicht wahr? –

+0

@ChristianHudon, es geht nicht nur um Kompatibilität. Diese Version und die andere machen zwei verschiedene Dinge. Dieser lädt das 'server'-Paket, falls es nicht bereits geladen war. Die andere Version startet den Server nur, wenn das 'server'-Paket bereits an anderer Stelle geladen wurde. Ich denke also, diese Version ist eigenständiger. Ich weiß nichts über XEmacs, aber eine kompatiblere Alternative könnte sein, stattdessen '(load 'server") 'anstelle von' (require' server) 'zu verwenden. – harpo

3

ryuslash Vorschlag wirklich hilfreich war, aber ich verändert es für meine .emacs:

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

Hierdurch wird der Server ausgeführt wird, auch wenn server.el nicht loaded- gewesen server-running-p ist nur definiert, wenn server.el geladen ist und server-start automatisch geladen wird.

Verwandte Themen