From 3379638199bf15bb1439209c1d5ace8daa560cfd Mon Sep 17 00:00:00 2001
From: Case Duckworth
Date: Mon, 10 Jan 2022 23:44:45 -0600
Subject: Change mode-line and tab-bar

---
 lisp/+modeline.el | 47 +++++++++++++++++---------------
 lisp/+tab-bar.el  | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 22 deletions(-)
 create mode 100644 lisp/+tab-bar.el

(limited to 'lisp')

diff --git a/lisp/+modeline.el b/lisp/+modeline.el
index a0195f1..3f25a40 100644
--- a/lisp/+modeline.el
+++ b/lisp/+modeline.el
@@ -88,7 +88,7 @@ This function makes a lambda, so you can throw it straight into
 (defun +modeline-major-mode (&optional spacer)
   "Display the current `major-mode'."
   (concat (or spacer +modeline-default-spacer)
-          (propertize (+string-truncate (format-mode-line mode-name) 12)
+          (propertize (+string-truncate (format-mode-line mode-name) 16)
                       'face 'bold
                       'keymap mode-line-major-mode-keymap
                       'help-echo (concat (format-mode-line mode-name)
@@ -185,27 +185,30 @@ The order of elements matters: whichever one matches first is applied."
 
 (defun +modeline-position (&optional _) ; adapted from `simple-modeline'
   "Display the current cursor position."
-  (list '((line-number-mode
-           ((column-number-mode
-             (column-number-indicator-zero-based
-              (9 " %l:%c")
-              (9 " %l:%C"))
-             (6 " %l:")))
-           ((column-number-mode
-             (column-number-indicator-zero-based
-              (5 " :%c")
-              (5 " :%C"))))))
-        '(file-percentage-mode
-          ((-3 "%p") "%% "))
-        (if (region-active-p)
-            (propertize (format "%s%-5d"
-                                (if (and (mark) (< (point) (mark))) "-" "+")
-                                (apply '+ (mapcar
-                                           (lambda (pos)
-                                             (- (cdr pos)
-                                                (car pos)))
-                                           (region-bounds))))
-                        'font-lock-face 'font-lock-variable-name-face))))
+  (let ((sep "|") (before " [") (after "]"))
+    (list `(:propertize (line-number-mode
+                         ((column-number-mode
+                           (column-number-indicator-zero-based
+                            ,(concat before "%l" sep "%c" after)
+                            ,(concat before "%l" sep "%C" after))
+                           ,(concat before "%l" sep "" after)))
+                         ((column-number-mode
+                           (column-number-indicator-zero-based
+                            ,(concat before sep "%c" after)
+                            ,(concat before sep "%C" after)))))
+                        font-lock-face font-lock-comment-face)
+          (if (region-active-p)
+              (propertize (format "%s%-5d"
+                                  (if (and (mark) (< (point) (mark))) "-" "+")
+                                  (apply '+ (mapcar
+                                             (lambda (pos)
+                                               (- (cdr pos)
+                                                  (car pos)))
+                                             (region-bounds))))
+                          'font-lock-face 'font-lock-variable-name-face))
+          '(:propertize (file-percentage-mode
+                         (" " (-3 "%p") "%%"))
+                        font-lock-face font-lock-comment-face))))
 
 (defun +modeline-vc (&optional spacer)
   "Display the version control branch of the current buffer in the modeline."
diff --git a/lisp/+tab-bar.el b/lisp/+tab-bar.el
new file mode 100644
index 0000000..2a03121
--- /dev/null
+++ b/lisp/+tab-bar.el
@@ -0,0 +1,80 @@
+;;; +tab-bar.el -*- lexical-binding: t; -*-
+
+;;; Commentary:
+
+;; Emacs 28 comes with an easy-to-use `tab-bar-format' option, but I still use
+;; Emacs 27 on my Windows machine.  Thus, the code in this file.
+
+;;; Code:
+
+(require 'tab-bar)
+
+
+;; Common
+
+(defun +tab-bar-misc-info ()
+  "Display `mode-line-misc-info', formatted for the tab-bar."
+  `((global menu-item ,(string-trim-right
+                        (format-mode-line mode-line-misc-info))
+            ignore)))
+
+(defvar +tab-bar-show-original nil
+  "Original value of `tab-bar-show'.")
+
+
+;; Emacs 27
+
+(defun +tab-bar-misc-info-27 (output &rest _)
+  "Display `mode-line-misc-info' in the `tab-bar' on Emacs 27.
+This is :filter-return advice for `tab-bar-make-keymap-1'."
+  (let* ((reserve (length (format-mode-line mode-line-misc-info)))
+         (str (propertize " "
+                          'display `(space :align-to (- right (- 0 right-margin)
+                                                        ,reserve)))))
+    (prog1 (append output
+             `((align-right menu-item ,str nil))
+             (+tab-bar-misc-info)))))
+
+
+;; Emacs 28
+
+(defvar +tab-bar-format-original nil
+  "Original value of `tab-bar-format'.")
+
+(defun +tab-bar-misc-info-28 ()
+  "Display `mode-line-misc-info', right-aligned, on Emacs 28."
+  (append (unless (memq 'tab-bar-format-align-right tab-bar-format)
+            '(tab-bar-format-align-right))
+          '(+tab-bar-misc-info)))
+
+
+
+(define-minor-mode +tab-bar-misc-info-mode
+  "Show the `mode-line-misc-info' in the `tab-bar'."
+  :lighter ""
+  :global t
+  (if +tab-bar-misc-info-mode
+      (progn                            ; Enable
+        (setq +tab-bar-show-original tab-bar-show)
+        (cond
+         ((boundp 'tab-bar-format)       ; Emacs 28
+          (setq +tab-bar-format-original tab-bar-format)
+          (unless (memq '+tab-bar-misc-info tab-bar-format)
+            (setq tab-bar-format
+                  (append tab-bar-format (+tab-bar-misc-info-28)))))
+         ((fboundp 'tab-bar-make-keymap-1) ; Emacs 27
+          (advice-add 'tab-bar-make-keymap-1 :filter-return
+                      '+tab-bar-misc-info-27)))
+        (setq tab-bar-show t))
+    (progn                              ; Disable
+      (setq tab-bar-show +tab-bar-show-original)
+      (cond
+       ((boundp 'tab-bar-format)        ; Emacs 28
+        (setq tab-bar-format +tab-bar-format-original))
+       ((fboundp 'tab-bar-make-keymap-1) ; Emacs 27
+        (advice-remove 'tab-bar-make-keymap-1 '+tab-bar-misc-info-27))))))
+
+
+
+(provide '+tab-bar)
+;;; +tab-bar.el ends here
-- 
cgit 1.4.1-21-gabe81