2025-09-19, 2139h

I'd love to be able to just say ~(describe)~ in a node and have it describe it. I think the closest I'll be able to get (in-text, I can probably shortcode it somehow) is ~src_elisp((gpe/describe))~, which is... still pretty tight.

But the question is how to get there. I feel like perhaps I can do something like what I've done with my Org-roam capture templates: have functions in files, in a folder, and load that folder into some namespace (probably ~gpe/node~, now that I think about it.)

So first let me whip up something that describes a node, and I'll put it in describing's file.

Nothing real:

(defun describe ()
"TBD"
"Doesn't work")

But I need some file there to test loading a directory of single-function files into a namespace.

(defun gpe/load-node-acts ()
"Load all node act files and alias their functions under the `gpe/node/` namespace."
(interactive)
(dolist (file (directory-files "~/ems/org/src/gpe/node-acts/"
t "\\.el$"))
(let* ((name (file-name-base file))
(sym (intern name))
(nsym (intern (format "gpe/node/%s" name))))
(load-file file)
(when (fboundp sym)
(defalias nsym sym)))))

With that, I should be able to do ~src_elisp(gpe/node/describe)~ and it parse:

src_elisp[:results value raw]{(gpe/node/describe)}

Yup!

Great. Next step is rewriting the describe function to actually try and describe the node it's at. I could easily see this getting very complex, but for now I'll (try) and keep it simple.

(defun describe (&optional insert)
"Describes the node"
(let* ((title (or (org-entry-get (point) "name")
(org-collect-keywords '("TITLE"))
'("This")))
(title (if (listp title) (cadr (assoc "TITLE" title))
title))
(form (or (org-entry-get (point) "form" t)
"undescribed node"))
(description (format "%s is (a|an|the) %s" title form)))
(if insert (insert description) description)))

This now lets me do ~(gpe/node/describe t)~ to insert a node's description at point: Babble, [2025-09-19 Fri 21:39], On describing GnoponEmacs nodes is (a|an|the) babble

Or, even easier, ~C-u M-x gpe/node/describe~

Great! Realizing maybe it should include the link to the node, and also let me pick a node beside the one I'm at, so I can use it to create descriptions for other nodes, without it having to be hardcoded into the node like I remember doing in old versions of my Emacs stuff.

But for now this feels like a good amount of improving to have done! I've set a precedent for having acts that nodes can do, to improve themselves, as long as I give them the information.