Hi, this patch adds a quick-help popup for Org column view, bound to `?'.
I am Cc'ing Philip Kaludercic, who authored `help-quick'. Thanks for the package and for the idea; it fits this use case nicely. I wanted to add something like this a couple of years ago: <https://list.orgmode.org/[email protected]/> At that time I was not fully convinced by the approach. I was hoping for a tighter integration with something like which-key. There are still things that could eventually provide a more integrated UI for this, for example the recent discussion around: <https://list.orgmode.org/[email protected]/> and related attempts in Org: <https://list.orgmode.org/[email protected]/> However, I think this small popup is already useful in its current form. Column view has enough specialized bindings that a compact quick-help buffer makes it much easier to move around and edit values. If a more integrated generic facility appears later, we can replace the implementation then. I do not think we need to keep waiting for that before improving the current user experience. It looks roughly like this: Value Column Move row/column View Misc. e edit M-S-<right> add M-<up> row up c contents g redo a allowed M-S-<left> delete M-<down> row down o overview ? quick help S-<right> next < narrow M-<left> column left v show value q quit S-<left> previous > widen M-<right> column right C-c C-o open link C-c C-c toggle checkbox s attributes C-c C-t TODO The implementation reuses Emacs' `help-quick'. Since `help-quick' shows only one binding for each command, the quick-help command uses a copy of `org-columns-map' and removes `n' and `p' from that copy. This makes the popup show `S-<right>' and `S-<left>' for cycling allowed values, which is more consistent with the usual Org interface for changing values, such as TODO states. I would like to hear whether people are fine with this direction. I used `?' because it is a common key for contextual help in special buffers, and column view already has its own overlay keymap while it is active. Since I maintain this file, I can merge it after review if there are no objections. Best, -- Slawomir Grochowski
>From 33457e554003ce7818d39dac82cd6c2cc4c3028b Mon Sep 17 00:00:00 2001 From: Slawomir Grochowski <[email protected]> Date: Fri, 5 Jun 2026 09:04:09 +0200 Subject: [PATCH] org-colview: Add quick help for column view * lisp/org-colview.el (help-quick-toggle, help-quick-sections) (help-quick-use-map): Declare. (org-columns-map, org-columns-menu): Add quick help entry. (org-columns-help-quick-sections): New variable. (org-columns-help-quick-toggle, org-columns--help-quick-close): New functions. (org-columns-quit): Close quick help window. --- lisp/org-colview.el | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/lisp/org-colview.el b/lisp/org-colview.el index efee7cc6e..9428ab891 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -46,11 +46,14 @@ (declare-function org-element-property "org-element-ast" (property node)) (declare-function org-element-restriction "org-element" (element)) (declare-function org-element-type-p "org-element-ast" (node types)) +(declare-function help-quick-toggle "help" ()) (declare-function org-link-display-format "ol" (s)) (declare-function org-link-open-from-string "ol" (s &optional arg)) (declare-function face-remap-remove-relative "face-remap" (cookie)) (declare-function face-remap-add-relative "face-remap" (face &rest specs)) +(defvar help-quick-sections) +(defvar help-quick-use-map) (defvar org-agenda-columns-add-appointments-to-effort-sum) (defvar org-agenda-columns-active) ;; defined in org-agenda.el (defvar org-agenda-columns-compute-summary-properties) @@ -183,6 +186,7 @@ This is the compiled version of the format.") (org-cycle-content)) (org-defkey org-columns-map "c" #'org-columns-content) +(org-defkey org-columns-map "?" #'org-columns-help-quick-toggle) (org-defkey org-columns-map "o" #'org-overview) (org-defkey org-columns-map "e" #'org-columns-edit-value) (org-defkey org-columns-map "\C-c\C-t" #'org-columns-todo) @@ -242,8 +246,63 @@ This is the compiled version of the format.") "--" ["Open link" org-columns-open-link t] "--" + ["Quick help" org-columns-help-quick-toggle t] + "--" ["Quit" org-columns-quit t])) +;;;; Quick help + +(defvar org-columns-help-quick-sections + '(("Value" + (org-columns-edit-value . "edit") + (org-columns-edit-allowed . "allowed") + (org-columns-next-allowed-value . "next") + (org-columns-previous-allowed-value . "previous") + (org-columns-toggle-or-columns-quit . "toggle checkbox") + (org-columns-todo . "TODO")) + ("Column" + (org-columns-new . "add") + (org-columns-delete . "delete") + (org-columns-narrow . "narrow") + (org-columns-widen . "widen") + (org-columns-edit-attributes . "attributes")) + ("Move row/column" + (org-columns-move-row-up . "row up") + (org-columns-move-row-down . "row down") + (org-columns-move-left . "column left") + (org-columns-move-right . "column right")) + ("View" + (org-columns-content . "contents") + (org-overview . "overview") + (org-columns-show-value . "show value") + (org-columns-open-link . "open link")) + ("Misc." + (org-columns-redo . "redo") + (org-columns-help-quick-toggle . "quick help") + (org-columns-quit . "quit"))) + "Quick-help sections for column view. +See `help-quick-sections' for the format.") + +(defun org-columns-help-quick-toggle () + "Toggle quick help for column view." + (interactive nil org-mode org-agenda-mode) + (let ((quick-help-window (get-buffer-window "*Quick Help*" t)) + (map (copy-keymap org-columns-map))) + (define-key map "n" nil) + (define-key map "p" nil) + (let ((help-quick-sections org-columns-help-quick-sections) + (help-quick-use-map (list map))) + (help-quick-toggle)) + (unless quick-help-window + (message "Toggle display of quick-help buffer using %s." + (propertize "?" 'face 'help-key-binding + 'font-lock-face 'help-key-binding))))) + +(defun org-columns--help-quick-close () + "Close column view quick-help, if it is visible." + (when-let* ((quick-help-window (get-buffer-window "*Quick Help*" t))) + (quit-window t quick-help-window))) + ;;;; Value collection (defun org-columns--displayed-value (spec value &optional no-star) @@ -702,6 +761,7 @@ This is needed to later remove this relative remapping.") (defun org-columns-quit () "Remove the column overlays and in this way exit column editing." (interactive nil org-mode org-agenda-mode) + (org-columns--help-quick-close) (org-columns-remove-overlays) (if (not (eq major-mode 'org-agenda-mode)) (setq org-columns-current-fmt nil) -- 2.39.5
