defcustomを適切に使用するには?


16

ほとんどのEmacsユーザーと同様に、変数を変更してモードをカスタマイズしました。私が思いつかなかったのは、カスタマイズ可能なあれこれの背後にあるプログラミング精神全体です。これは、eshellのソースコードの一部を調べ始めたときに実現しました。私はelispのプログラマーないんだけど、特にem-ls.el使用するようでdefcustomdefgroupこれはelispのコードが使用することをグローバルに定義された変数の影の世界のように見えるだろうなど、。だから、1つの質問は、defcustom(カスタマイズ可能な)グローバル変数を行う別の方法を使用していますか?

誰がdefcustom、背後にあるアイデア全体を適切に使用する(最初に理解する)方法、使用するとき、なぜ、いつ使用しないかについて点灯するように私に指摘できますか?たぶん、elisp初心者向けの初心者の例でしょう。


あなたが求めていることを明確にできますか?customize施設を使用するタイミングと手動でカスタマイズするタイミングを知りたいですか?または、モードの作成に興味がありますか?後者は、などdefcustomを使用して実際に自分自身を見つけることができる状況です。
ダン

回答:


20

カスタマイズシステムが内蔵されているのEmacsの機能を正確あなたが記述プログラミングの問題は、彼らのエディタを設定するには、平均的なユーザーのための理想的な方法ではないかもしれない解決するために設計。

カスタマイズ機能への主要なエントリポイントはM-x customize RET(またはOptions > Customize Emacs > Top-level Customization Groupメニューから)です。そこから、設定を調整するためのインタラクティブなメニューシステムが表示されます。このインターフェイスは、すべての設定が正しいタイプ(数値、文字列、色など)であることを強制し、ユーザーがプログラムでEmacsを構成するときに発生する主なエラーの原因を回避します。ユーザーがUIで行った変更を保持することを選択した場合、設定はユーザーの初期化ファイルの特別なセクションに保存されます(読み取り:).emacs

defcustomは、低レベルのEmacs Lisp機能のラッパーでありdefvar、変数宣言し、カスタマイズインターフェイス内で表示できるようにします。また、開発者は、適切なインタラクティブコントロールを表示するために必要な追加のメタデータを提供できます。つまり、この変数に格納される値のタイプは何ですか。任意の文字列?数?オプションの固定セットからの選択?などdefgroupは、これらのカスタマイズ可能なオプションのグループ化構造であるため、それらを適切な階層に配置できます。

この機能は、データの一部をライブラリの内部詳細ではなく、ユーザーにとって構成可能なオプションと見なす必要がある場合に使用する必要があります。

これは私の小さなライブラリから引用した簡単な例です:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

defgroupトップレベルの下のカスタマイズインターフェース内に新しいグループを作成するconvenience項目。次に、可能なチェックボックスの状態を保存する変数が必要でした。使用することもできましたがdefvar、これを簡単にカスタマイズできるようにしたいので、を使用することにしましたdefcustom。この:group部分は、以前に定義されたグループに属している:typeことを示し、文字列のシーケンスであることを示します。デフォルト値と説明もあります。ユーザーが入力した値を変換するための追加機能もあります(ここには表示されていません)。

を実行M-x customize RETしてに移動するConvenience > Checkboxと、次のように表示されます。

カスタマイズインターフェース

これは世界で最も美しいインターフェイスではありませんが、「チェックボックスの状態」の値をcheckbox-states内部的にカスタマイズするための対話型ツールがあることに注意してください。現在の文字列値とINS(挿入DEL)ボタンおよび(削除)ボタンが表示され、編集ボックスで文字列値を編集できます。完了したら、変更を適用するか、元に戻すか、将来のセッションのために適用して保存するかを決定できます。


2
良い投稿です!カスタマイズ(およびdefcustom)の最も重要な利点は、次のことを自動的に処理することです:(1)型チェック、変数に誤った値を割り当てないdefcustomようにするためにチェック)、(2)初期化:initialize)、およびctions(トリガー):set)を更新します。
ドリュー

ありがとう!あなたの提案を反映するために、投稿を更新しました。
カムデス

7

defcustomの使用は、(カスタマイズ可能な)グローバル変数を行う別の方法ですか?

はい。特に、コードのユーザーがMxカスタマイズインターフェイスを使用して変数を簡単に変更できるようにする場合。

defcustomは、ドキュメントとタイプセーフティの2つの重要な利点をユーザーに提供します。ドキュメントがあると便利です。型の安全性により、変数が使用できる有効な値の種類を指定できます。

もちろん、defvarは、自分でカスタマイズするだけで、より広い使用法を予想していなければ大丈夫です。しかし、いくつかの人は、徹底的にdefcustomに固執することを教え込む良い習慣であると言うでしょう。

誰かが私を適切に使用する方法に照らすように指すことができます...

defcustomマニュアルページには、さらに明確な説明があります。マニュアルのカスタマイズトピックに詳細が記載されています。

...いつ使用するか、なぜ、いつ使用しないのか?

defvarとsetq でリロードの問題に対処する必要がないため、個人的にはdefcustomの開発中の面倒さが少なくなっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.