Browse Source

org-table.el: Fixes to `org-table-set-header-line-format'

* lisp/org-table.el (org-table-row-get-visible-string): New
function.
(org-table-set-header-line-format): Use it to handle shrunk
columns.  Also fix handling of `display-line-numbers-mode'.
Bastien 5 years ago
parent
commit
fbd8aea6d2
1 changed files with 20 additions and 7 deletions
  1. 20 7
      lisp/org-table.el

+ 20 - 7
lisp/org-table.el

@@ -454,6 +454,21 @@ prevents it from hanging Emacs."
 (defvar org-table-temp-header-line nil)
 (defvar org-table-temp-header-remapping nil)
 (defvar org-table-header-line-mode nil)
+
+(defun org-table-row-get-visible-string (&optional pos)
+  "Get the visible string of a row.
+This is useful when columns have been shrunk."
+  (save-excursion
+    (when pos (goto-char pos))
+    (let ((beg (point-at-bol))
+	  (end (point-at-eol)) spc)
+      (goto-char beg)
+      (while (progn (org-table-next-field) (< (point) end))
+	(if-let ((ov (first (overlays-in (point) (1+ (point))))))
+	    (push (overlay-get ov 'display) spc)
+	  (push (org-table-get-field) spc)))
+      (format "|%s|" (mapconcat #'identity (reverse spc) "|")))))
+
 (defun org-table-set-header-line-format ()
   "Set the header of table at point as the `header-line-format'.
 Assume `org-table-temp-header-line' already stores the previously
@@ -470,22 +485,20 @@ existing value of `header-line-format' we might want to restore."
 		;; Are we using `display-line-numbers-mode'?
 		(lin (and (boundp 'display-line-numbers-mode)
 			  display-line-numbers-mode
-			  (round (line-number-display-width 'columns))))
+			  (line-number-display-width)))
 		;; Are we using `org-indent-mode'?
-		(pre (and org-indent-mode
+		(pre (and (boundp 'org-indent-mode) org-indent-mode
 			  (length (get-text-property (point) 'line-prefix))))
-		(tbeg (if (save-excursion
-			    (goto-char beg) (org-at-table-hline-p))
+		(tbeg (if (save-excursion (goto-char beg) (org-at-table-hline-p))
 			  (save-excursion
 			    (goto-char beg) (move-beginning-of-line 2) (point))
 			beg)))
 	   (if (< tbeg (save-excursion (move-to-window-line 0) (point)))
 	       (setq header-line-format
 		     (concat (propertize " " 'display '(space :width left-fringe))
-			     (when lin (make-string lin 32))
+			     (when lin (make-string (+ lin 2) 32))
 			     (when pre (make-string pre 32))
-			     (buffer-substring
-			      tbeg (+ tbeg (- (point-at-eol) (point-at-bol))))))
+			     (org-table-row-get-visible-string tbeg)))
 	     (setq header-line-format org-table-temp-header-line)))))
     (setq header-line-format org-table-temp-header-line)))