5

パッケージに進化する elisp ファイルを作成しているので、その変数の一部をdefcustomステートメントに変換して文書化しています。これらのdefcustom変数のいくつかは関連しており、カスタマイズ システムを介して入力された値を検証して、関係が成り立つことを確認したいと思います。

これが私が持っているものの例です:

(defcustom widget-canonical-names '("my_widget" . "widget_assembly 8911_j4")
  "Documentation"
  :type '(alist :key-type (string :tag "Widget's short name")
                :value-type (string :tag "Full widget name"))
  :risky nil
  :group 'widgets)
(defcustom widget-colors '("my_widget" . "brown")
  "Documentation"
  :type '(alist :key-type (string :tag "Widget's short name")
                :value-type (color :tag "color of the widget"))
  :risky nil
  :group 'widgets)
(defcustom widget-paths '("my_widget" . "~/widgets")
  "Documentation"
  :type '(alist :key-type (string :tag "Widget's short name")
                :value-type (directory :tag "support files for widget"))
  :risky nil
  :group 'widgets)

ウィジェットにはさまざまな設定があり、ウィジェットの短い名前だけでウィジェットの任意の設定にアクセスできる必要があります。widget-pathsユーザーがリストにないウィジェット名を入力した場合、またはリストにwidget-colorsないウィジェット名を入力した場合にwidget-canonical-names、"本気ですか?" 警告が表示され、一致しない名前の入力について警告されます。このような検証機能を自分defcustomの にアタッチできますか? もしそうなら、その構文は何ですか?

もちろん、理想的なのは、ユーザーに短い名前を一度入力させることですが、「複合型」の elisp ドキュメントからその方法を理解できません。defcustomしたがって、私の質問に対するより良い答えは、この Python dict に似たデータ構造を設定する方法を教えてくれるでしょう:

customized_widgets = {
    "my_widget": { "canonical_name": "widget_assembly 8911_j4",
                   "widget_color": "brown",
                   "widget_path": "~/widgets",
                 },
    "another_widget": { "canonical_name" : "widget_obsolete 11.0",
                        "widget_color": "blue",
                        "widget_path": "~/blue_widgets",
                      },
     }

では、アクセスに使用されるデータに従って設定がグループ化される場所、またはユーザーが矛盾したデータを入力している可能性がある場合に検証機能がユーザーに警告する場所など、希望する動作を得るにはどうすればよいでしょうか?

4

1 に答える 1

5

これは、その Python 構造に最も近い Emacs の等価物を定義します。dict は連想リストとして表され、内側の dict の固定キーはシンボルとして表されます。

(defcustom my-customized-widgets ()
  "My widget customization alist"
  :type '(alist
          :tag "Widgets"
          :key-type (string :tag "Short name")
          :value-type
          (set
           :format "%v"
           :entry-format "%b %v"
           (cons :format "%v"
                 (const :format "" widget-canonical-name)
                 (string :tag "CName"))
           (cons :format "%v"
                 (const :format "" widget-color)
                 (color :tag "Color"))
           (cons :format "%v"
                 (const :format "" widget-path)
                 (directory :tag " Path"))))
  :group 'widgets)
于 2012-09-14T00:42:49.480 に答える