2011-10-17 4 views

答えて

32

tripleeeの答えは、エラーの便利な例です...手に負えなくなってきていますこの場合、処理は不要ですが、不要です。

'noerrorは、任意の非ゼロの値にすることができ、もちろん、それはこの方法より説明だ
(when (require 'some-library nil 'noerror) 
    do-things) 

。私はしばしば:noerrorが使われているのを見ていますが、シンボルよりもキーワードの引数を使うことに特別な利点があるのか​​どうかはわかりません(コメント、誰ですか?

C source codeの組み込み関数が必要です。

機能機能がロードされていない場合は、FILENAMEからロード(FEATURE &オプションFILENAMEのNOERRORが必要です)。
FEATUREがリストfeaturesのメンバーでない場合は、機能
がロードされません。ファイルFILENAMEをロードしてください。
ファイル名が省略された場合は、この機能ののprintNameは、ファイル名として使用されて 、
loadはそのために、接尾辞.elcまたは .el
を付加し、この名前をロードしようとします。接尾辞が付いていない名前は使用されません。
接尾辞の完全なリストについては、get-load-suffixesを参照してください。
オプションの第3引数NOERRORがnil以外の場合、
はエラーを通知する代わりにファイルが見つからない場合はnilを返します。
通常、戻り値はFEATUREです。
FILENAMEのロード開始時と終了時の通常のメッセージは表示されません。

+1

それは価値があるので、チェックは ''noerror''が定義されているかどうかだけを調べるので、nil以外の値があれば動作します。私は自分で 't'を使っています。 – clintm

+4

:noerrorは一般的なlispスタイルです。どの方がいいですか:-)。 – user239558

+0

'AUCTeX'は必須ではないので、' AUCTeX'では動作しません。 'AUCTeX'に' package-installed-p'を使う必要があります。 –

6

それが失敗した場合に(require)は、エラーがスローされます。それは本当に必要なものでなければなりません。

ECBの動作が利用可能な場合にのみ設定したい場合は、主にecb-hookにstuffを追加します。これはEmacsパッケージを条件付きで設定する通常の方法です。

何のフックが使用できない、またはあなたが何らかの理由で手でそれをロールバックしたい場合は、あなたが本当に手でこれをロールしたい場合は、Aからのエラーをトラップすることができます

(eval-after-load 'ecb '(setq ecb-be-more-like-better-yes-p t)) 

のようなものを試してみてくださいcondition-caseはそう、あなたが内部の他のファイル操作をしないことを確認したいprogn内から任意のfile-errorをキャッチすること

(condition-case nil 
    (progn 
     (require 'ecb) 
     (setq ecb-be-more-like-better-yes-p t)) 
    (file-error (message "ECB not available; not configuring"))) 

注:このようなrequireに失敗しました。最終的に、あなたはcondition-case内だけrequireを入れて、あなたのオリジナルのifフォームの条件としてそれを使用することもできますが、これはすでに

(if (condition-case nil (require 'ecb) (error nil)) 
    (setq ecb-be-more-like-better-yes-p t) 
(message "ECB not available; not configuring")) 
+0

'eval-after-load'はパッケージをロードしていないようです。そこで、私は以下の答えに変更しました:(いつ(...)) – Vivodo

+0

ええ、 'eval-after-load'の目的は、指定されたパッケージをロードするときに実行する遅延アクションを指定することです。これは、 'ecb'の読み込みを伴わないタスク(バッチバイトのコンパイルは永続的な例です)のためにEmacsを起動するときに不必要なセットアップを避けるのに便利です。 – tripleee

3

なぜ "featurep"を使用しないのですか?

(featurep FEATURE &optional SUBFEATURE) 

このEmacsにFEATUREが存在する場合は返します。

(if (featurep 'ecb) 
    (message "ECB is there!")) 
+1

これは既にロードされている機能(この特定の質問との関連性が低い)にのみ適用されます。 – phils

1

最も簡単な答えは、他の回答で述べたようにrequireeval-after-loadを使用することです。

ただし、他のマイナーモードをアクティブにしたいモードフックによって呼び出される関数のように、必ずしも便利なわけではありませんが、そのパッケージがインストールされている場合のみです。この場合、featurepが該当します。

Emacsパッケージは起動時間を短縮するために自動ロードをますます使用します。 requireを使用してパッケージの存在をテストすると、ファイルをロードするコストがかかります。 ELPA/MELPA/Marmaladeパッケージ(バージョン24以降はデフォルトで利用可能)を使用している場合、まだアンロードされた状態で多くのパッケージが利用可能ですが、パッケージfooと自動ロードではfoo-autoloadsという機能が提供されます。私はパッケージがすでにロードされているか、または自動ロードに設定されているかどうかをテストするのに便利な関数を書いています。

 
(defun autofeaturep (feature) 
    "For a feature symbol 'foo, return a result equivalent to: 
(or (featurep 'foo-autoloads) (featurep 'foo)) 
Does not support subfeatures." 
    (catch 'result 
    (let ((feature-name (symbol-name feature))) 
     (unless (string-match "-autoloads$" feature-name) 
     (let ((feature-autoloads (intern-soft (concat feature-name "-autoloads")))) 
      (when (and feature-autoloads (featurep feature-autoloads)) 
      (throw 'result t)))) 
     (featurep feature)))) 
0

この質問は4年遅れですが、ここではこれを行う簡単なマクロがあります。例えば

(defmacro when-feature-loaded (feature &rest body) 
    "Executes BODY if and only if FEATURE is loaded." 
    (declare (indent defun)) 
    `(when (featurep ,module) 
    @,body)) 

(when-feature-loaded 'foo 
    (message "foo is loaded!")) 

ここで「他」の場合と、別のバージョンでは、あなたにもそれを処理する必要がある場合には、です。 package.elパッケージがインストールされている場合、package-installed-pを使用確認する方法を疑問に思う人々のために

(defmacro if-feature-loaded (module then-form else-form) 
    "Executes THEN-FORM if and only if MODULE is already loaded, otherwise executes ELSE-FORM." 
    (declare (indent 2)) 
    `(if (featurep ,module) 
     ,then-form 
    ,else-form)) 
1

関連する問題