(macros)
Tools

Helm

Helm is Macros' generic selection framework — the narrowing UI you see when you run M-x, switch buffers, or find a project file. The behavior (the panel, matching, marking) is in Rust; the sources, actions, and applications are written in Scheme, so you can build your own pickers on top of it.

Where you meet Helm

  • M-xhelm-execute-command, a source over every command.
  • Buffer switchinghelm-buffers (also aliased to the Emacs names), with a marginalia-style "special" hint on buffers like *scratch*.
  • Project find-file and switch-project — see Projects & search.
  • helm-apropos (C-h C-a) — live search over every loaded definition's doc-comment, with jump-to-source; see Getting help.

Session keys

These are active only during a Helm session:

Key Action
/ move the selection
Enter run the default action on the selection
Tab complete / descend
C-Space mark the candidate for multi-select
M-a open the action menu (for sources with more than one action)
C-g cancel

With one or more candidates marked via C-Space, Enter runs the action on every marked candidate.

Matching & appearance

(set-option "helm-fuzzy"  #t)    ; fuzzy (nucleo, fzf-style) vs substring
(set-option "helm-height" 0.5)   ; fraction of the window height
;; Bevel edges (px per side):
(set-option "helm-bevel-top"    1)
(set-option "helm-bevel-right"  0)
(set-option "helm-bevel-bottom" 0)
(set-option "helm-bevel-left"   0)

Annotations (marginalia)

A candidate may be a bare string or a (candidate annotation) pair. The annotation renders dimmed and right-aligned in the panel; only the candidate string is matched on and passed to the action. Dynamic sources can return the same pair form. For example:

(list (list "ada" "engineer")
      "alan"
      (list "grace" "admiral"))

Building your own picker

The buffer switcher is a complete example: a Helm application written in Scheme over two primitives — (buffer-names) lists the open buffers and switch-to-buffer is the default action; a second action (reached with M-a) kills the selected buffer. You can build pickers over any list the same way. See Scripting with Steel.