config

Personal configuration.
git clone git://code.dwrz.net/config
Log | Files | Refs

doom-modeline.el (10198B)


      1 ;;; doom-modeline.el --- A minimal and modern mode-line -*- lexical-binding: t; -*-
      2 
      3 ;; Copyright (C) 2018-2024 Vincent Zhang
      4 
      5 ;; Author: Vincent Zhang <seagle0128@gmail.com>
      6 ;; Homepage: https://github.com/seagle0128/doom-modeline
      7 ;; Version: 4.2.0
      8 ;; Package-Requires: ((emacs "25.1") (compat "29.1.4.2") (nerd-icons "0.1.0") (shrink-path "0.3.1"))
      9 ;; Keywords: faces mode-line
     10 
     11 ;; This file is not part of GNU Emacs.
     12 
     13 ;;
     14 ;; This program is free software; you can redistribute it and/or modify
     15 ;; it under the terms of the GNU General Public License as published by
     16 ;; the Free Software Foundation, either version 3 of the License, or
     17 ;; (at your option) any later version.
     18 ;;
     19 ;; This program is distributed in the hope that it will be useful,
     20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22 ;; GNU General Public License for more details.
     23 ;;
     24 ;; You should have received a copy of the GNU General Public License
     25 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
     26 ;;
     27 
     28 ;;; Commentary:
     29 ;;
     30 ;; This package offers a fancy and fast mode-line inspired by minimalism design.
     31 ;;
     32 ;; It's integrated into Doom Emacs (https://github.com/hlissner/doom-emacs) and
     33 ;; Centaur Emacs (https://github.com/seagle0128/.emacs.d).
     34 ;;
     35 ;; The doom-modeline offers:
     36 ;; - A match count panel (for anzu, iedit, multiple-cursors, symbol-overlay,
     37 ;;   evil-search and evil-substitute)
     38 ;; - An indicator for recording a macro
     39 ;; - Current environment version (e.g. python, ruby, go, etc.) in the major-mode
     40 ;; - A customizable mode-line height (see doom-modeline-height)
     41 ;; - A minor modes segment which is compatible with minions
     42 ;; - An error/warning count segment for flymake/flycheck
     43 ;; - A workspace number segment for eyebrowse
     44 ;; - A perspective name segment for persp-mode
     45 ;; - A window number segment for winum and window-numbering
     46 ;; - An indicator for modal editing state, including evil, overwrite, god, ryo
     47 ;;   and xah-fly-keys, etc.
     48 ;; - An indicator for battery status
     49 ;; - An indicator for current input method
     50 ;; - An indicator for debug state
     51 ;; - An indicator for remote host
     52 ;; - An indicator for LSP state with lsp-mode or eglot
     53 ;; - An indicator for github notifications
     54 ;; - An indicator for unread emails with mu4e-alert
     55 ;; - An indicator for unread emails with gnus (basically builtin)
     56 ;; - An indicator for irc notifications with circe, rcirc or erc.
     57 ;; - An indicator for buffer position which is compatible with nyan-mode or poke-line
     58 ;; - An indicator for party parrot
     59 ;; - An indicator for PDF page number with pdf-tools
     60 ;; - An indicator for markdown/org previews with grip
     61 ;; - Truncated file name, file icon, buffer state and project name in buffer
     62 ;;   information segment, which is compatible with project, find-file-in-project
     63 ;;   and projectile
     64 ;; - New mode-line for Info-mode buffers
     65 ;; - New package mode-line for paradox
     66 ;; - New mode-line for helm buffers
     67 ;; - New mode-line for git-timemachine buffers
     68 ;;
     69 ;; Installation:
     70 ;; From melpa, `M-x package-install RET doom-modeline RET`.
     71 ;; In `init.el`,
     72 ;; (require 'doom-modeline)
     73 ;; (doom-modeline-mode 1)
     74 ;; or
     75 ;; (use-package doom-modeline
     76 ;;   :ensure t
     77 ;;   :hook (after-init . doom-modeline-mode))
     78 ;;
     79 
     80 ;;; Code:
     81 
     82 (require 'doom-modeline-core)
     83 (require 'doom-modeline-segments)
     84 
     85 
     86 ;;
     87 ;; Mode lines
     88 ;;
     89 
     90 (doom-modeline-def-modeline 'main
     91   '(eldoc bar workspace-name window-number modals matches follow buffer-info remote-host buffer-position word-count parrot selection-info)
     92   '(compilation objed-state misc-info persp-name battery grip irc mu4e gnus github debug repl lsp minor-modes input-method indent-info buffer-encoding major-mode process vcs check time))
     93 
     94 (doom-modeline-def-modeline 'minimal
     95   '(bar window-number modals matches buffer-info-simple)
     96   '(media-info major-mode time))
     97 
     98 (doom-modeline-def-modeline 'special
     99   '(eldoc bar window-number modals matches buffer-info remote-host buffer-position word-count parrot selection-info)
    100   '(compilation objed-state misc-info battery irc-buffers debug minor-modes input-method indent-info buffer-encoding major-mode process time))
    101 
    102 (doom-modeline-def-modeline 'project
    103   '(bar window-number modals buffer-default-directory remote-host buffer-position)
    104   '(compilation misc-info battery irc mu4e gnus github debug minor-modes input-method major-mode process time))
    105 
    106 (doom-modeline-def-modeline 'dashboard
    107   '(bar window-number modals buffer-default-directory-simple remote-host)
    108   '(compilation misc-info battery irc mu4e gnus github debug minor-modes input-method major-mode process time))
    109 
    110 (doom-modeline-def-modeline 'vcs
    111   '(bar window-number modals matches buffer-info remote-host buffer-position parrot selection-info)
    112   '(compilation misc-info battery irc mu4e gnus github debug minor-modes buffer-encoding major-mode process time))
    113 
    114 (doom-modeline-def-modeline 'package
    115   '(bar window-number modals package)
    116   '(compilation misc-info major-mode process time))
    117 
    118 (doom-modeline-def-modeline 'info
    119   '(bar window-number modals buffer-info info-nodes buffer-position parrot selection-info)
    120   '(compilation misc-info buffer-encoding major-mode time))
    121 
    122 (doom-modeline-def-modeline 'media
    123   '(bar window-number modals buffer-size buffer-info)
    124   '(compilation misc-info media-info major-mode process vcs time))
    125 
    126 (doom-modeline-def-modeline 'message
    127   '(eldoc bar window-number modals matches buffer-info-simple buffer-position word-count parrot selection-info)
    128   '(compilation objed-state misc-info battery debug minor-modes input-method indent-info buffer-encoding major-mode time))
    129 
    130 (doom-modeline-def-modeline 'pdf
    131   '(bar window-number modals matches buffer-info pdf-pages)
    132   '(compilation misc-info major-mode process vcs time))
    133 
    134 (doom-modeline-def-modeline 'org-src
    135   '(eldoc bar window-number modals matches buffer-info buffer-position word-count parrot selection-info)
    136   '(compilation objed-state misc-info debug lsp minor-modes input-method indent-info buffer-encoding major-mode process check time))
    137 
    138 (doom-modeline-def-modeline 'helm
    139   '(bar helm-buffer-id helm-number helm-follow helm-prefix-argument)
    140   '(helm-help time))
    141 
    142 (doom-modeline-def-modeline 'timemachine
    143   '(eldoc bar window-number modals matches git-timemachine buffer-position word-count parrot selection-info)
    144   '(misc-info minor-modes indent-info buffer-encoding major-mode time))
    145 
    146 (doom-modeline-def-modeline 'calculator
    147   '(window-number modals matches calc buffer-position)
    148   '(misc-info minor-modes major-mode process))
    149 
    150 
    151 ;;
    152 ;; Interfaces
    153 ;;
    154 
    155 ;;;###autoload
    156 (defun doom-modeline-set-main-modeline (&optional default)
    157   "Set main mode-line.
    158 If DEFAULT is non-nil, set the default mode-line for all buffers."
    159   (doom-modeline-set-modeline 'main default))
    160 
    161 
    162 ;;
    163 ;; Minor mode
    164 ;;
    165 
    166 ;; Suppress warnings
    167 (defvar 2C-mode-line-format)
    168 (defvar flymake-mode-line-format)
    169 (defvar helm-ag-show-status-function)
    170 (declare-function helm-display-mode-line "ext:helm-core")
    171 
    172 (defvar doom-modeline-mode-map (make-sparse-keymap))
    173 
    174 (defvar doom-modeline-mode-alist
    175   '((message-mode         . message)
    176     (git-commit-mode      . message)
    177     (magit-mode           . vcs)
    178     (dashboard-mode       . dashboard)
    179     (Info-mode            . info)
    180     (image-mode           . media)
    181     (pdf-view-mode        . pdf)
    182     (org-src-mode         . org-src)
    183     (paradox-menu-mode    . package)
    184     (xwidget-webkit-mode  . minimal)
    185     (git-timemachine-mode . timemachine)
    186     (calc-mode            . calculator)
    187     (calc-trail-mode      . calculator)
    188     (circe-mode           . special)
    189     (erc-mode             . special)
    190     (rcirc-mode           . special))
    191   "Alist of major modes and mode-lines.")
    192 
    193 (defun doom-modeline-auto-set-modeline ()
    194   "Set mode-line base on major-mode."
    195   (catch 'found
    196     (dolist (x doom-modeline-mode-alist)
    197       (when (derived-mode-p (car x))
    198         (doom-modeline-set-modeline (cdr x))
    199         (throw 'found x)))))
    200 
    201 (defun doom-modeline-set-helm-modeline (&rest _) ; To advice helm
    202   "Set helm mode-line."
    203   (doom-modeline-set-modeline 'helm))
    204 
    205 ;;;###autoload
    206 (define-minor-mode doom-modeline-mode
    207   "Toggle `doom-modeline' on or off."
    208   :group 'doom-modeline
    209   :global t
    210   :lighter nil
    211   :keymap doom-modeline-mode-map
    212   (if doom-modeline-mode
    213       (progn
    214         (doom-modeline-refresh-bars)        ; Create bars
    215         (doom-modeline-set-main-modeline t) ; Set default mode-line
    216 
    217         ;; Apply to all existing buffers.
    218         (dolist (buf (buffer-list))
    219           (with-current-buffer buf
    220             (unless (doom-modeline-auto-set-modeline)
    221               (doom-modeline-set-main-modeline))))
    222 
    223         ;; For flymake
    224         (setq flymake-mode-line-format nil) ; remove the lighter of minor mode
    225 
    226         ;; For Eldoc
    227         (setq eldoc-message-function #'doom-modeline-eldoc-minibuffer-message)
    228 
    229         ;; For two-column editing
    230         (setq 2C-mode-line-format (doom-modeline 'special))
    231 
    232         ;; Automatically set mode-lines
    233         (add-hook 'after-change-major-mode-hook #'doom-modeline-auto-set-modeline)
    234 
    235         ;; Special handles
    236         (advice-add #'helm-display-mode-line :after #'doom-modeline-set-helm-modeline)
    237         (setq helm-ag-show-status-function #'doom-modeline-set-helm-modeline))
    238     (progn
    239       ;; Restore mode-line
    240       (let ((original-format (doom-modeline--original-value 'mode-line-format)))
    241         (setq-default mode-line-format original-format)
    242         (dolist (buf (buffer-list))
    243           (with-current-buffer buf
    244             (setq mode-line-format original-format))))
    245 
    246       ;; For flymake
    247       (setq flymake-mode-line-format (doom-modeline--original-value 'flymake-mode-line-format))
    248 
    249       ;; For Eldoc
    250       (setq eldoc-message-function #'eldoc-minibuffer-message)
    251 
    252       ;; For two-column editing
    253       (setq 2C-mode-line-format (doom-modeline--original-value '2C-mode-line-format))
    254 
    255       ;; Cleanup
    256       (remove-hook 'after-change-major-mode-hook #'doom-modeline-auto-set-modeline)
    257       (advice-remove #'helm-display-mode-line #'doom-modeline-set-helm-modeline)
    258       (setq helm-ag-show-status-function (default-value 'helm-ag-show-status-function)))))
    259 
    260 (provide 'doom-modeline)
    261 
    262 ;;; doom-modeline.el ends here