diff options
Diffstat (limited to 'tab-conf.el')
-rw-r--r-- | tab-conf.el | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tab-conf.el b/tab-conf.el index f55259c..eb58fe1 100644 --- a/tab-conf.el +++ b/tab-conf.el @@ -6,6 +6,64 @@ (define-key tab-switcher-mode-map (vector ?p) 'tab-switcher-prev-or-last) (define-key tab-prefix-map (vector 'tab) 'tab-switcher) +(define-key global-map (vector ?\s-t) #'durand-switch-tab-dwim) + +;;;###autoload +(defun durand-switch-tab-dwim (&optional arg) + "Do what I mean if I want to switch tabs. + +If there is only one tab, or if ARG is '(4), create another one, +prompting me for the buffer to display in the new tab. + +If there are two tabs and ARG is not '(4) or '(16), just switch +between them. + +If there are more than two tabs and if ARG is not '(4) or '(16), +then use complting-read to ask for a tab to switch to. + +If ARG is '(16), then use completing-read to ask for a tab to +delete. The default is the current tab. However, if there is only +one tab, create another one, prompting me for the buffer to +display in the new tab." + (interactive "P") + (let ((tabs (seq-sort + (lambda (t1 t2) + (cond + ((null (assoc 'time t1))) + ((null (assoc 'time t2)) nil) + (t (> (alist-get 'time t1) + (alist-get 'time t2))))) + (tab-bar-tabs)))) + (cond + ((or (equal arg (cons 4 nil)) + (null (cdr tabs))) + (switch-to-buffer-other-tab (read-buffer "Switch to buffer in a new tab" + (other-buffer)))) + ((and (cdr tabs) + (null (cddr tabs)) + (not (or (equal arg (cons 4 nil)) + (equal arg (cons 16 nil))))) + (tab-bar-switch-to-tab (cdr (assoc 'name (cadr tabs))))) + ((not (or (equal arg (cons 4 nil)) + (equal arg (cons 16 nil)))) + (tab-bar-switch-to-tab + (completing-read (format + "Switch to tab by name (default %s): " + (cdr (assoc 'name (cadr tabs)))) + (mapcar (lambda (tab) + (cdr (assoc 'name tab))) + tabs) + nil nil nil nil + (cdr (assoc 'name (cadr tabs)))))) + ((equal arg (cons 16 nil)) + (tab-bar-close-tab-by-name + (completing-read "Close tab: " + (mapcar (lambda (tab) + (cdr (assoc 'name tab))) + tabs) + nil nil nil nil + (cdr (assoc 'name (car tabs))))))))) + ;;;###autoload (defun tab-switcher-first () "Go to the first window configuration line." |