branch: externals/bufferlo
commit 08cfa9b48d8ac523f4fd94d7ae1a009fe3b8087f
Author: Florian Rommel <[email protected]>
Commit: Florian Rommel <[email protected]>
Minor cleanups
---
bufferlo.el | 105 ++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 71 insertions(+), 34 deletions(-)
diff --git a/bufferlo.el b/bufferlo.el
index 2faa87f16c..47d9cb2a02 100644
--- a/bufferlo.el
+++ b/bufferlo.el
@@ -169,7 +169,8 @@ without remorse including those with running processes such
as
(defcustom bufferlo-bookmark-inhibit-bookmark-point nil
"If non-nil, inhibit point in bookmarks.
-This is useful if `save-place-mode' mode is enabled."
+This is useful if `save-place-mode' mode is enabled and you want it to
+handle the place restoration in bufferlo bookmarks."
:package-version '(bufferlo . "1.1")
:type 'boolean)
@@ -334,7 +335,7 @@ with the loaded tab.
option `tab-bar-new-tab-to'."
:package-version '(bufferlo . "1.1")
:type '(radio (const :tag "Prompt" prompt)
- (const :tag "Replace)" replace)
+ (const :tag "Replace" replace)
(const :tag "New" new)))
(defcustom bufferlo-bookmark-tab-duplicate-policy 'prompt
@@ -1488,7 +1489,8 @@ advised functions. Honors
`bufferlo-bookmark-frame-duplicate-policy'."
(msg-append (lambda (s) (setq msg (concat msg "; " s))))
(aborted
(catch :abort
- (let ((duplicate-policy (bufferlo--bookmark-get-duplicate-policy
; throws :abort
+ ;; `bufferlo--bookmark-get-duplicate-policy' throws :abort
+ (let ((duplicate-policy (bufferlo--bookmark-get-duplicate-policy
bookmark-name
"frame"
bufferlo-bookmark-frame-duplicate-policy
@@ -1503,7 +1505,8 @@ advised functions. Honors
`bufferlo-bookmark-frame-duplicate-policy'."
('ignore
(throw :abort t))
('raise
- ;; NOTE: we throw nil here we need to delete the frame
before raising
+ ;; NOTE: We throw nil here!
+ ;; We delete the frame ourselfs before raising.
(delete-frame)
(bufferlo--bookmark-raise abm)
(throw :abort nil)))
@@ -1543,8 +1546,10 @@ Honors `bufferlo-bookmark-tab-duplicate-policy'."
('ignore
(throw :abort t))
('raise
- ;; NOTE: we throw nil here we need to close the tab before
raising
- (tab-bar-close-tab)
+ ;; NOTE: We throw nil here!
+ ;; We delete the frame ourselfs before raising.
+ (let (tab-bar-tab-prevent-close-functions)
+ (tab-bar-close-tab))
;; Find bookmark to raise; tab numbers changes when closing.
(bufferlo--bookmark-raise
(assoc bookmark-name (bufferlo--active-bookmarks)))
@@ -1558,7 +1563,8 @@ Honors `bufferlo-bookmark-tab-duplicate-policy'."
(or msg "")))
nil)))
(when aborted
- (tab-bar-close-tab)))))
+ (let (tab-bar-tab-prevent-close-functions)
+ (tab-bar-close-tab))))))
(defun bufferlo--tab-bar-undo-close-tab-advice (oldfn &rest args)
"Activate the advice for `tab-bar-undo-close-tab'.
@@ -1711,7 +1717,8 @@ If BUFFER is nil, the current buffer is killed."
;; buffer. The caller will close the tab or frame under its control.
(switch-to-buffer-other-window " *bufferlo temp*"))
(let ((frame-auto-hide-function) ; inhibit automatic frame deletion
- (switch-to-prev-buffer-skip)) ; no interference for buffer replacement
selection
+ ;; No interference for buffer replacement selection
+ (switch-to-prev-buffer-skip))
(kill-buffer buffer)))
(defun bufferlo--kill-buffer-forced (buffer)
@@ -1732,7 +1739,8 @@ If BUFFER is nil, the current buffer is killed."
(if (not (buffer-file-name buffer))
(bufferlo--kill-buffer-forced buffer)
(unless (buffer-modified-p buffer)
- (let ((kill-buffer-query-functions)) ; no prompting (these are
unmodified buffers)
+ ;; No prompting (these are unmodified buffers)
+ (let ((kill-buffer-query-functions))
(bufferlo--kill-buffer-safely buffer)))))
('kill-modified
(bufferlo--kill-buffer-forced buffer))
@@ -1837,19 +1845,33 @@ The optional arguments KILLALL and INTERNAL-TOO are
passed to
(bufferlo--warn)
(when (or (not bufferlo-close-tab-kill-buffers-prompt)
(y-or-n-p "Kill tab and its buffers? "))
- (let ((tbm (alist-get 'bufferlo-bookmark-tab-name
(bufferlo--current-tab))))
+ (let* ((orig-frame (selected-frame))
+ (orig-tab (bufferlo--current-tab))
+ (tbm (alist-get 'bufferlo-bookmark-tab-name orig-tab))
+ kill-buffer-closed-tab)
(pcase bufferlo-bookmark-tab-save-on-close
((or 't 'on-kill-buffers)
(when (y-or-n-p (format-message "Save tab bookmark `%s'? " tbm))
(bufferlo-bookmark-tab-save-current)))
((or 'when-bookmarked 'on-kill-buffers-when-bookmarked)
(when tbm (bufferlo-bookmark-tab-save tbm))))
- (let ((bufferlo-kill-buffers-prompt nil))
+ (let* ((bufferlo-kill-buffers-prompt nil)
+ ;; Emacs 31 `window--delete' can call tab-bar-close-tab
+ (tab-bar-tab-prevent-close-functions nil)
+ (tab-bar-tab-pre-close-functions
+ (list (lambda (_tab _last-tab-p)
+ (setq kill-buffer-closed-tab t)))))
(bufferlo-kill-buffers killall nil nil internal-too))
(let ((bufferlo-bookmark-tab-save-on-close nil)
(tab-bar-close-last-tab-choice 'delete-frame))
- ;; Catch errors in case this is the last tab on the last frame
- (ignore-errors (tab-bar-close-tab))))))
+ ;; Close the tab only if we can detect that it's hasn't been closed by
+ ;; `'kill-buffer' (via `replace-buffer-in-windows',
+ ;; `window-deletable-p', `window--delete').
+ (unless (or kill-buffer-closed-tab
+ (not (eq orig-frame (selected-frame)))
+ (not (eq orig-tab (bufferlo--current-tab))))
+ ;; Catch errors in case this is the last tab on the last frame
+ (ignore-errors (tab-bar-close-tab)))))))
(defun bufferlo-isolate-project (&optional file-buffers-only)
"Isolate a project in the frame or tab.
@@ -2615,7 +2637,8 @@ Returns nil on success, non-nil on abort."
;; Bookmark already loaded in another tab?
(when abm
- (let ((duplicate-policy (bufferlo--bookmark-get-duplicate-policy ;
throws :abort
+ ;; Throws :abort
+ (let ((duplicate-policy (bufferlo--bookmark-get-duplicate-policy
bookmark-name "tab"
bufferlo-bookmark-tab-duplicate-policy
'load
@@ -2637,11 +2660,13 @@ Returns nil on success, non-nil on abort."
;; Frame and set handlers manage tabs, so we don't do it here.
(unless (or embedded-tab bufferlo--bookmark-set-loading)
- ;; Handle an independent tab bookmark on a frame with an active frame
bookmark.
- ;; Do this first, before a new tab is created.
+ ;; Handle an independent tab bookmark on a frame with an
+ ;; active frame bookmark. Do this first, before a new tab is
+ ;; created.
(when (and bookmark-name
(frame-parameter nil 'bufferlo-bookmark-frame-name))
- (let ((clear-policy (bufferlo--bookmark-tab-get-clear-policy
'load))) ; throws :abort
+ ;; Throws :abort
+ (let ((clear-policy (bufferlo--bookmark-tab-get-clear-policy 'load)))
(pcase clear-policy
('clear
(setq disconnect-tbm-p t))
@@ -2650,7 +2675,8 @@ Returns nil on success, non-nil on abort."
(funcall msg-append "cleared tab bookmark")))))
;; Replace current tab or create new tab?
- (let ((replace-policy (bufferlo--bookmark-tab-get-replace-policy))) ;
throws :abort
+ ;; Throws :abort
+ (let ((replace-policy (bufferlo--bookmark-tab-get-replace-policy)))
(pcase replace-policy
('replace)
('new
@@ -2925,11 +2951,14 @@ Returns nil on success, non-nil on abort."
;; and other user prompts are bypassed.
;;
;; Handler abort is non-nil.
- (if (bufferlo--bookmark-tab-handler tbm 'not-jump
'no-message 'embedded-tab)
+ (if (bufferlo--bookmark-tab-handler tbm 'not-jump
+ 'no-message
'embedded-tab)
(if first
(let ((switch-to-buffer-obey-display-actions))
- (switch-to-buffer orig-buffer 'no-record
'force-same-window))
- (tab-bar-close-tab))
+ (switch-to-buffer orig-buffer 'no-record
+ 'force-same-window))
+ (let (tab-bar-tab-prevent-close-functions)
+ (tab-bar-close-tab)))
(when-let* ((tab-name (alist-get 'tab-name tbm)))
(tab-bar-rename-tab tab-name)))
(setq first nil)))
@@ -2974,8 +3003,8 @@ Returns nil on success, non-nil on abort."
(message "Restored bufferlo frame bookmark%s%s"
(if bookmark-name (format ": %s" bookmark-name) "")
(or msg "")))
- nil) ; explicitly return success; abort returns non-nil
- ))
+ ;; Explicitly return success; abort returns non-nil
+ nil)))
;; We use a short name here as bookmark-bmenu-list hard codes width of 8 chars
(put #'bufferlo--bookmark-frame-handler 'bookmark-handler-type "B-Frame")
@@ -3292,18 +3321,22 @@ Returns nil on success, non-nil on abort."
(dolist (tbm-name tbm-names)
(unless (and ignore-already-active
(member tbm-name already-abm-names))
- (when-let* ((tbm-bookmark-record
(bufferlo--bookmark-get-bookmark tbm-name)))
+ (when-let* ((tbm-bookmark-record
+ (bufferlo--bookmark-get-bookmark tbm-name)))
(let ((orig-buffer (current-buffer)))
(unless first-tab
(tab-bar-new-tab-to))
;; NOTE: bufferlo--bookmark-tab-handler disallows raise
for
;; embedded-tab to avoid selected frame/tab state issues
;; Handler abort is non-nil.
- (when (bufferlo--bookmark-tab-handler tbm-bookmark-record
'not-jump)
+ (when (bufferlo--bookmark-tab-handler tbm-bookmark-record
+ 'not-jump)
(if first-tab
(let ((switch-to-buffer-obey-display-actions))
- (switch-to-buffer orig-buffer 'no-record
'force-same-window))
- (tab-bar-close-tab)))))
+ (switch-to-buffer orig-buffer 'no-record
+ 'force-same-window))
+ (let (tab-bar-tab-prevent-close-functions)
+ (tab-bar-close-tab))))))
(setq first-tab nil)))))
(setq first-tab-frame nil)))
(select-frame-set-input-focus (selected-frame)))
@@ -3316,28 +3349,32 @@ Returns nil on success, non-nil on abort."
(funcall bufferlo-frameset-restore-function frameset)
(dolist (frame (frame-list))
(with-selected-frame frame
- ;; 'bufferlo--frame-to-restore is a hint from
`bufferlo-frameset-restore-default'
+ ;; 'bufferlo--frame-to-restore is a hint from
+ ;; `bufferlo-frameset-restore-default'
(when (frame-parameter nil 'bufferlo--frame-to-restore)
(when-let* ((fbm-name (frame-parameter
nil 'bufferlo--bookmark-frame-name))
- (fbm-bookmark-record (bufferlo--bookmark-get-bookmark
fbm-name)))
+ (fbm-bookmark-record (bufferlo--bookmark-get-bookmark
+ fbm-name)))
(if (and ignore-already-active
(member fbm-name already-abm-names))
(delete-frame)
- (let ((bufferlo-bookmark-frame-load-make-frame nil) ; frame
already made
+ (let ((bufferlo-bookmark-frame-load-make-frame nil)
(bufferlo-bookmark-frame-load-policy
'replace-frame-adopt-loaded-bookmark)
(bufferlo--bookmark-handler-no-message t))
;; NOTE: bufferlo--bookmark-frame-handler disallows raise
;; for frames in sets to avoid selected frame/tab state
issues
;; Handler abort is non-nil.
- (if (bufferlo--bookmark-frame-handler fbm-bookmark-record
'not-jump)
+ (if (bufferlo--bookmark-frame-handler fbm-bookmark-record
+ 'not-jump)
(delete-frame)
(when (and
(display-graphic-p frame)
(memq bufferlo-set-restore-geometry-policy
'(all frames)))
- (when-let* ((fg (frame-parameter nil
'bufferlo--frame-geometry)))
+ (when-let* ((fg (frame-parameter
+ nil 'bufferlo--frame-geometry)))
(funcall bufferlo-set-frame-geometry-function fg)))
(set-frame-parameter nil 'bufferlo--frame-to-restore nil))
(select-frame-set-input-focus (selected-frame)))))))))
@@ -3361,8 +3398,8 @@ Returns nil on success, non-nil on abort."
x))
bufferlo-bookmark-names
", ")))
- nil) ; explicitly return success; abort returns non-nil
- )
+ ;; Explicitly return success; abort returns non-nil
+ nil))
;; We use a short name here as bookmark-bmenu-list hard codes width of 8 chars
(put #'bufferlo--bookmark-set-handler 'bookmark-handler-type "B-Set")