I forgot to attach the screenshot of the in-error appearance in the customize buffer when using these lambdas to convert betwixt internal and internal values. In the customize buffer, the button appears as invalid (nil). Perhaps my pcase is incorrect, but it's rather simple matching so I don't see why it'd be the cause (though it /would/ not match any of the choice-items if none of the patterns are matching [nil would be returned]). On 7/14/23 00:52, Bryce Carson wrote: > > Further, I can't seem to get these functions to work /as documented/ > or expected. > > Without these defined when I'm creating a widget with the following > code, I do get a button but the internal value is displayed in the > clickable button. I'd like the external value to be displayed in the > button %v, just as the menu-tag is is "externally facing". > > <>= > (define-widget 'project-widget 'list > :tag (let ((s "\n\tProject")) > (put-text-property 0 (length s) 'face 'bold s) s) > :format "%t\n%v " > :offset 0 > :indent 0 > :convert-widget 'widget-types-convert-widget > :args '((menu-choice > :tag "EmacSQL-supported backend" > :format "%[%t%]: %[%v%]" > :value "sqlite" > :value-to-external <> > :value-to-internal <> > (choice-item :menu-tag "MySQL" :value "mysql") > (choice-item :menu-tag "PostgreSQL" :value "postgresql") > (choice-item :menu-tag "SQLite" :value "sqlite")))) > <>= > (lambda (widget internal-value) > "Converts lowercase, internal values to the casing of trademarks." > (pcase internal-value > ("mysql" "MySQL") > ("sqlite" "SQLite") > ("postgresql" "PostgreSQL"))) > <>= > (lambda (widget external-value) > "Converts the casing of trademarked names to lowercase, internal values." > (pcase external-value > ("MySQL" "mysql") > ("SQLite" "sqlite") > > On 7/14/23 00:32, Bryce Carson wrote: >> >> In the section /Defining New Widgets/, the following quotation >> reveals a bug, I believe. I added emphasis for the last sentence of >> each description of the keywords. I believe that for the >> :value-to-external function, the last sentence is not supposed to be >> present. >> >> :value-to-internal >> Function to convert the value to the internal format. The function takes two >> arguments, a widget and an external value, and returns the internal value./The function is called on the present :value when the widget is >> created, and on any value set later with widget-value-set./ >> :value-to-external >> Function to convert the value to the external format. The function takes two >> arguments, a widget and an internal value, and returns the external value./The function is called on the present :value when the widget is >> created, and on any value set later with widget-value-set./ >> >> It looks like the author or editor of the descriptions coped them, >> which is fine. It doesn't make sense that :value-to-external would be >> called when the widget is created, nor when new values are set with >> widget-value-set. >> >> Other places in the manual state that the value of the :value >> keyword, when creating or defining widget, should be in the external >> form, more evidence that the last sentence is a bug. >> > -- > "It's a GNU system, I don't know this!" > ||--- Mirror universe Lex Murphy, in Cenozoic Zoo -- "It's a GNU system, I don't know this!" ||--- Mirror universe Lex Murphy, in Cenozoic Zoo