From 9d327e4f702512b6833c9af582c0d1361d7bd3f6 Mon Sep 17 00:00:00 2001
From: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Sun, 30 Jun 2024 00:45:49 +0100
Subject: (Emacs/config)~Mode-line is now centred

---
 Emacs/.config/emacs/config.org | 125 +++++++++++++++++++++++++++++------------
 1 file changed, 89 insertions(+), 36 deletions(-)

(limited to 'Emacs')

diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org
index c7b3946..1d523fd 100644
--- a/Emacs/.config/emacs/config.org
+++ b/Emacs/.config/emacs/config.org
@@ -293,48 +293,101 @@ the borders for Emacs.
   (fringe-mode 0))
 #+end_src
 ** Mode line
-A mode line in an editor can provide a LOT of information, or very
-little.  I customised the Emacs modeline to give me a bit of info,
-~telephone-line~ to give me a lot.
-
-Currently I use the default mode line with some customisation;
-simplicity is above all.
-
-#+begin_src emacs-lisp
-(setq-default
- mode-line-format
- '("%l:%c    "                          ;; Line and column
-   "%p["                                ;; %into file
-   (:eval (with-eval-after-load "evil" ;; Evil state
-            (upcase
-             (substring
-              (format "%s" (if (bound-and-true-p evil-state)
-                               evil-state
-                             " "))
-              0 1))))
-   "]    "
-   "%+%b("
-   (:eval (format "%s" major-mode))
-   ")    "
-   "%I    "                             ;; file size
-   (:eval (if (project-current)
-              (project-name (project-current))))
-   (vc-mode vc-mode)                   ;; git branch
-   "    "
-   (:eval
-    (with-eval-after-load "eglot"
-      (if eglot--managed-mode
-          (eglot--mode-line-format))))
-   mode-line-misc-info
-   mode-line-end-spaces))
+The mode line is a little bar at the bottom of the buffer, just above
+the minibuffer (where you do completions).  It can store quite
+literally anything, but generally stuff like the buffer name, file
+type, column and line info, etc is put there.
+
+The default mode-line is just... disgusting.  It displays information
+in an unintelligible format that you just have to learn and seems to
+smash together a bunch of information without much care for ordering.
+Most heartbreaking is that any mode can just insert new information
+onto the mode-line without any purview, which can be really annoying.
+It's also very overstimulating.
+
+Here I define a "nicer" (imo) mode-line-format which contains just the
+information I need to know what that buffer does.  It also looks a bit
+more aesthetically pleasing from being centred along the window.
+
+*** A better evil state tag
+[[*Evil][Evil]], defined later, has a mode-line-tag for
+mode-line-format.  It's not awful but not exactly amazing either.  So
+I'm defining a little function which makes the tag for me
+#+begin_src emacs-lisp
+(defun +mode-line/evil-state ()
+  "Returns either the empty string if no evil-state is defined or
+the first character of the evil state capitalised"
+  (with-eval-after-load "evil"
+    (if (bound-and-true-p evil-state)
+        (upcase
+         (substring
+	        (format "%s"
+			            evil-state)
+          0 1))
+      "")))
+#+end_src
+*** +mode-line/format
+Here I declare a new variable ~+mode-line/format~ which contains the
+usual contents for ~mode-line-format~.  Looking at the
+[[info:elisp#Mode Line Top][info page]] for the mode-line, it's
+essentially a list of either format strings (specially defined by
+mode-line), variables or special forms.  The only special form I use
+here is ~:eval~ which evaluates the following expression every time
+the mode-line is constructed.
+#+begin_src emacs-lisp
+(defvar +mode-line/format
+  '("%l:%c    "                          ;; Line and column
+    "%p"                                 ;; %into file
+    ("["                                 ;; evil state
+     (:eval (+mode-line/evil-state))
+     "]    ")
+    "%+"                                 ;; Buffer state (changed or not)
+    "%b"                                 ;; Buffer name
+    ("("                                 ;; Major mode
+     (:eval (format "%s" major-mode))
+     ")    ")
+    "%I    "                             ;; Buffer size (in bytes)
+    (:eval (if (project-current)         ;; Name of current project (if any)
+	             (project-name
+                (project-current))))
+    (vc-mode vc-mode)                    ;; Git branch (if any)
+    "    "
+    (:eval                               ;; LSP information
+     (with-eval-after-load "eglot"
+       (if eglot--managed-mode
+           (eglot--mode-line-format))))
+    mode-line-misc-info                  ;; Any other information
+    )
+  "General format of mode line")
+#+end_src
+*** Left padding for the mode line
+Here's the main logic for centring the entire mode-line.  Essentially
+just generate a string with enough spaces that the mode-line is in the
+exact centre.
+#+begin_src emacs-lisp
+(defun +mode-line/left-padding ()
+  "Returns a string of spaces which will centre the mode-line if put
+to the left of it."
+  (let* ((mode-line-size (length (format-mode-line +mode-line/format)))
+         (string-size (/ (- (window-width) mode-line-size) 2)))
+    ;; ?\s means a whitespace character (why not #\Space Stallman?!)
+    (make-string string-size ?\s)))
+#+end_src
+*** mode-line-format
+Put the left padded string and the rest of the format together to get
+a nice little mode-line.
+#+begin_src emacs-lisp
+(setq-default mode-line-format
+              `((:eval (+mode-line/left-padding))
+                ,@+mode-line/format))
 #+end_src
 ** Mouse
 Who uses a mouse? 🤮
 
 This disables the use of GUI dialogues for stuff.
 #+begin_src emacs-lisp
-(setq-default use-file-dialog nil
-              use-dialog-box nil)
+  (setq-default use-file-dialog nil
+		use-dialog-box nil)
 #+end_src
 ** Scrolling
 Emacs can automatically scroll the buffer depending on how many lines
-- 
cgit v1.2.3-13-gbd6f