doom-modeline/doom-modeline.el

199 lines
7.1 KiB
EmacsLisp
Raw Normal View History

2018-12-24 20:53:44 +00:00
;;; doom-modeline.el --- A minimal and modern mode-line -*- lexical-binding: t; -*-
2018-06-11 17:13:02 +00:00
2019-01-02 08:51:26 +00:00
;; Copyright (C) 2018-2019 Vincent Zhang
2018-06-11 17:13:02 +00:00
;; Author: Vincent Zhang <seagle0128@gmail.com>
2018-07-05 08:39:41 +00:00
;; Homepage: https://github.com/seagle0128/doom-modeline
2019-02-26 08:21:26 +00:00
;; Version: 1.8.0
;; Package-Requires: ((emacs "25.1") (all-the-icons "1.0.0") (shrink-path "0.2.0") (eldoc-eval "0.1") (dash "2.11.0"))
2018-07-30 07:01:47 +00:00
;; Keywords: faces mode-line
2018-06-11 17:13:02 +00: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:
;;
;; This package offers a fancy and fast mode-line which was from DOOM Emacs
;; (https://github.com/hlissner/doom-emacs/tree/master/modules/ui/doom-modeline),
;; but it's more powerful and much faster.
2018-11-27 13:32:00 +00:00
;; It's also integrated into Centaur Emacs (https://github.com/seagle0128/.emacs.d).
2018-06-11 17:13:02 +00:00
;;
;; The doom-modeline was designed for minimalism, and offers:
2018-11-27 18:48:16 +00:00
;; - A match count panel (for anzu, iedit, multiple-cursors, symbol-overlay,
;; evil-search and evil-substitute)
2018-11-27 13:32:00 +00:00
;; - An indicator for recording a macro
;; - Current environment version (e.g. python, ruby, go, etc.) in the major-mode
2018-11-27 13:32:00 +00:00
;; - A customizable mode-line height (see doom-modeline-height)
;; - A minor modes segment which is compatible with minions
2019-01-02 12:57:54 +00:00
;; - An error/warning count segment for flymake/flycheck
2018-11-27 13:32:00 +00:00
;; - A workspace number segment for eyebrowse
;; - A perspective name segment for persp-mode
2018-11-27 13:32:00 +00:00
;; - A window number segment for winum and window-numbering
;; - An indicator for evil state
;; - An indicator for god state
;; - An indicator for ryo-modal state
;; - An indicator for xah-fly-keys state
2018-11-27 18:48:16 +00:00
;; - An indicator for remote host
2018-11-27 13:32:00 +00:00
;; - An indicator for current input method
2018-12-20 16:35:59 +00:00
;; - An indicator for debug state
;; - An indicator for LSP state
;; - An indicator for github notifications
;; - An indicator for unread emails with mu4e-alert
;; - An indicator for buffer position which is compatible with nyan-mode
2019-01-08 15:45:25 +00:00
;; - An indicator for party parrot
;; - An indicator for PDF page number
;; - An indicator for battery status with fancy-battery
2018-12-22 16:32:33 +00:00
;; - Truncated file name, file icon, buffer state and project name in buffer
;; information segment, which is compatible with projectile and project
2018-06-11 17:13:02 +00: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-11 17:13:02 +00:00
;;; Code:
(require 'doom-modeline-core)
(require 'doom-modeline-segments)
2018-06-11 17:13:02 +00:00
;;
;; Mode lines
;;
(doom-modeline-def-modeline 'main
'(bar workspace-number window-number evil-state god-state ryo-modal xah-fly-keys matches buffer-info remote-host buffer-position parrot selection-info)
'(misc-info persp-name lsp irc mu4e github debug fancy-battery minor-modes input-method buffer-encoding major-mode process vcs checker))
2018-06-11 17:13:02 +00:00
(doom-modeline-def-modeline 'minimal
2018-11-28 18:34:58 +00:00
'(bar matches " " buffer-info)
'(media-info major-mode " "))
2018-06-11 17:13:02 +00:00
(doom-modeline-def-modeline 'special
'(bar window-number evil-state god-state ryo-modal xah-fly-keys matches buffer-info-simple buffer-position parrot selection-info)
'(misc-info lsp irc-buffers debug fancy-battery minor-modes input-method buffer-encoding major-mode process checker))
2018-06-11 17:13:02 +00:00
(doom-modeline-def-modeline 'project
'(bar " " buffer-default-directory)
'(misc-info mu4e github debug fancy-battery " " major-mode " "))
2018-06-11 17:13:02 +00:00
(doom-modeline-def-modeline 'media
'(bar window-number buffer-size buffer-info)
'(misc-info media-info major-mode vcs " "))
(doom-modeline-def-modeline 'pdf
'(bar window-number buffer-size buffer-info pdf-pages)
'(misc-info " " major-mode vcs " "))
2018-06-11 17:13:02 +00:00
2018-12-28 10:13:42 +00:00
2018-06-11 17:13:02 +00:00
;;
;; Interfaces
2018-06-11 17:13:02 +00:00
;;
;;;###autoload
2018-06-13 04:23:17 +00:00
(defun doom-modeline-init ()
2018-06-19 09:58:24 +00: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-11 17:13:02 +00:00
2018-11-29 15:23:39 +00:00
;;;###autoload
(defun doom-modeline-set-minimal-modeline ()
"Set minimal mode-line."
2018-11-29 15:23:39 +00:00
(doom-modeline-set-modeline 'minimal))
2018-07-02 09:36:43 +00:00
;;;###autoload
2018-06-13 04:23:17 +00:00
(defun doom-modeline-set-special-modeline ()
2018-06-19 09:58:24 +00:00
"Set sepcial mode-line."
2018-06-19 11:08:55 +00:00
(doom-modeline-set-modeline 'special))
2018-06-11 17:13:02 +00:00
2018-07-02 09:36:43 +00:00
;;;###autoload
2018-06-13 04:23:17 +00:00
(defun doom-modeline-set-media-modeline ()
2018-06-19 09:58:24 +00:00
"Set media mode-line."
2018-06-19 11:08:55 +00:00
(doom-modeline-set-modeline 'media))
2018-06-11 17:13:02 +00:00
2018-07-02 09:36:43 +00:00
;;;###autoload
(defun doom-modeline-set-project-modeline ()
2018-06-19 09:58:24 +00:00
"Set project mode-line."
2018-06-19 11:08:55 +00:00
(doom-modeline-set-modeline 'project))
;;;###autoload
(defun doom-modeline-set-pdf-modeline ()
"Set pdf mode-line."
(doom-modeline-set-modeline 'pdf))
2018-12-28 10:13:42 +00:00
;;
;; Mode
;;
(defvar doom-modeline--default-mode-line mode-line-format)
(unless (featurep 'mu4e-alert)
(defvar mu4e-alert-modeline-formatter #'ignore))
(defvar doom-modeline--mu4e-alert-modeline-formatter mu4e-alert-modeline-formatter)
;;;###autoload
(define-minor-mode doom-modeline-mode
"Toggle doom-modeline on or off."
:group 'doom-modeline
:global t
:lighter nil
(if doom-modeline-mode
(progn
(doom-modeline-refresh-bars) ; create bars
2019-01-27 10:30:25 +00:00
(doom-modeline-set-main-modeline t) ; set default mode-line
(unless after-init-time
;; These buffers are already created and don't get modelines. For the love
;; of Emacs, someone give the man a modeline!
(dolist (bname '("*scratch*" "*Messages*"))
(with-current-buffer bname
(doom-modeline-set-main-modeline))))
;; Set mu4e alert modeline
(if doom-modeline-mu4e (setq mu4e-alert-modeline-formatter #'identity))
;; Add hooks
(add-hook 'dashboard-mode-hook #'doom-modeline-set-project-modeline)
(add-hook 'image-mode-hook #'doom-modeline-set-media-modeline)
(add-hook 'circe-mode-hook #'doom-modeline-set-special-modeline)
(add-hook 'pdf-tools-enabled-hook #'doom-modeline-set-pdf-modeline))
(progn
;; Restore mode-line
(setq-default mode-line-format doom-modeline--default-mode-line)
(setq mu4e-alert-modeline-formatter doom-modeline--mu4e-alert-modeline-formatter)
;; Remove hooks
(remove-hook 'dashboard-mode-hook #'doom-modeline-set-project-modeline)
(remove-hook 'image-mode-hook #'doom-modeline-set-media-modeline)
(remove-hook 'circe-mode-hook #'doom-modeline-set-special-modeline)
(remove-hook 'pdf-tools-enabled-hook #'doom-modeline-set-pdf-modeline))))
2018-06-11 17:13:02 +00:00
(provide 'doom-modeline)
;;; doom-modeline.el ends here