Download
(defvar flobl-time-tick 0
"Incremented by 1 for each switch buffer operation.")
(defvar flobl-buffer-order nil
"Contains information about recently visited buffers for each frame.")
(defvar flobl-last-frame nil
"Info about last frame the user was in.")
(defvar flobl-last-buffer nil
"Info about last buffer the user was in.")
(defun flobl-buffer-order-get-frame (fram)
"Returns the prio information of buffers for FRAM."
(plist-get flobl-buffer-order fram))
(defun flobl-buffer-order-get-buffer (fram buf)
"Returns a number indicating how recently BUF has been visited in FRAM."
(if (not (framep fram)) (error "%s must be a frame"))
(if (not (bufferp buf)) (error "%s must be a buffer"))
(or (plist-get (flobl-buffer-order-get-frame fram) buf) 0))
(defun flobl-buffer-order-update (fram buf &optional prio)
"Sets the prio information of BUF in FRAM to PRIO.
Uses `flobl-time-tick' if PRIO is not given. `flobl-time-tick' is also
incremented automatically."
(if (not (framep fram)) (error "%s must be a frame"))
(if (not (bufferp buf)) (error "%s must be a buffer"))
(let ((forder (flobl-buffer-order-get-frame fram)))
(setq forder (plist-put forder buf (or prio flobl-time-tick)))
(setq flobl-time-tick (1+ flobl-time-tick))
(setq flobl-buffer-order
(plist-put flobl-buffer-order fram forder))))
(defun flobl-cmp-buffers (buf1 buf2)
"Compares two buffers according to `flobl-buffer-order'."
(let ((p1 (flobl-buffer-order-get-buffer (selected-frame) buf1))
(p2 (flobl-buffer-order-get-buffer (selected-frame) buf2)))
(< p2 p1)))
(unless (fboundp 'flobl-orig-buffer-list)
(fset 'flobl-orig-buffer-list (symbol-function 'buffer-list)))
(defadvice buffer-list (after frame-local-buffer-lists first activate)
"switch-to-buffer commands in other frames don't affect order of buffers here."
(setq ad-return-value
(sort (copy-sequence ad-return-value) 'flobl-cmp-buffers)))
(defun flobl-post-command-hook ()
"Runs after every command to update buffer priority information."
(let ((new-buf (current-buffer))
(new-fram (selected-frame)))
(when (and (eq flobl-last-frame new-fram)
(not (eq flobl-last-buffer new-buf)))
(flobl-buffer-order-update new-fram new-buf))
(when (eq this-command 'bury-buffer)
(flobl-buffer-order-update (selected-frame)
(car (last (flobl-orig-buffer-list)))
0))
(setq flobl-last-frame new-fram)
(setq flobl-last-buffer new-buf)))
(add-hook 'post-command-hook 'flobl-post-command-hook)
(provide 'flobl)