diff --git a/mood-line-segment-indentation.el b/mood-line-segment-indentation.el new file mode 100644 index 0000000..fbfd445 --- /dev/null +++ b/mood-line-segment-indentation.el @@ -0,0 +1,192 @@ +;;; mood-line-segment-indentation.el --- An indentation info segment for mood-line -*- lexical-binding: t; -*- +;; +;; Author: Alynx Zhou +;; Jessie Hildebrandt +;; Homepage: https://gitlab.com/jessieh/mood-line + +;; This file is not part of GNU Emacs. + +;;; Commentary: +;; + +;;; License: +;; +;; 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. + +;;; Code: + +;; -------------------------------------------------------------------------- ;; +;; +;; Custom definitions +;; +;; -------------------------------------------------------------------------- ;; + +;; ---------------------------------- ;; +;; Variable definitions +;; ---------------------------------- ;; + +;; Assembled from `editorconfig-indentation-alist' and `doom-modeline-indent-alist': +;; https://github.com/editorconfig/editorconfig-emacs/blob/b8043702f3d977db0e030c6c64ee4a810cad5f45/editorconfig.el#L175 +;; https://github.com/seagle0128/doom-modeline/blob/fe9ee5a2a950f9ded10261a05a12adc577ae9e36/doom-modeline-core.el#L284 +(defcustom mood-line-segment-indentation-mode-offset-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)) + "Alist mapping major mode names to their respective indent offset variables. + +When multiple variables are specified for a given mode, the offset value will +be retrieved from the first variable that resolves to a value (evaluated in the +order provided)." + :group 'mood-line + :type '(alist :key-type symbol :value-type sexp)) + +;; -------------------------------------------------------------------------- ;; +;; +;; Indentation style info segment +;; +;; -------------------------------------------------------------------------- ;; + +;; ---------------------------------- ;; +;; Segment function +;; ---------------------------------- ;; + +(defun mood-line-segment-indentation--segment () + "Display the indentation style of the current buffer." + (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-segment-indentation-mode-offset-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)) + +;; -------------------------------------------------------------------------- ;; +;; +;; Provide package +;; +;; -------------------------------------------------------------------------- ;; + +(provide 'mood-line-segment-indentation) + +;;; mood-line-segment-indentation.el ends here diff --git a/mood-line.el b/mood-line.el index b30d062..f2db691 100644 --- a/mood-line.el +++ b/mood-line.el @@ -71,6 +71,8 @@ (declare-function flymake-running-backends "flymake" ()) (declare-function flymake-reporting-backends "flymake" ()) +(declare-function mood-line-segment-indentation--segment "mood-line-segment-indentation" ()) + (declare-function mc/num-cursors "multiple-cursors" ()) (declare-function string-blank-p "subr-x" (string)) @@ -169,123 +171,11 @@ ;; Variable definitions ;; ---------------------------------- ;; -(defcustom mood-line-show-indentation-information nil - "When non-nil, show the indentation information of the current buffer." +(defcustom mood-line-show-indentation-style nil + "When non-nil, show the indentation style 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 @@ -528,6 +418,22 @@ Modal modes checked, in order: `evil-mode', `meow-mode', `god-mode'." ((featurep 'god-mode) (mood-line-segment-modal-god)))) +;; -------------------------------------------------------------------------- ;; +;; +;; Optional segments +;; +;; -------------------------------------------------------------------------- ;; + +;; ---------------------------------- ;; +;; Indentation style +;; ---------------------------------- ;; + +(defun mood-line-segment-indentation () + "Display the indentation style of the current buffer (if enabled)." + (when mood-line-show-indentation-style + (require 'mood-line-segment-indentation) + (mood-line-segment-indentation--segment))) + ;; -------------------------------------------------------------------------- ;; ;; ;; Anzu segment @@ -853,30 +759,6 @@ 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 ;; ---------------------------------- ;; @@ -999,7 +881,7 @@ Checkers checked, in order: `flycheck', `flymake'." ;; Right (format-mode-line - '((:eval (mood-line-segment-indent)) + '((:eval (mood-line-segment-indentation)) (:eval (mood-line-segment-eol)) (:eval (mood-line-segment-encoding)) (:eval (mood-line-segment-vc))