branch: externals/bufferlo commit febbdfb9ee4a1ef5c87cd711a609256589c5e41c Author: shipmints <shipmi...@gmail.com> Commit: Flo Rommel <m...@florommel.de>
Improve 'bufferlo-mode-line' and mode on/off behavior The mode line entry toggles correctly when bufferlo-mode is disabled programmatically or interactively. When we know startup has succeeded, skip parsing the command line and loading startup bookmarks. Implement a simple cache in 'bufferlo-mode-line-format' to avoid redundant lookups. --- bufferlo.el | 89 +++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/bufferlo.el b/bufferlo.el index 0b662d34a7..32f281ecb6 100644 --- a/bufferlo.el +++ b/bufferlo.el @@ -720,6 +720,7 @@ No delay seems needed on macOS." (defvar bufferlo-mode) ; byte compiler (defvar bufferlo-mode-line-menu) ; byte compiler + (defun bufferlo--mode-line-format-helper (abm str face) "Bufferlo mode-line helper to add face and mouse features. Where ABM is the current active bookmark, STR is the mode-line @@ -745,6 +746,7 @@ string, FACE is the face for STR." map))) (defvar bufferlo--active-sets) ; byte compiler + (defun bufferlo-mode-line-format () "Bufferlo mode-line format to display the current active frame or tab bookmark." (when bufferlo-mode @@ -753,37 +755,51 @@ string, FACE is the face for STR." (tab-bar--current-tab-find (frame-parameter nil 'tabs)))) (set-active (> (length bufferlo--active-sets) 0)) - (abm (concat (when fbm (format "%s (Frame)" fbm)) - (when (and fbm tbm) ", ") - (when tbm (format "%s (Tab)" tbm))))) - (concat - (bufferlo--mode-line-format-helper abm bufferlo-mode-line-prefix - 'bufferlo-mode-line-face) - (when (and bufferlo-mode-line-left-prefix (or set-active fbm tbm)) - (bufferlo--mode-line-format-helper - abm bufferlo-mode-line-left-prefix 'bufferlo-mode-line-face)) - (when set-active - (bufferlo--mode-line-format-helper - abm - (concat bufferlo-mode-line-set-active-prefix - (when (or fbm tbm) bufferlo-mode-line-delimiter)) - 'bufferlo-mode-line-set-face)) - (when fbm - (bufferlo--mode-line-format-helper - abm - (concat bufferlo-mode-line-frame-prefix - fbm (when tbm bufferlo-mode-line-delimiter)) - 'bufferlo-mode-line-frame-bookmark-face)) - (when tbm - (bufferlo--mode-line-format-helper - abm - (concat bufferlo-mode-line-tab-prefix tbm) - 'bufferlo-mode-line-tab-bookmark-face)) - (when (and bufferlo-mode-line-right-suffix (or set-active fbm tbm)) - (bufferlo--mode-line-format-helper - abm bufferlo-mode-line-right-suffix 'bufferlo-mode-line-face)))))) - -(defcustom bufferlo-mode-line '(:eval (bufferlo-mode-line-format)) + (cache (window-parameter nil 'bufferlo--mode-line-cache))) + (if (equal (cdr cache) (list fbm tbm set-active)) + (car cache) + (let* ((abm (concat (when fbm (format "%s (Frame)" fbm)) + (when (and fbm tbm) ", ") + (when tbm (format "%s (Tab)" tbm)))) + (str (concat + (bufferlo--mode-line-format-helper + abm bufferlo-mode-line-prefix 'bufferlo-mode-line-face) + (when (and bufferlo-mode-line-left-prefix + (or set-active fbm tbm)) + (bufferlo--mode-line-format-helper + abm + bufferlo-mode-line-left-prefix + 'bufferlo-mode-line-face)) + (when set-active + (bufferlo--mode-line-format-helper + abm + (concat bufferlo-mode-line-set-active-prefix + (when (or fbm tbm) bufferlo-mode-line-delimiter)) + 'bufferlo-mode-line-set-face)) + (when fbm + (bufferlo--mode-line-format-helper + abm + (concat bufferlo-mode-line-frame-prefix + fbm + (when tbm bufferlo-mode-line-delimiter)) + 'bufferlo-mode-line-frame-bookmark-face)) + (when tbm + (bufferlo--mode-line-format-helper + abm + (concat bufferlo-mode-line-tab-prefix tbm) + 'bufferlo-mode-line-tab-bookmark-face)) + (when (and bufferlo-mode-line-right-suffix + (or set-active fbm tbm)) + (bufferlo--mode-line-format-helper + abm + bufferlo-mode-line-right-suffix + 'bufferlo-mode-line-face)))) + (str (if (string-empty-p str) "" (concat " " str)))) + (set-window-parameter nil 'bufferlo--mode-line-cache + (list str fbm tbm set-active)) + str))))) + +(defcustom bufferlo-mode-line '(bufferlo-mode (:eval (bufferlo-mode-line-format))) "Bufferlo mode line definition." :type 'sexp :risky t) @@ -855,11 +871,13 @@ string, FACE is the face for STR." :global t :require 'bufferlo :init-value nil + :lighter nil :keymap bufferlo-mode-map (setq mode-line-misc-info (delete bufferlo-mode-line mode-line-misc-info)) (if bufferlo-mode (progn - (bufferlo--parse-command-line) ; parse user-provided settings first + (unless after-init-time + (bufferlo--parse-command-line)) ; parse user-provided settings first ;; Prefer local buffers (when bufferlo-prefer-local-buffers (dolist (frame (frame-list)) @@ -902,9 +920,10 @@ string, FACE is the face for STR." (when (not (eq bufferlo-bookmarks-save-at-emacs-exit 'nosave)) (add-hook 'kill-emacs-hook #'bufferlo--bookmarks-save-at-emacs-exit)) ;; load bookmarks at startup option - (when (and (not bufferlo--command-line-noload) - (not (eq bufferlo-bookmarks-load-at-emacs-startup 'noload))) - (add-hook 'window-setup-hook #'bufferlo--bookmarks-load-startup)) + (unless after-init-time + (when (and (not bufferlo--command-line-noload) + (not (eq bufferlo-bookmarks-load-at-emacs-startup 'noload))) + (add-hook 'window-setup-hook #'bufferlo--bookmarks-load-startup))) ;; Save bookmark on close-tab and delete-frame (add-hook 'tab-bar-tab-pre-close-functions #'bufferlo-bookmark--tab-save-on-close)