考慮下面的Emacs Lisp代碼,它定義了一個自定義的變量,它可以是一個文字字符串或正則表達式:如何在Elisp自定義聲明中消除字符串和正則表達式的歧義?
(defcustom myvar "" "String or regexp"
:type '(choice (string :tag "String")
(regexp :tag "Regexp")))
這工作在自定義界面(customize-variable 'myvar)
就好了,但後來變得無法分辨該變量是否設置爲字符串或正則表達式。即使自定義界面認爲它是一個字符串,無論如何。如果使用Custom將變量設置爲正則表達式,然後關閉並重新打開該變量的自定義緩衝區,它將再次表示它是一個字符串。
那麼,有沒有什麼辦法來消除這個問題,以確保當通過自定義將變量設置爲正則表達式時,我的代碼可以確定它意味着是正則表達式而不是簡單的字符串?
理想情況下,我想要某種機制將字符串內部存儲爲(cons 'string VALUE)
,其中VALUE是用戶鍵入的字符串,同樣也有內部存儲爲(cons 'regexp VALUE)
的正則表達式。
編輯
從我的搜索,我發現,你可以提供給define-widget
的:value-to-internal
和:value-to-external
性質,但我不能想出如何在不導致錯誤的方式使用它們當我嘗試自定義結果變量時。
我想出瞭如何做我想要的。我創造性地使用':format'屬性在Customize界面中隱藏不必要的重複信息。實質上,因爲我已經將文本字段標記爲「字符串」或「正則表達式」。我用':format「」'隱藏const。所以我有字符串大小寫的'(cons:tag「String」(const:format「」string)string)「,類似於正則表達式的情況,然後我把它們放在'choice'中。我將盡快發佈完整的代碼,作爲['ido-ubiquitous'](http://marmalade-repo.org/packages/ido-ubiquitous)軟件包2.0版更新的一部分。 –