doom-modeline/doom-modeline.el

315 lines
12 KiB
EmacsLisp
Raw Normal View History

2018-12-25 04:53:44 +08:00
;;; doom-modeline.el --- A minimal and modern mode-line -*- lexical-binding: t; -*-
2018-06-12 01:13:02 +08:00
2020-01-18 00:13:25 +08:00
;; Copyright (C) 2018-2020 Vincent Zhang
2018-06-12 01:13:02 +08:00
;; Author: Vincent Zhang <seagle0128@gmail.com>
2018-07-05 16:39:41 +08:00
;; Homepage: https://github.com/seagle0128/doom-modeline
2020-06-19 01:12:34 +08:00
;; Version: 3.1.0
2020-02-01 17:21:27 +08:00
;; Package-Requires: ((emacs "25.1") (all-the-icons "2.2.0") (shrink-path "0.2.0") (dash "2.11.0"))
2018-07-30 15:01:47 +08:00
;; Keywords: faces mode-line
2018-06-12 01:13:02 +08:00
;; This file is not part of GNU Emacs.
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;
;;; Commentary:
;;
2019-03-07 17:52:07 +07:00
;; This package offers a fancy and fast mode-line inspired by minimalism design.
2018-06-12 01:13:02 +08:00
;;
2019-03-07 17:52:07 +07:00
;; It's integrated into Doom Emacs (https://github.com/hlissner/doom-emacs) and
;; Centaur Emacs (https://github.com/seagle0128/.emacs.d).
;;
;; The doom-modeline offers:
2018-11-28 02:48:16 +08:00
;; - A match count panel (for anzu, iedit, multiple-cursors, symbol-overlay,
;; evil-search and evil-substitute)
2018-11-27 21:32:00 +08:00
;; - An indicator for recording a macro
;; - Current environment version (e.g. python, ruby, go, etc.) in the major-mode
2018-11-27 21:32:00 +08:00
;; - A customizable mode-line height (see doom-modeline-height)
;; - A minor modes segment which is compatible with minions
2019-01-02 20:57:54 +08:00
;; - An error/warning count segment for flymake/flycheck
2018-11-27 21:32:00 +08:00
;; - A workspace number segment for eyebrowse
;; - A perspective name segment for persp-mode
2018-11-27 21:32:00 +08:00
;; - A window number segment for winum and window-numbering
2019-09-09 17:09:52 +08:00
;; - An indicator for modal editing state, including evil, overwrite, god, ryo
;; and xah-fly-keys, etc.
;; - An indicator for battery status
2018-11-27 21:32:00 +08:00
;; - An indicator for current input method
2018-12-21 00:35:59 +08:00
;; - An indicator for debug state
;; - An indicator for remote host
;; - An indicator for LSP state with lsp-mode or eglot
;; - An indicator for github notifications
;; - An indicator for unread emails with mu4e-alert
;; - An indicator for unread emails with gnus (basically builtin)
2019-11-18 04:07:34 +08:00
;; - An indicator for irc notifications with circe, rcirc or erc.
;; - An indicator for buffer position which is compatible with nyan-mode
2019-01-08 10:45:25 -05:00
;; - An indicator for party parrot
2019-05-10 03:24:36 +08:00
;; - An indicator for PDF page number with pdf-tools
;; - An indicator for markdown/org preivews with grip
2018-12-23 00:32:33 +08:00
;; - Truncated file name, file icon, buffer state and project name in buffer
2019-09-09 17:09:52 +08:00
;; information segment, which is compatible with project, find-file-in-project
;; and projectile
2019-05-10 03:24:36 +08:00
;; - New mode-line for Info-mode buffers
;; - New package mode-line for paradox
;; - New mode-line for helm buffers
2019-05-20 01:52:51 +08:00
;; - New mode-line for git-timemachine buffers
2018-06-12 01:13:02 +08:00
;;
;; Installation:
;; From melpa, `M-x package-install RET doom-modeline RET`.
;; In `init.el`,
;; (require 'doom-modeline)
;; (doom-modeline-mode 1)
;; or
;; (use-package doom-modeline
;; :ensure t
;; :hook (after-init . doom-modeline-mode))
;;
2018-06-12 01:13:02 +08:00
;;; Code:
(require 'doom-modeline-core)
(require 'doom-modeline-segments)
2018-06-12 01:13:02 +08:00
;;
;; Mode lines
;;
(doom-modeline-def-modeline 'main
2019-11-24 21:58:18 +08:00
'(bar workspace-name window-number modals matches buffer-info remote-host buffer-position word-count parrot selection-info)
2020-06-09 11:34:32 -03:00
'(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 checker))
2018-06-12 01:13:02 +08:00
(doom-modeline-def-modeline 'minimal
2019-05-23 03:54:06 +08:00
'(bar matches buffer-info-simple)
'(media-info major-mode))
2018-06-12 01:13:02 +08:00
(doom-modeline-def-modeline 'special
2019-11-24 21:58:18 +08:00
'(bar window-number modals matches buffer-info buffer-position word-count parrot selection-info)
'(objed-state misc-info battery irc-buffers debug minor-modes input-method indent-info buffer-encoding major-mode process))
2018-06-12 01:13:02 +08:00
(doom-modeline-def-modeline 'project
'(bar window-number buffer-default-directory)
'(misc-info battery irc mu4e gnus github debug minor-modes input-method major-mode process))
2018-06-12 01:13:02 +08:00
2020-07-25 14:24:18 +08:00
(doom-modeline-def-modeline 'dashboard
'(bar window-number buffer-default-directory-simple)
'(misc-info battery irc mu4e gnus github debug minor-modes input-method major-mode process))
2019-11-20 22:09:18 +08:00
(doom-modeline-def-modeline 'vcs
'(bar window-number modals matches buffer-info buffer-position parrot selection-info)
'(misc-info battery irc mu4e gnus github debug minor-modes buffer-encoding major-mode process))
2019-11-20 22:09:18 +08:00
2019-05-10 01:53:14 +08:00
(doom-modeline-def-modeline 'package
'(bar window-number package)
'(misc-info major-mode process))
2019-05-10 01:53:14 +08:00
(doom-modeline-def-modeline 'info
'(bar window-number buffer-info info-nodes buffer-position parrot selection-info)
2019-05-10 01:53:14 +08:00
'(misc-info buffer-encoding major-mode))
(doom-modeline-def-modeline 'media
'(bar window-number buffer-size buffer-info)
'(misc-info media-info major-mode process vcs))
2019-12-28 23:13:29 +13:00
(doom-modeline-def-modeline 'message
'(bar window-number modals matches buffer-info-simple buffer-position word-count parrot selection-info)
'(objed-state misc-info battery debug minor-modes input-method indent-info buffer-encoding major-mode))
(doom-modeline-def-modeline 'pdf
2020-02-27 22:31:52 +08:00
'(bar window-number matches buffer-info pdf-pages)
'(misc-info major-mode process vcs))
2018-06-12 01:13:02 +08:00
2020-02-29 03:26:16 +08:00
(doom-modeline-def-modeline 'org-src
'(bar window-number modals matches buffer-info-simple buffer-position word-count parrot selection-info)
'(objed-state misc-info debug lsp minor-modes input-method indent-info buffer-encoding major-mode process checker))
2020-02-29 03:26:16 +08:00
2019-05-10 03:17:15 +08:00
(doom-modeline-def-modeline 'helm
'(bar helm-buffer-id helm-number helm-follow helm-prefix-argument)
'(helm-help))
(doom-modeline-def-modeline 'timemachine
2019-11-24 21:58:18 +08:00
'(bar window-number matches git-timemachine buffer-position word-count parrot selection-info)
2019-11-24 22:00:33 +08:00
'(misc-info minor-modes indent-info buffer-encoding major-mode))
2018-12-28 18:13:42 +08:00
2020-02-01 17:21:27 +08:00
2018-06-12 01:13:02 +08:00
;;
;; Interfaces
2018-06-12 01:13:02 +08:00
;;
;;;###autoload
2018-06-13 12:23:17 +08:00
(defun doom-modeline-init ()
2018-06-19 17:58:24 +08:00
"Initialize doom mode-line."
(doom-modeline-mode 1))
(make-obsolete 'doom-modeline-init 'doom-modeline-mode "1.6.0")
;;;###autoload
(defun doom-modeline-set-main-modeline (&optional default)
"Set main mode-line.
If DEFAULT is non-nil, set the default mode-line for all buffers."
(doom-modeline-set-modeline 'main default))
2018-06-12 01:13:02 +08:00
2018-11-29 23:23:39 +08:00
;;;###autoload
(defun doom-modeline-set-minimal-modeline ()
"Set minimal mode-line."
2018-11-29 23:23:39 +08:00
(doom-modeline-set-modeline 'minimal))
2018-07-02 17:36:43 +08:00
;;;###autoload
2018-06-13 12:23:17 +08:00
(defun doom-modeline-set-special-modeline ()
2018-06-19 17:58:24 +08:00
"Set sepcial mode-line."
2018-06-19 19:08:55 +08:00
(doom-modeline-set-modeline 'special))
2018-06-12 01:13:02 +08:00
2018-07-02 17:36:43 +08:00
;;;###autoload
(defun doom-modeline-set-project-modeline ()
2018-06-19 17:58:24 +08:00
"Set project mode-line."
2018-06-19 19:08:55 +08:00
(doom-modeline-set-modeline 'project))
2020-07-25 14:24:18 +08:00
;;;###autoload
(defun doom-modeline-set-dashboard-modeline ()
"Set dashboard mode-line."
(doom-modeline-set-modeline 'dashboard))
2019-11-20 22:09:18 +08:00
;;;###autoload
(defun doom-modeline-set-vcs-modeline ()
"Set vcs mode-line."
(doom-modeline-set-modeline 'vcs))
;;;###autoload
2019-05-10 01:53:14 +08:00
(defun doom-modeline-set-info-modeline ()
"Set Info mode-line."
(doom-modeline-set-modeline 'info))
2019-05-06 02:06:03 +08:00
;;;###autoload
(defun doom-modeline-set-package-modeline ()
"Set package mode-line."
(doom-modeline-set-modeline 'package))
2019-05-10 01:53:14 +08:00
;;;###autoload
(defun doom-modeline-set-media-modeline ()
"Set media mode-line."
(doom-modeline-set-modeline 'media))
2019-12-28 23:13:29 +13:00
;;;###autoload
(defun doom-modeline-set-message-modeline ()
"Set message mode-line."
(doom-modeline-set-modeline 'message))
2019-05-10 01:53:14 +08:00
;;;###autoload
(defun doom-modeline-set-pdf-modeline ()
"Set pdf mode-line."
(doom-modeline-set-modeline 'pdf))
2019-05-10 03:17:15 +08:00
;;;###autoload
2020-02-29 03:26:16 +08:00
(defun doom-modeline-set-org-src-modeline ()
"Set org-src mode-line."
(doom-modeline-set-modeline 'org-src))
2019-11-24 22:05:43 +08:00
;;;###autoload
(defun doom-modeline-set-helm-modeline (&rest _) ; To advice helm
"Set helm mode-line."
(doom-modeline-set-modeline 'helm))
2020-02-29 03:26:16 +08:00
;;;###autoload
(defun doom-modeline-set-timemachine-modeline ()
"Set timemachine mode-line."
(doom-modeline-set-modeline 'timemachine))
2018-12-28 18:13:42 +08:00
;;
2019-11-05 21:06:53 +08:00
;; Minor mode
;;
(defvar doom-modeline--default-format mode-line-format
"Storage for the default `mode-line-format'.
So it can be restored when `doom-modeline-mode' is disabled.")
2019-10-08 12:15:40 +08:00
(defvar doom-modeline-mode-map (make-sparse-keymap))
2019-11-05 21:06:53 +08:00
;; Suppress warnings
(declare-function helm-display-mode-line 'helm)
;;;###autoload
(define-minor-mode doom-modeline-mode
"Toggle doom-modeline on or off."
:group 'doom-modeline
:global t
:lighter nil
2019-10-08 12:15:40 +08:00
:keymap doom-modeline-mode-map
(if doom-modeline-mode
(progn
2019-11-05 21:06:53 +08:00
(doom-modeline-refresh-bars) ; Create bars
(doom-modeline-set-main-modeline) ; Set mode-line for current buffer
2019-11-05 21:06:53 +08:00
(doom-modeline-set-main-modeline t) ; Set default mode-line
2020-01-15 02:04:27 +08:00
;; These buffers are already created and don't get modelines
(dolist (bname '("*scratch*" "*Messages*"))
(if (buffer-live-p (get-buffer bname))
(with-current-buffer bname
(doom-modeline-set-main-modeline))))
2020-01-15 02:04:27 +08:00
;; Add hooks
2019-05-10 01:53:14 +08:00
(add-hook 'Info-mode-hook #'doom-modeline-set-info-modeline)
2019-05-19 15:59:13 +08:00
(add-hook 'dired-mode-hook #'doom-modeline-set-project-modeline)
2020-07-25 14:24:18 +08:00
(add-hook 'dashboard-mode-hook #'doom-modeline-set-dashboard-modeline)
(add-hook 'image-mode-hook #'doom-modeline-set-media-modeline)
2019-12-28 23:13:29 +13:00
(add-hook 'message-mode-hook #'doom-modeline-set-message-modeline)
(add-hook 'git-commit-mode-hook #'doom-modeline-set-message-modeline)
2019-11-20 22:09:18 +08:00
(add-hook 'magit-mode-hook #'doom-modeline-set-vcs-modeline)
(add-hook 'circe-mode-hook #'doom-modeline-set-special-modeline)
(add-hook 'erc-mode-hook #'doom-modeline-set-special-modeline)
(add-hook 'rcirc-mode-hook #'doom-modeline-set-special-modeline)
2019-05-12 01:02:05 +08:00
(add-hook 'pdf-view-mode-hook #'doom-modeline-set-pdf-modeline)
2020-02-29 03:26:16 +08:00
(add-hook 'org-src-mode-hook #'doom-modeline-set-org-src-modeline)
(add-hook 'git-timemachine-mode-hook #'doom-modeline-set-timemachine-modeline)
2019-05-10 03:17:15 +08:00
(add-hook 'paradox-menu-mode-hook #'doom-modeline-set-package-modeline)
2020-01-15 02:04:27 +08:00
(add-hook 'xwidget-webkit-mode-hook #'doom-modeline-set-minimal-modeline)
;; Add advices
(advice-add #'helm-display-mode-line :after #'doom-modeline-set-helm-modeline))
(progn
;; Restore mode-line
(setq mode-line-format doom-modeline--default-format)
(setq-default mode-line-format doom-modeline--default-format)
(dolist (bname '("*scratch*" "*Messages*"))
(if (buffer-live-p (get-buffer bname))
(with-current-buffer bname
(setq mode-line-format doom-modeline--default-format))))
2020-01-15 02:04:27 +08:00
;; Remove hooks
2019-05-10 01:53:14 +08:00
(remove-hook 'Info-mode-hook #'doom-modeline-set-info-modeline)
2019-05-19 15:59:13 +08:00
(remove-hook 'dired-mode-hook #'doom-modeline-set-project-modeline)
2020-07-25 14:24:18 +08:00
(remove-hook 'dashboard-mode-hook #'doom-modeline-set-dashboard-modeline)
(remove-hook 'image-mode-hook #'doom-modeline-set-media-modeline)
2019-12-28 23:13:29 +13:00
(remove-hook 'message-mode-hook #'doom-modeline-set-message-modeline)
(remove-hook 'git-commit-mode-hook #'doom-modeline-set-message-modeline)
2019-11-20 22:09:18 +08:00
(remove-hook 'magit-mode-hook #'doom-modeline-set-vcs-modeline)
(remove-hook 'circe-mode-hook #'doom-modeline-set-special-modeline)
(remove-hook 'erc-mode-hook #'doom-modeline-set-special-modeline)
(remove-hook 'rcirc-mode-hook #'doom-modeline-set-special-modeline)
2019-05-12 01:02:05 +08:00
(remove-hook 'pdf-view-mode-hook #'doom-modeline-set-pdf-modeline)
2020-02-29 03:26:16 +08:00
(remove-hook 'org-src-mode-hook #'doom-modeline-set-org-src-modeline)
(remove-hook 'git-timemachine-mode-hook #'doom-modeline-set-timemachine-modeline)
2019-05-10 03:17:15 +08:00
(remove-hook 'paradox-menu-mode-hook #'doom-modeline-set-package-modeline)
2020-01-15 02:04:27 +08:00
(remove-hook 'xwidget-webkit-mode-hook #'doom-modeline-set-minimal-modeline)
2019-05-10 03:17:15 +08:00
;; Remove advices
(advice-remove #'helm-display-mode-line #'doom-modeline-set-helm-modeline))))
2018-06-12 01:13:02 +08:00
(provide 'doom-modeline)
;;; doom-modeline.el ends here