Function: treemacs--execute-button-action
treemacs--execute-button-action is a macro defined in
treemacs-macros.el.
Signature
(treemacs--execute-button-action &key NO-MATCH-EXPLANATION WINDOW SPLIT-FUNCTION ENSURE-WINDOW-SPLIT DIR-ACTION FILE-ACTION TAG-SECTION-ACTION TAG-ACTION WINDOW-ARG)
Documentation
Infrastructure macro for setting up actions on different button states.
Fetches the currently selected button and verifies it's in the correct state based on the given state actions.
If it isn't it will log NO-MATCH-EXPLANATION, if it is it selects WINDOW (or
next-window if none is given) and splits it with SPLIT-FUNCTION if given.
If ENSURE-WINDOW-SPLIT is non-nil treemacs will vertically split the window if treemacs is the only window to make sure a buffer is opened next to it, not under or below it.
DIR-ACTION, FILE-ACTION, TAG-SECTION-ACTION and TAG-ACTION are inserted into a
pcase statement matching the buttons state. Project root nodes are treated
the same common directory nodes.
WINDOW-ARG determines whether the treemacs windows should remain selected,
(single prefix arg), or deleted (double prefix arg).
Source Code
;; Defined in ~/.emacs.d/elpa/treemacs-20251226.1307/treemacs-macros.el
(cl-defmacro treemacs--execute-button-action
(&key no-match-explanation
window
split-function
ensure-window-split
dir-action
file-action
tag-section-action
tag-action
window-arg)
"Infrastructure macro for setting up actions on different button states.
Fetches the currently selected button and verifies it's in the correct state
based on the given state actions.
If it isn't it will log NO-MATCH-EXPLANATION, if it is it selects WINDOW (or
`next-window' if none is given) and splits it with SPLIT-FUNCTION if given.
If ENSURE-WINDOW-SPLIT is non-nil treemacs will vertically split the window if
treemacs is the only window to make sure a buffer is opened next to it, not
under or below it.
DIR-ACTION, FILE-ACTION, TAG-SECTION-ACTION and TAG-ACTION are inserted into a
`pcase' statement matching the buttons state. Project root nodes are treated
the same common directory nodes.
WINDOW-ARG determines whether the treemacs windows should remain selected,
\(single prefix arg), or deleted (double prefix arg)."
(declare (debug (&rest [sexp form])))
(let ((valid-states (list)))
(when dir-action
(push 'root-node-open valid-states)
(push 'root-node-closed valid-states)
(push 'dir-node-open valid-states)
(push 'dir-node-closed valid-states))
(when file-action
(push 'file-node-open valid-states)
(push 'file-node-closed valid-states))
(when tag-section-action
(push 'tag-node-open valid-states)
(push 'tag-node-closed valid-states))
(when tag-action
(push 'tag-node valid-states))
`(-when-let (btn (treemacs-current-button))
(treemacs-without-following
(let* ((state (treemacs-button-get btn :state))
(current-window (selected-window)))
(if (and (not (memq state ',valid-states))
(not (get state :treemacs-visit-action)))
(treemacs-pulse-on-failure "%s" ,no-match-explanation)
(progn
,@(if ensure-window-split
`((when (one-window-p)
(save-selected-window
(split-window nil nil (if (eq 'left treemacs-position) 'right 'left))))))
(select-window (or ,window (next-window (selected-window) nil nil)))
,@(if split-function
`((funcall ,split-function)
(other-window 1)))
;; Return the result of the action
(prog1 (pcase state
,@(when dir-action
`(((or `dir-node-open `dir-node-closed `root-node-open `root-node-closed)
,dir-action)))
,@(when file-action
`(((or `file-node-open `file-node-closed)
,file-action)))
,@(when tag-section-action
`(((or `tag-node-open `tag-node-closed)
,tag-section-action)))
,@(when tag-action
`((`tag-node
,tag-action)))
(_
(-if-let (visit-action (get state :treemacs-visit-action))
(funcall visit-action btn)
(error "No match achieved even though button's state %s was part of the set of valid states %s"
state ',valid-states))))
(pcase ,window-arg
('(4) (select-window current-window))
('(16) (delete-window current-window)))))))))))