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

Reply via email to