branch: externals/bufferlo
commit c13fc1094eb9ffa2b99385f05ae139b73ae514d7
Author: shipmints <shipmi...@gmail.com>
Commit: shipmints <shipmi...@gmail.com>

    bufferlo-prefer-local-buffers 'tabs sets switch-to-prev-buffer-skip.
    
    This is in harmony with bufferlo tab-specific locals in ibuffer and
    consult filters.
---
 bufferlo.el | 50 +++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 39 insertions(+), 11 deletions(-)

diff --git a/bufferlo.el b/bufferlo.el
index c07c989fab..285eebde5f 100644
--- a/bufferlo.el
+++ b/bufferlo.el
@@ -60,13 +60,18 @@
   :group 'convenience)
 
 (defcustom bufferlo-prefer-local-buffers t
-  "Use a frame predicate to prefer local buffers over global ones.
-This means that a local buffer will be preferred to be displayed
-when the current buffer disappears (buried or killed).
-This is also required to make `next-buffer' and `previous-buffer'
-work as expected.
-Changes to this variable must be made before enabling
-`bufferlo-mode' in order to take effect."
+  "Use the frame `buffer-predicate' to prefer local buffers.
+Without this option, buffers from across all frames are
+presented. This means that a local buffer will be preferred to be
+displayed when the current buffer disappears (buried or killed).
+
+This also influences `next-buffer' and `previous-buffer'.
+
+Set to \\='tabs for `next-buffer' and `previous-buffer' to respect
+buffers local to the current tab, otherwise they will cycle
+through buffers across the frame.
+
+This variable must be set before enabling `bufferlo-mode'."
   :type 'boolean)
 
 (defcustom bufferlo-include-buried-buffers t
@@ -509,6 +514,8 @@ Set to 0 to disable the timer. Units are whole integer 
seconds."
           (dolist (frame (frame-list))
             (bufferlo--set-buffer-predicate frame))
           (add-hook 'after-make-frame-functions 
#'bufferlo--set-buffer-predicate))
+        (when (eq bufferlo-prefer-local-buffers 'tabs)
+          (bufferlo--set-switch-to-prev-buffer-skip))
         ;; Include/exclude buffers
         (add-hook 'after-make-frame-functions 
#'bufferlo--include-exclude-buffers)
         (add-hook 'tab-bar-tab-post-open-functions 
#'bufferlo--tab-include-exclude-buffers)
@@ -542,6 +549,8 @@ Set to 0 to disable the timer. Units are whole integer 
seconds."
     ;; Prefer local buffers
     (dolist (frame (frame-list))
       (bufferlo--reset-buffer-predicate frame))
+    (when (eq bufferlo-prefer-local-buffers 'tabs)
+      (bufferlo--reset-switch-to-prev-buffer-skip))
     (remove-hook 'after-make-frame-functions #'bufferlo--set-buffer-predicate)
     ;; Include/exclude buffers
     (remove-hook 'after-make-frame-functions 
#'bufferlo--include-exclude-buffers)
@@ -622,6 +631,25 @@ before calling OLDFN with ARGS.  See 
`bufferlo--clear-buffer-lists'."
 
     result))
 
+;; via window.el switch-to-prev-buffer-skip-p
+;; (funcall skip window buffer bury-or-kill)
+(defun bufferlo--switch-to-prev-buffer-skip-p (_window buffer _bury-or-kill)
+  "Restrict BUFFER to the current tab's locals for buffer switching.
+Affects `switch-to-prev-buffer' and `switch-to-next-buffer'.
+Includes hidden buffers."
+  (not (bufferlo-local-buffer-p buffer nil (tab-bar--current-tab-index) t)))
+
+(defvar bufferlo--switch-to-prev-buffer-skip-orig)
+
+(defun bufferlo--set-switch-to-prev-buffer-skip ()
+  "Set the buffer predicate of FRAME to `bufferlo--buffer-predicate'."
+  (setq bufferlo--switch-to-prev-buffer-skip-orig switch-to-prev-buffer-skip)
+  (setq switch-to-prev-buffer-skip #'bufferlo--switch-to-prev-buffer-skip-p))
+
+(defun bufferlo--reset-switch-to-prev-buffer-skip ()
+  "Reset `switch-to-prev-buffer-skip'."
+  (setq switch-to-prev-buffer-skip bufferlo--switch-to-prev-buffer-skip-orig))
+
 (defun bufferlo--buffer-predicate (buffer)
   "Return whether BUFFER is local to the current frame/tab.
 Includes hidden buffers."
@@ -748,7 +776,7 @@ function.  WINDOW and WRITABLE are passed to the function."
   "Restore the frame's buffer list from the window state.
 Used as advice after `window-state-put'.  STATE is the window state.
 WINDOW is the window in question.  IGNORE is not used and exists for
-compatibility with the adviced function."
+compatibility with the advised function."
   ;; We have to make sure that the window is live at this point.
   ;; `frameset-restore' may pass a window with a non-existing buffer
   ;; to `window-state-put', which in turn will delete that window
@@ -770,14 +798,14 @@ compatibility with the adviced function."
 (defun bufferlo--activate (oldfn &rest args)
   "Activate the advice for `bufferlo--window-state-{get,put}'.
 OLDFN is the original function.  ARGS is for compatibility with
-the adviced functions."
+the advised functions."
   (let ((bufferlo--desktop-advice-active t))
     (apply oldfn args)))
 
 (defun bufferlo--activate-force (oldfn &rest args)
   "Activate the advice for `bufferlo--window-state-{get,put}'.
 OLDFN is the original function.  ARGS is for compatibility with
-the adviced functions."
+the advised functions."
   (let ((bufferlo--desktop-advice-active t)
         (bufferlo--desktop-advice-active-force t))
     (apply oldfn args)))
@@ -785,7 +813,7 @@ the adviced functions."
 (defun bufferlo--clone-undelete-frame-advice (oldfn &rest args)
   "Activate the advice for `bufferlo--window-state-{get,put}'.
 OLDFN is the original function.  ARGS is for compatibility with
-the adviced functions. Honors `bufferlo-bookmark-frame-clone-policy'."
+the advised functions. Honors `bufferlo-bookmark-frame-clone-policy'."
   (let ((bufferlo--desktop-advice-active t)
         (bufferlo--desktop-advice-active-force t))
     (apply oldfn args))

Reply via email to