Initial commit
This commit is contained in:
138
skills/widget/README.md
Normal file
138
skills/widget/README.md
Normal file
@@ -0,0 +1,138 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user