Files
gh-hugoduncan-library-skill…/skills/widget/README.md
2025-11-29 18:47:18 +08:00

139 lines
3.1 KiB
Markdown

# Emacs Widget Library
Build interactive forms and UI elements in Emacs buffers.
## Quick Start
```elisp
(require 'widget)
(eval-when-compile
(require 'wid-edit))
(defun my-simple-form ()
(interactive)
(switch-to-buffer "*My Form*")
(kill-all-local-variables)
(erase-buffer)
(remove-overlays)
;; Create widgets
(widget-insert "Contact Form\n\n")
(widget-create 'editable-field
:format "Name: %v\n"
:size 30)
(widget-insert "\n")
(widget-create 'editable-field
:format "Email: %v\n"
:size 40)
(widget-insert "\n\n")
(widget-create 'push-button
:notify (lambda (&rest ignore)
(message "Form submitted!"))
"Submit")
;; Enable interaction
(use-local-map widget-keymap)
(widget-setup))
```
## Key Widget Types
**Text Input:**
- `editable-field` - Single-line text
- `text` - Multi-line text area
**Buttons:**
- `push-button` - Clickable action button
- `link` - Hyperlink with action
**Selection:**
- `checkbox` - Boolean toggle
- `radio-button-choice` - Single choice from options
- `menu-choice` - Dropdown selection
- `checklist` - Multiple selections
**Lists:**
- `editable-list` - Dynamic list with add/remove
## Essential Functions
```elisp
;; Create widget
(widget-create TYPE &rest ARGS)
;; Enable widgets (required after creation)
(widget-setup)
;; Get/set values
(widget-value WIDGET)
(widget-value-set WIDGET VALUE)
;; Navigate
(widget-forward) ; TAB
(widget-backward) ; S-TAB
;; Properties
(widget-get WIDGET PROPERTY)
(widget-put WIDGET PROPERTY VALUE)
```
## Common Pattern
```elisp
(defun my-widget-interface ()
(interactive)
(let (field1 field2)
;; Setup buffer
(switch-to-buffer "*Interface*")
(kill-all-local-variables)
(erase-buffer)
(remove-overlays)
;; Build UI
(widget-insert "Title\n\n")
(setq field1 (widget-create 'editable-field "default"))
(widget-insert "\n")
(setq field2 (widget-create 'checkbox t))
;; Submit button
(widget-create 'push-button
:notify (lambda (&rest _)
(message "Values: %S %S"
(widget-value field1)
(widget-value field2)))
"Submit")
;; Activate
(use-local-map widget-keymap)
(widget-setup)))
```
## Using the Skill
Invoke this skill when building:
- Custom configuration interfaces
- Interactive forms
- Settings editors
- Data entry dialogs
The skill provides comprehensive coverage of widget types, API functions, patterns, and real-world examples.
## Learning Path
1. **Basics** - Simple forms with editable-field and push-button
2. **Selection** - checkbox, radio-button-choice, menu-choice
3. **Callbacks** - :notify handlers and value retrieval
4. **Validation** - Input validation and error handling
5. **Advanced** - Custom widgets and complex interfaces
## Resources
- Emacs Info: `C-h i m Widget RET`
- Source: `wid-edit.el` in Emacs distribution
- Built-in demo: `widget-example` (if available)