[Feature] A perspective name segment for persp-mode.

This commit is contained in:
Vincent Zhang 2018-12-05 02:38:36 +08:00
parent e466611f68
commit e43da4a963
2 changed files with 61 additions and 13 deletions

View file

@ -23,6 +23,7 @@ The `doom-modeline` was designed for minimalism and fast, and offers:
- A customizable mode-line height (see `doom-modeline-height`) - A customizable mode-line height (see `doom-modeline-height`)
- An error/warning count segment for `flycheck` - An error/warning count segment for `flycheck`
- A workspace number segment for `eyebrowse` - A workspace number segment for `eyebrowse`
- A perspective name segment for `persp-mode`
- A window number segment for `ace-window`, `winum` and `window-numbering` - A window number segment for `ace-window`, `winum` and `window-numbering`
- An indicator for `evil` state - An indicator for `evil` state
- An indicator for `god` state - An indicator for `god` state
@ -99,7 +100,6 @@ Strongly recommend to use
(setq doom-modeline-major-mode-icon t) (setq doom-modeline-major-mode-icon t)
``` ```
## FAQ ## FAQ
1. I am experiencing the laggy issue on Windows, how to resolve it? 1. I am experiencing the laggy issue on Windows, how to resolve it?

View file

@ -41,6 +41,7 @@
;; - A customizable mode-line height (see doom-modeline-height) ;; - A customizable mode-line height (see doom-modeline-height)
;; - An error/warning count segment for flycheck ;; - An error/warning count segment for flycheck
;; - A workspace number segment for eyebrowse ;; - A workspace number segment for eyebrowse
;; - A perspective name segment for persp-mode
;; - A window number segment for winum and window-numbering ;; - A window number segment for winum and window-numbering
;; - An indicator for evil state ;; - An indicator for evil state
;; - An indicator for god state ;; - An indicator for god state
@ -147,6 +148,7 @@ It returns a file name which can be used directly as argument of
(defvar flycheck-current-errors) (defvar flycheck-current-errors)
(defvar iedit-mode) (defvar iedit-mode)
(defvar iedit-occurrences-overlays) (defvar iedit-occurrences-overlays)
(defvar persp-nil-name)
(defvar projectile-dynamic-mode-line) (defvar projectile-dynamic-mode-line)
(defvar text-scale-mode-amount) (defvar text-scale-mode-amount)
(defvar winum-auto-setup-mode-line) (defvar winum-auto-setup-mode-line)
@ -178,6 +180,9 @@ It returns a file name which can be used directly as argument of
(declare-function iedit-prev-occurrence 'iedit-lib) (declare-function iedit-prev-occurrence 'iedit-lib)
(declare-function image-get-display-property 'image-mode) (declare-function image-get-display-property 'image-mode)
(declare-function magit-toplevel 'magit-git) (declare-function magit-toplevel 'magit-git)
(declare-function safe-persp-name 'persp-mode)
(declare-function get-current-persp 'persp-mode)
(declare-function persp-contain-buffer-p 'persp-mode)
(declare-function project-current 'project) (declare-function project-current 'project)
(declare-function project-roots 'project) (declare-function project-roots 'project)
(declare-function projectile-project-root 'projectile) (declare-function projectile-project-root 'projectile)
@ -259,22 +264,28 @@ active.")
(defface doom-modeline-evil-emacs-state '((t (:inherit doom-modeline-warning))) (defface doom-modeline-evil-emacs-state '((t (:inherit doom-modeline-warning)))
"Face for the Emacs state tag in evil state indicator.") "Face for the Emacs state tag in evil state indicator.")
(defface doom-modeline-evil-insert-state'((t (:inherit doom-modeline-urgent))) (defface doom-modeline-evil-insert-state '((t (:inherit doom-modeline-urgent)))
"Face for the insert state tag in evil state indicator.") "Face for the insert state tag in evil state indicator.")
(defface doom-modeline-evil-motion-state'((t :inherit doom-modeline-buffer-path)) (defface doom-modeline-evil-motion-state '((t :inherit doom-modeline-buffer-path))
"Face for the motion state tag in evil state indicator.") "Face for the motion state tag in evil state indicator.")
(defface doom-modeline-evil-normal-state'((t (:inherit doom-modeline-info))) (defface doom-modeline-evil-normal-state '((t (:inherit doom-modeline-info)))
"Face for the normal state tag in evil state indicator.") "Face for the normal state tag in evil state indicator.")
(defface doom-modeline-evil-operator-state'((t (:inherit doom-modeline-buffer-path))) (defface doom-modeline-evil-operator-state '((t (:inherit doom-modeline-buffer-path)))
"Face for the operator state tag in evil state indicator.") "Face for the operator state tag in evil state indicator.")
(defface doom-modeline-evil-visual-state'((t (:inherit doom-modeline-buffer-file))) (defface doom-modeline-evil-visual-state '((t (:inherit doom-modeline-buffer-file)))
"Face for the visual state tag in evil state indicator.") "Face for the visual state tag in evil state indicator.")
(defface doom-modeline-evil-replace-state'((t (:inherit doom-modeline-buffer-modified))) (defface doom-modeline-evil-replace-state '((t (:inherit doom-modeline-buffer-modified)))
"Face for the replace state tag in evil state indicator.")
(defface doom-modeline-persp-name '((t (:inherit font-lock-comment-face :italic t)))
"Face for the replace state tag in evil state indicator.")
(defface doom-modeline-persp-buffer-not-in-persp '((t (:inherit doom-modeline-persp-name :bold t)))
"Face for the replace state tag in evil state indicator.") "Face for the replace state tag in evil state indicator.")
@ -574,8 +585,8 @@ If DEFAULT is non-nil, set the default mode-line for all buffers."
'doom-modeline-buffer-file)))) 'doom-modeline-buffer-file))))
(when face `(:inherit ,face)))))) (when face `(:inherit ,face))))))
'help-echo (concat buffer-file-truename 'help-echo (concat buffer-file-truename
(unless (string-equal (buffer-name) (unless (string= (file-name-nondirectory buffer-file-truename)
(file-name-nondirectory buffer-file-truename)) (buffer-name))
(concat "\n" (buffer-name))))))) (concat "\n" (buffer-name)))))))
(defun doom-modeline--buffer-file-name-truncate (file-path true-file-path &optional truncate-tail) (defun doom-modeline--buffer-file-name-truncate (file-path true-file-path &optional truncate-tail)
@ -650,7 +661,7 @@ Example:
(propertize (propertize
(if (and truncate-project-root-parent (if (and truncate-project-root-parent
(not (string-empty-p root-path-parent)) (not (string-empty-p root-path-parent))
(not (string-equal root-path-parent "/"))) (not (string= root-path-parent "/")))
(shrink-path--dirs-internal root-path-parent t) (shrink-path--dirs-internal root-path-parent t)
(abbreviate-file-name root-path-parent)) (abbreviate-file-name root-path-parent))
'face sp-props))) 'face sp-props)))
@ -663,7 +674,7 @@ Example:
(when-let (relative-path (file-relative-name (when-let (relative-path (file-relative-name
(or (file-name-directory file-path) "./") (or (file-name-directory file-path) "./")
project-root)) project-root))
(if (string-equal relative-path "./") (if (string= relative-path "./")
"" ""
(if truncate-project-relative-path (if truncate-project-relative-path
(substring (shrink-path--dirs-internal relative-path t) 1) (substring (shrink-path--dirs-internal relative-path t) 1)
@ -1224,6 +1235,43 @@ Requires `eyebrowse-mode' to be enabled."
"")) ""))
;;
;; perspective name
;;
(defvar-local doom-modeline--persp-name nil)
(defun doom-modeline-update-persp-name (&rest _)
"Update perspective name in mode-line."
(setq doom-modeline--persp-name
;; Support `persp-mode', while not support `perspective'
(when (and (bound-and-true-p persp-mode)
(fboundp 'safe-persp-name)
(fboundp 'get-current-persp))
(let ((persp (get-current-persp)))
(propertize
(format " #%s " (safe-persp-name persp))
'face (if (and persp
(not (persp-contain-buffer-p (current-buffer) persp)))
'doom-modeline-persp-buffer-not-in-persp
'doom-modeline-persp-name))))))
(add-hook 'find-file-hook #'doom-modeline-update-persp-name)
(add-hook 'after-revert-hook #'doom-modeline-update-persp-name)
(add-hook 'persp-after-load-state-functions #'doom-modeline-update-persp-name)
(add-hook 'persp-created-functions #'doom-modeline-update-persp-name)
(add-hook 'persp-renamed-functions #'doom-modeline-update-persp-name)
(advice-add #'select-window :after #'doom-modeline-update-persp-name)
(advice-add #'persp-add-buffer :after #'doom-modeline-update-persp-name)
(advice-add #'persp-remove-buffer :after #'doom-modeline-update-persp-name)
(doom-modeline-def-segment persp-name
"The current perspective name."
(if (doom-modeline--active)
doom-modeline--persp-name
""))
;; ;;
;; global ;; global
;; ;;
@ -1231,7 +1279,7 @@ Requires `eyebrowse-mode' to be enabled."
(doom-modeline-def-segment global (doom-modeline-def-segment global
"For the time string and whatever uses global-mode-string." "For the time string and whatever uses global-mode-string."
(if (< 0 (length global-mode-string)) (if (< 0 (length global-mode-string))
'(" " global-mode-string " ") '(" " global-mode-string " ")
"")) ""))
@ -1338,7 +1386,7 @@ See `mode-line-percent-position'.")
(doom-modeline-def-modeline 'main (doom-modeline-def-modeline 'main
'(bar workspace-number window-number evil-state god-state ryo-modal-state matches " " buffer-info remote-host buffer-position " " selection-info) '(bar workspace-number window-number evil-state god-state ryo-modal-state matches " " buffer-info remote-host buffer-position " " selection-info)
'(global input-method buffer-encoding major-mode process vcs flycheck)) '(global persp-name input-method buffer-encoding major-mode process vcs flycheck))
(doom-modeline-def-modeline 'minimal (doom-modeline-def-modeline 'minimal
'(bar matches " " buffer-info) '(bar matches " " buffer-info)