Hi everyone, I've noticed a significant performance and responsiveness issue (lag) when editing standard property values from within Column View.
Currently, invoking `org-columns-edit-value` or `org-columns-next-allowed-value` triggers a full `org-columns-redo` operation at the end of the edit. While this refresh is necessary when modifying special properties (such as TODO, TAGS, PRIORITY, or ITEM) because they affect the physical heading line and disrupt overlays, running a full "redo" for standard user properties inside the `:PROPERTIES:` drawer is highly inefficient. Emacs can safely modify the drawer text without disturbing the heading overlays. I have attached a patch that optimizes this behavior. By skipping `org-columns-redo` for non-special properties, the editing experience becomes much smoother. I've been running with this patch applied locally for the past two weeks and haven't noticed any adverse side effects or regressions. I have analyzed the behavioral impact of this change to ensure its safety: 1. Heading Overlays: Unaffected, as the full redo is still triggered for special properties. 2. Property Summaries: Unaffected. Mathematical summaries for parent headings are handled by `org-columns-update` and `org-columns-compute`, which are still executed. 3. Column Widths: Entering a value longer than the current column width will now cause it to be truncated with an ellipsis instead of triggering a full file rescan to recalculate max widths. I believe this is a desirable UX improvement, as it prevents Emacs from hanging. Users can simply press `r` to manually refresh and expand the table if needed. 4. Agenda View: Unaffected. This change is isolated to `org-mode` buffers; the Agenda view uses a separate code path. I would love to hear your thoughts on this approach. Best, -- Slawomir Grochowski
>From 27b2c680f713ee6d450d867dcdaa5d0b5d739ef6 Mon Sep 17 00:00:00 2001 From: Slawomir Grochowski <[email protected]> Date: Sun, 10 May 2026 04:55:38 +0200 Subject: [PATCH] org-colview.el: Skip org-columns-redo for non-special properties * lisp/org-colview.el (org-columns--execute-and-update): Skip `org-columns-redo` during property editing if the changed property is not a special property that affects the heading structure. This commit resolves a performance and responsiveness issue (lag) when editing property values from within Org Mode's Column View. Behavioral impact: 1. Overlay Integrity Column view draws overlays directly on the heading line. Modifying special properties (like TODO, TAGS, PRIORITY, or ITEM) alters the physical text on that line, disrupting the overlays. A full `org-columns-redo` is mandatory here to redraw the line. However, standard properties are stored in the `:PROPERTIES:` drawer below the heading. Modifying them does not affect the heading line, making the overlay refresh unnecessary. 2. Column Summaries Skipping "redo" does not break summaries for parent headings. Immediately after the conditional `org-columns-redo`, `org-columns-update` is called. This function subsequently calls `org-columns-compute`, which traverses up the tree to update the summarized overlays for the specific property being edited. 3. Column Widths Previously, a full redo would rescan all values in the file to recalculate the maximum column width (`org-columns-current-maxwidths`). With this fix, entering a value longer than the current column width will cause it to be truncated with an ellipsis. This is a desirable UX improvement: it is much better to clip the text and let the user manually press `r` (refresh) to expand the table, rather than freezing Emacs for several seconds during every minor property edit. 4. Agenda View This change is localized to the branch of code specific to Org Mode buffers. The Agenda view (which handles column view differently) retains its own, unmodified refresh logic, ensuring no regressions. --- lisp/org-colview.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/org-colview.el b/lisp/org-colview.el index e2317e1e4..ec300d764 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -718,7 +718,8 @@ COL is the column to move to after update." ;; Some properties can modify headline (e.g., "TODO"), and ;; possible shuffle overlays. Make sure they are still all at ;; the right place on the current line. - (let ((org-columns-inhibit-recalculation)) (org-columns-redo)) + (when (member key '("ITEM" "TODO" "PRIORITY" "TAGS")) + (let ((org-columns-inhibit-recalculation)) (org-columns-redo))) (org-columns-update key) (org-move-to-column col)))) -- 2.39.5
