diff options
author | Bastien <bzg@gnu.org> | 2020-02-04 18:14:29 +0100 |
---|---|---|
committer | Bastien <bzg@gnu.org> | 2020-02-04 18:14:29 +0100 |
commit | 04cb76571dfbfe6d31813f8a49946250a27db27a (patch) | |
tree | 1d24686a9dc6f3267f716312aa8710af97cecd7c | |
parent | c3d55476420eed181e6c5e341afafa02e508a6ed (diff) | |
download | org-mode-04cb76571dfbfe6d31813f8a49946250a27db27a.tar.gz |
org-table.el: Various fixes and enhancements
* lisp/org.el (org-mode): Obey `org-table-header-line-p'.
* lisp/org-table.el (org-table-row-get-visible-string): Fix
handling of shrunk cells.
(org-table-header-set-line): Minor enhancements. Rename from
`org-table-set-header-line-format'.
(org-table-header-line-mode): Use `org-table-header-set-line'.
-rw-r--r-- | lisp/org-table.el | 33 | ||||
-rw-r--r-- | lisp/org.el | 4 |
2 files changed, 20 insertions, 17 deletions
diff --git a/lisp/org-table.el b/lisp/org-table.el index 1a9496f..8884c59 100644 --- a/lisp/org-table.el +++ b/lisp/org-table.el @@ -453,23 +453,23 @@ prevents it from hanging Emacs." ;;; Org table electric header minor mode (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)) - (let ((ov (nth 0 (overlays-in (point) (1+ (point)))))) - (if ov (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 () + (goto-char (line-beginning-position)) + (let ((end (line-end-position)) str) + (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) ""))))) + +(defun org-table-header-set-line () "Set the header of table at point as the `header-line-format'. Assume `org-table-temp-header-line' already stores the previously existing value of `header-line-format' we might want to restore." @@ -479,7 +479,7 @@ existing value of `header-line-format' we might want to restore." (face-remap-add-relative 'header-line '(:inherit default))) (if (org-at-table-p) (run-with-timer - 0.001 nil + 0.01 nil (lambda () (let* ((beg (org-table-begin)) ;; Are we using `display-line-numbers-mode'? @@ -497,7 +497,8 @@ existing value of `header-line-format' we might want to restore." (point)))) (if (< tbeg (save-excursion (move-to-window-line 0) (point))) (setq header-line-format - (concat (propertize " " 'display '(space :width left-fringe)) + (concat (propertize " " 'display + '(space :width (+ left-fringe left-margin-width))) (when lin (propertize (make-string (+ lin 2) 32) 'face 'line-number)) (when pre (make-string pre 32)) @@ -509,16 +510,14 @@ existing value of `header-line-format' we might want to restore." ;;;###autoload (define-minor-mode org-table-header-line-mode "Display the first row of the table at point in the header line." - :init-value org-table-header-line-p :global nil - :variable org-table-header-line-mode :group 'org-table (unless (eq major-mode 'org-mode) (user-error "Cannot turn org table electric mode outside org-mode buffers")) (if org-table-header-line-mode (progn (setq org-table-temp-header-line header-line-format) - (add-hook 'post-command-hook 'org-table-set-header-line-format)) - (remove-hook 'post-command-hook 'org-table-set-header-line-format) + (add-hook 'post-command-hook 'org-table-header-set-line)) + (remove-hook 'post-command-hook 'org-table-header-set-line) (face-remap-remove-relative org-table-temp-header-remapping) (setq header-line-format org-table-temp-header-line))) diff --git a/lisp/org.el b/lisp/org.el index 3911c8a..3ce5973 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -5000,6 +5000,10 @@ The following commands are available: (unless org-inhibit-startup-visibility-stuff (org-set-startup-visibility)) (when org-startup-truncated (setq truncate-lines t)) (when org-startup-indented (require 'org-indent) (org-indent-mode 1)))) + + ;; Activate `org-table-header-line-mode' + (when org-table-header-line-p + (org-table-header-line-mode 1)) ;; Set up Org menus (org-menu-define) ;; Try to set `org-hide' face correctly. |