Last active
March 11, 2024 14:37
-
-
Save jbester/c8eb59e65cbe3b177334a171359624d9 to your computer and use it in GitHub Desktop.
Custom Tabline next/prev
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defun custom-tab-line-switch-to-next-tab (&optional mouse-event) | |
"Switch to the next tab - cycle back to the start at the end. | |
Its effect is the same as using the `next-buffer' command | |
(\\[next-buffer]). with the exception it will not open a non-visible buffer" | |
(interactive (list last-nonmenu-event)) | |
(let ((window (and (listp mouse-event) (posn-window (event-start mouse-event))))) | |
(with-selected-window (or window (selected-window)) | |
(let* ((tabs (funcall tab-line-tabs-function)) | |
(tab-buffers (mapcar (lambda (tab) (if (bufferp tab) tab (cdr (assq 'buffer tab)))) tabs)) | |
(num-tabs (length tab-buffers)) | |
(tab-position (cl-position (current-buffer) tab-buffers)) | |
(next-tab-position (mod (1+ tab-position) num-tabs)) | |
;; find the buffer | |
(buffer (nth next-tab-position tab-buffers))) | |
(when (bufferp buffer) | |
(if (eq next-tab-position 0) | |
(progn | |
(set-window-buffer window buffer) | |
(set-window-next-buffers window (delq buffer tab-buffers))) | |
(switch-to-next-buffer window)) | |
))))) | |
(defun custom-tab-line-switch-to-prev-tab (&optional mouse-event) | |
"Switch to the prev tab - cycle to the end whe moving past the start | |
Its effect is the same as using the `prev-buffer' command | |
(\\[prev-buffer]). with the exception it will not open a non-visible buffer" | |
(interactive (list last-nonmenu-event)) | |
(let ((window (and (listp mouse-event) (posn-window (event-start mouse-event))))) | |
(with-selected-window (or window (selected-window)) | |
(let* ((tabs (funcall tab-line-tabs-function)) | |
(tab-buffers (mapcar (lambda (tab) (if (bufferp tab) tab (cdr (assq 'buffer tab)))) tabs)) | |
(num-tabs (length tab-buffers)) | |
(tab-position (cl-position (current-buffer) tab-buffers)) | |
(next-tab-position (mod (1- tab-position) num-tabs)) | |
;; find the buffer | |
(buffer (nth next-tab-position tab-buffers))) | |
(when (bufferp buffer) | |
(if (eq tab-position 0) | |
(progn | |
(set-window-buffer window buffer) | |
(set-window-next-buffers window nil) | |
;; when clearing the next buffers | |
;; emacs reuses them as prev buffers | |
;; but in same order | |
;; undo the reversal | |
(set-window-prev-buffers window (reverse (window-prev-buffers window)))) | |
(switch-to-prev-buffer window)) ))))) | |
;; bind the above to keys | |
(global-set-key (kbd "C-<prior>") #'custom-tab-line-switch-to-prev-tab) ; page up key | |
(global-set-key (kbd "C-<next>") #'custom-tab-line-switch-to-next-tab) ; page down key | |
;; rebind tab-line scrolling | |
(global-set-key [tab-line S-mouse-4] #'custom-tab-line-switch-to-prev-tab) | |
(global-set-key [tab-line S-mouse-5] #'custom-tab-line-switch-to-next-tab) | |
(global-set-key [tab-line S-wheel-up] #'custom-tab-line-switch-to-prev-tab) | |
(global-set-key [tab-line S-wheel-down] #'custom-tab-line-switch-to-next-tab) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment