aboutsummaryrefslogtreecommitdiff
path: root/Emacs
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2024-06-30 00:45:49 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2024-06-30 00:45:49 +0100
commit9d327e4f702512b6833c9af582c0d1361d7bd3f6 (patch)
treee123a5dbc94c6ebf9efcee51b8c27c214e84508b /Emacs
parentc33474496bcae8a029bd630171153c4793aba81b (diff)
downloaddotfiles-9d327e4f702512b6833c9af582c0d1361d7bd3f6.tar.gz
dotfiles-9d327e4f702512b6833c9af582c0d1361d7bd3f6.tar.bz2
dotfiles-9d327e4f702512b6833c9af582c0d1361d7bd3f6.zip
(Emacs/config)~Mode-line is now centred
Diffstat (limited to 'Emacs')
-rw-r--r--Emacs/.config/emacs/config.org125
1 files changed, 89 insertions, 36 deletions
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