Function: ibut:program
ibut:program is a byte-compiled function defined in hbut.el.
Signature
(ibut:program NAME ACTYPE &rest ARGS)
Documentation
Programmatically create an implicit Hyperbole button at point.
Create button from NAME, ACTYPE (action type), and optional actype ARGS. Insert NAME text at point surrounded by <[ ]> delimiters, adding any necessary instance number of the button after the NAME. ACTYPE may be a Hyperbole action type name (from defact) or an Emacs Lisp function, followed by a list of arguments for the actype, aside from the button NAME which is automatically provided as the first argument.
For interactive creation, use hui:ibut-create instead.
Source Code
;; Defined in ~/.emacs.d/elpa/hyperbole-20260414.325/hbut.el
(defun ibut:program (name actype &rest args)
"Programmatically create an implicit Hyperbole button at point.
Create button from NAME, ACTYPE (action type), and optional actype ARGS.
Insert NAME text at point surrounded by <[ ]> delimiters, adding any
necessary instance number of the button after the NAME. ACTYPE may
be a Hyperbole action type name (from defact) or an Emacs Lisp
function, followed by a list of arguments for the actype, aside from
the button NAME which is automatically provided as the first argument.
For interactive creation, use `hui:ibut-create' instead."
(hui:buf-writable-err (current-buffer) "ibut:program")
(when (ebut:at-p)
(error "(ibut:program): Move off explicit button at point to create an implicit button"))
(let ((ibut (ibut:at-p)))
;; Throw an error if on a named or delimited Hyperbole button since
;; cannot create another button within such contexts.
(when ibut
(let ((name (hattr:get ibut 'name))
(name-start (hattr:get ibut 'name-start))
(lbl (hbut:key-to-label (hattr:get ibut 'lbl-key)))
(lbl-start (hattr:get ibut 'lbl-start))
(lbl-end (hattr:get ibut 'lbl-end)))
(when (or name lbl (and lbl-start lbl-end))
(error "(ibut:program): Cannot nest an ibut within the existing button: '%s'"
(or name lbl (buffer-substring-no-properties (or name-start lbl-start) lbl-end))))))
(save-excursion
(let ((but-buf (current-buffer))
(actype-sym (actype:action actype)))
(hui:buf-writable-err but-buf "ibut:program")
(hattr:clear 'hbut:current)
(hattr:set 'hbut:current 'name name)
(hattr:set 'hbut:current 'categ 'implicit)
(hattr:set 'hbut:current 'loc (hui:key-src but-buf))
(hattr:set 'hbut:current 'dir (hui:key-dir but-buf))
(if (or (and actype-sym (fboundp actype-sym))
(functionp actype))
(hattr:set 'hbut:current 'actype actype)
(error "Actype arg must be a bound symbol (not a string): %S" actype))
(hattr:set 'hbut:current 'args args)
(condition-case err
(ibut:operate)
(error "(ibut:program): name: %S actype: %S args: %S - %S" name actype args err))))))