Watch the recording on YouTube!
https://www.youtube.com/channel/UCZ4HO8or08HUGUzA0w8Tagw
Today we're going to work on customizing Emacs' tab-bar-mode to see if it can be used as a replacement for other workspace packages like Perspective.el.
Lots of new things have been added for it in Emacs 28, so let's try it out!
The Plan
Using tab-bar solely as a global mode line: http://ruzkuku.com/texts/emacs-global.html
;; Inherit the face of `doom-modeline-panel` for better appearance
(set-face-attribute 'tab-bar-tab nil :inherit 'doom-modeline-panel :foreground nil :background nil)
;; Totally customize the format of the tab bar name
(defun my/tab-bar-format (tab i)
(propertize
(format
(concat
(if (eq (car tab) 'current-tab)
"🔥 " "")
"%s")
(alist-get 'name tab))
'face (list (append
'(:foreground "#FFFFFF")
(if (eq (car tab) 'current-tab)
'(:box t)
'())))))
;; Replace the default tab bar function
(setq tab-bar-tab-name-format-function #'my/tab-bar-format)
(defun my/tab-bar-tab-name-function ()
(let ((project (project-current)))
(if project
(project-root project)
(tab-bar-tab-name-current))))
(setq tab-bar-tab-name-function #'my/tab-bar-tab-name-function)
;; Only show the tab bar if there are 2 or more tabs
(setq tab-bar-show 1)
(defun my/tab-bar-string () "HELLO")
;; Customize the tab bar format to add the global mode line string
(setq tab-bar-format '(tab-bar-format-tabs tab-bar-separator tab-bar-format-align-right tab-bar-format-global))
(add-to-list 'global-mode-string "HELLO")
;; Make sure mode line text in the tab bar can be read
(set-face-attribute 'tab-bar nil :foreground "#FFFFFF")
(defun my/project-create-tab ()
(interactive)
(tab-bar-new-tab)
(magit-status))
(setq project-switch-commands #'my/project-create-tab)
(defun my/switch-to-tab-buffer ()
(interactive)
(if (project-current)
(call-interactively #'project-switch-to-buffer)
(call-interactively #'switch-to-buffer)))
(global-set-key (kbd "C-x b") #'my/switch-to-tab-buffer)
;; Turn on tab bar mode after startup
(tab-bar-mode 1)
;; Save the desktop session
(desktop-save-mode 1)