emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 5f22a1be40 4/4: org-table-header-set-header: Fix he


From: ELPA Syncer
Subject: [elpa] externals/org 5f22a1be40 4/4: org-table-header-set-header: Fix header calculation
Date: Wed, 31 Jan 2024 10:00:22 -0500 (EST)

branch: externals/org
commit 5f22a1be406c606bbca0b7281a91af2a935ca066
Author: Ihor Radchenko <yantar92@posteo.net>
Commit: Ihor Radchenko <yantar92@posteo.net>

    org-table-header-set-header: Fix header calculation
    
    * lisp/org-table.el (org-table-header-set-header): Make sure that
    Emacs finishes any queued redisplay before calculating window
    boundaries.  Do not make assumptions about the same character width of
    table lines.
    (org-table-row-get-visible-string): Refactor calculation of the visual
    text representation.  Inherit all the text properties - in particular,
    composition.  Collect non-intersecting overlays into text properties.
    
    Reported-by: Ypo <ypuntot@gmail.com>
    Link: https://orgmode.org/list/87a605oyht.fsf@localhost
---
 lisp/org-table.el | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/lisp/org-table.el b/lisp/org-table.el
index 562b035c32..6e08bfb935 100644
--- a/lisp/org-table.el
+++ b/lisp/org-table.el
@@ -467,16 +467,17 @@ prevents it from hanging Emacs."
 This may be useful when columns have been shrunk."
   (save-excursion
     (when pos (goto-char pos))
-    (goto-char (line-beginning-position))
-    (let ((end (line-end-position)) str)
-      (goto-char (1- pos))
-      (while (progn (forward-char 1) (< (point) end))
-       (let ((ov (car (overlays-at (point)))))
-         (if (not ov)
-             (push (char-to-string (char-after)) str)
-           (push (overlay-get ov 'display) str)
-           (goto-char (1- (overlay-end ov))))))
-      (format "|%s" (mapconcat #'identity (reverse str) "")))))
+    (let* ((beg (line-beginning-position))
+           (end (line-end-position))
+           (str (buffer-substring beg end)))
+      ;; FIXME: This does not handle intersecting overlays.
+      (dolist (ov (overlays-in beg end))
+        (when (overlay-get ov 'display)
+          (put-text-property
+           (- (overlay-start ov) beg) (- (overlay-end ov) beg)
+           'display (overlay-get ov 'display)
+           str)))
+      str)))
 
 (defvar-local org-table-header-overlay nil)
 (put 'org-table-header-overlay 'permanent-local t)
@@ -487,19 +488,24 @@ This may be useful when columns have been shrunk."
         (progn
           (when (overlayp org-table-header-overlay)
             (delete-overlay org-table-header-overlay))
+          ;; We might be called after scrolling but before display is
+          ;; updated. Make sure that any queued redisplay is executed
+          ;; before we look into `window-start'.
+          (redisplay)
           (let* ((ws (window-start))
                  (beg (save-excursion
                         (goto-char (org-table-begin))
                         (while (or (org-at-table-hline-p)
                                    (looking-at-p 
".*|\\s-+<[rcl]?\\([0-9]+\\)?>"))
                           (move-beginning-of-line 2))
-                        (line-beginning-position)))
-                 (end (save-excursion (goto-char beg) (line-end-position))))
+                        (line-beginning-position))))
             (if (pos-visible-in-window-p beg)
                 (when (overlayp org-table-header-overlay)
                   (delete-overlay org-table-header-overlay))
               (setq org-table-header-overlay
-                    (make-overlay ws (+ ws (- end beg))))
+                    (make-overlay
+                     (save-excursion (goto-char ws) (line-beginning-position))
+                     (save-excursion (goto-char ws) (line-end-position))))
               (org-overlay-display
                org-table-header-overlay
                (org-table-row-get-visible-string beg)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]