summaryrefslogtreecommitdiff
path: root/tab-conf.el
diff options
context:
space:
mode:
Diffstat (limited to 'tab-conf.el')
-rw-r--r--tab-conf.el58
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."