特定のパッケージが適切にインストールされている間に環境をカスタマイズしたい。 elispにいくつかのパッケージがインストールされているかどうかをチェックするには?このような 何か?:パッケージがelispにインストールされているかどうかを確認するには?
(if (require 'ecb)
(progn (setq ....))
(message "ECB not installed!"))
特定のパッケージが適切にインストールされている間に環境をカスタマイズしたい。 elispにいくつかのパッケージがインストールされているかどうかをチェックするには?このような 何か?:パッケージがelispにインストールされているかどうかを確認するには?
(if (require 'ecb)
(progn (setq ....))
(message "ECB not installed!"))
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のロード開始時と終了時の通常のメッセージは表示されません。
それが失敗した場合に(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"))
なぜ "featurep"を使用しないのですか?
(featurep FEATURE &optional SUBFEATURE)
このEmacsにFEATUREが存在する場合は返します。
(if (featurep 'ecb)
(message "ECB is there!"))
これは既にロードされている機能(この特定の質問との関連性が低い)にのみ適用されます。 – phils
最も簡単な答えは、他の回答で述べたようにrequire
とeval-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))))
この質問は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))
。
それは価値があるので、チェックは ''noerror''が定義されているかどうかだけを調べるので、nil以外の値があれば動作します。私は自分で 't'を使っています。 – clintm
:noerrorは一般的なlispスタイルです。どの方がいいですか:-)。 – user239558
'AUCTeX'は必須ではないので、' AUCTeX'では動作しません。 'AUCTeX'に' package-installed-p'を使う必要があります。 –