1

次の Emacs Lisp コードを考えてみましょう。このコードは、リテラル文字列または正規表現のいずれかになるカスタマイズ可能な変数を定義しています。

(defcustom myvar "" "String or regexp"
  :type '(choice (string :tag "String")
                 (regexp :tag "Regexp")))

これは Custom インターフェイス(customize-variable 'myvar)では問題なく機能しますが、変数が文字列に設定されているか正規表現に設定されているかを判別できなくなります。Custom インターフェイスでさえ、何があっても文字列であると考えています。カスタムを使用して変数を正規表現に設定し、変数のカスタム バッファを閉じて再度開くと、再び文字列であると表示されます。

だから、これを明確にする方法はありますか? カスタムを介して変数が正規表現に設定されている場合、私のコードは、それが単純な文字列ではなく正規表現であることを意図していると判断できますか?

理想的には、文字列を として内部的に格納する何らかのメカニズムが必要(cons 'string VALUE)です。ここで、 VALUE はユーザーが入力する文字列であり、同様に正規表現を として内部的に格納し(cons 'regexp VALUE)ます。

編集

検索の結果、 に指定できる:value-to-internalおよび:value-to-externalプロパティが見つかりましたdefine-widgetが、結果の変数をカスタマイズしようとしたときにエラーが発生しない方法でそれらを使用する方法がわかりません。

4

1 に答える 1

1

help-gnu-emacsからの回答を言い換える--

あなたが提案したことをしてください:cons文字列の代わりに a を使用してください。

正規表現として使用されるテキストと任意のテキストをプログラムで区別する何らかの方法が必要です。その意図はカスタマイズ時にわかります。ユーザーはどちらかを選択します。

ユーザーの選択が異なる (区別可能な) 値になることを確認する必要があります。cons(a) テキストと (b) タイプ/選択/用途を記録することは、そのための良い方法です。

于 2013-08-26T04:10:47.310 に答える