From 466a0292c900e318f336f0777734790fe668cd53 Mon Sep 17 00:00:00 2001 From: Alynx Zhou Date: Wed, 28 Dec 2022 17:02:43 +0800 Subject: [PATCH] Add indentation information segment --- mood-line.el | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/mood-line.el b/mood-line.el index 9e87342..b30d062 100644 --- a/mood-line.el +++ b/mood-line.el @@ -169,6 +169,123 @@ ;; Variable definitions ;; ---------------------------------- ;; +(defcustom mood-line-show-indentation-information nil + "When non-nil, show the indentation information of the current buffer." + :group 'mood-line + :type 'boolean) + +;; Based on `editorconfig-indentation-alist' and `doom-modeline-indent-alist'. +;; See . +;; See . +(defcustom mood-line-indent-alist + '((apache-mode apache-indent-level) + (awk-mode c-basic-offset) + (bpftrace-mode c-basic-offset) + (c++-mode c-basic-offset) + (c-mode c-basic-offset) + (cmake-mode cmake-tab-width) + (coffee-mode coffee-tab-width) + (cperl-mode cperl-indent-level) + (crystal-mode crystal-indent-level) + (csharp-mode c-basic-offset) + (css-mode css-indent-offset) + (d-mode c-basic-offset) + (emacs-lisp-mode lisp-indent-offset) + (enh-ruby-mode enh-ruby-indent-level) + (erlang-mode erlang-indent-level) + (ess-mode ess-indent-offset) + (f90-mode f90-associate-indent + f90-continuation-indent + f90-critical-indent + f90-do-indent + f90-if-indent + f90-program-indent + f90-type-indent) + (feature-mode feature-indent-offset + feature-indent-level) + (fsharp-mode fsharp-continuation-offset + fsharp-indent-level + fsharp-indent-offset) + (groovy-mode groovy-indent-offset) + (haskell-mode haskell-indent-spaces + haskell-indent-offset + haskell-indentation-layout-offset + haskell-indentation-left-offset + haskell-indentation-starter-offset + haskell-indentation-where-post-offset + haskell-indentation-where-pre-offset + shm-indent-spaces) + (haxor-mode haxor-tab-width) + (idl-mode c-basic-offset) + (jade-mode jade-tab-width) + (java-mode c-basic-offset) + (js-mode js-indent-level) + (js-jsx-mode js-indent-level sgml-basic-offset) + (js2-mode js2-basic-offset) + (js2-jsx-mode js2-basic-offset sgml-basic-offset) + (js3-mode js3-indent-level) + (json-mode js-indent-level) + (json-ts-mode json-ts-mode-indent-offset) + (julia-mode julia-indent-offset) + (kotlin-mode kotlin-tab-width) + (latex-mode tex-indent-basic) + (lisp-mode lisp-indent-offset) + (livescript-mode livescript-tab-width) + (lua-mode lua-indent-level) + (matlab-mode matlab-indent-level) + (meson-mode meson-indent-basic) + (mips-mode mips-tab-width) + (mustache-mode mustache-basic-offset) + (nasm-mode nasm-basic-offset) + (nginx-mode nginx-indent-level) + (nxml-mode nxml-child-indent) + (objc-mode c-basic-offset) + (octave-mode octave-block-offset) + (perl-mode perl-indent-level) + (php-mode c-basic-offset) + (pike-mode c-basic-offset) + (ps-mode ps-mode-tab) + (pug-mode pug-tab-width) + (puppet-mode puppet-indent-level) + (python-mode python-indent-offset) + (rjsx-mode js-indent-level sgml-basic-offset) + (ruby-mode ruby-indent-level) + (rust-mode rust-indent-offset) + (rustic-mode rustic-indent-offset) + (scala-mode scala-indent:step) + (scss-mode css-indent-offset) + (sgml-mode sgml-basic-offset) + (sh-mode sh-basic-offset sh-indentation) + (slim-mode slim-indent-offset) + (sml-mode sml-indent-level) + (tcl-mode tcl-indent-level + tcl-continued-indent-level) + (terra-mode terra-indent-level) + (typescript-mode typescript-indent-level) + (typescript-ts-base-mode typescript-ts-mode-indent-offset) + (verilog-mode verilog-indent-level + verilog-indent-level-behavioral + verilog-indent-level-declaration + verilog-indent-level-module + verilog-cexp-indent + verilog-case-indent) + (web-mode web-mode-attr-indent-offset + web-mode-attr-value-indent-offset + web-mode-code-indent-offset + web-mode-css-indent-offset + web-mode-markup-indent-offset + web-mode-sql-indent-offset + web-mode-block-padding + web-mode-script-padding + web-mode-style-padding) + (yaml-mode yaml-indent-offset)) + "Indentation retrieving variables matched to major modes. +Which is used when `mood-line-show-indentation-information' is non-nil. +When multiple variables are specified for a mode, they will be tried resolved +in the given order." + :group 'mood-line + :type '(alist :key-type symbol :value-type sexp)) + (defcustom mood-line-show-eol-style nil "When non-nil, show the EOL style of the current buffer." :group 'mood-line @@ -736,6 +853,30 @@ Checkers checked, in order: `flycheck', `flymake'." (propertize " %p%% " 'face 'mood-line-unimportant))) +;; ---------------------------------- ;; +;; Indentation segment +;; ---------------------------------- ;; + +(defun mood-line-segment-indent () + "Display the indentation information of the current buffer." + (when mood-line-show-indentation-information + (format "%s %s %d " + (if indent-tabs-mode "TAB" "SPC") + (let ((lookup-var + (seq-find (lambda (var) (and var (boundp var))) + (cdr (assoc major-mode mood-line-indent-alist)) + nil))) + ;; If we don't know the indent offset variable of this major mode, + ;; display a "-". + (if lookup-var + ;; Some major modes, for example lisp-mode, works better when + ;; lisp-indent-offset is nil, we use "-" for nil, too. + (if (not (null (symbol-value lookup-var))) + (format "%d" (symbol-value lookup-var)) + "-") + "-")) + tab-width))) + ;; ---------------------------------- ;; ;; EOL segment ;; ---------------------------------- ;; @@ -858,7 +999,8 @@ Checkers checked, in order: `flycheck', `flymake'." ;; Right (format-mode-line - '((:eval (mood-line-segment-eol)) + '((:eval (mood-line-segment-indent)) + (:eval (mood-line-segment-eol)) (:eval (mood-line-segment-encoding)) (:eval (mood-line-segment-vc)) (:eval (mood-line-segment-major-mode))