Malabarba / smart-mode-line

A powerful and beautiful mode-line for Emacs.
894 stars 54 forks source link
emacs emacs-lisp emacs-packages

+TITLE: Smart-mode-line [[http://melpa.org/#/smart-mode-line][file:http://melpa.org/packages/smart-mode-line-badge.svg]] [[http://melpa.org/#/smart-mode-line][file:http://stable.melpa.org/packages/smart-mode-line-badge.svg]]

[[https://gratipay.com/Malabarba/][Contribute]]

Smart Mode Line is a sexy mode-line for Emacs. It aims to be easy to read from small to large monitors by using /colors/, a /prefix feature/, and /smart truncation/.

Dark Theme\ [[https://raw.github.com/Malabarba/smart-mode-line/master/screenshot-2013-11-11-dark.png]]

Light Theme\ [[https://raw.github.com/Malabarba/smart-mode-line/master/screenshot-2013-11-11-light.png]]

Atom-one Dark Theme\ [[https://raw.github.com/Malabarba/smart-mode-line/master/screenshot-atom-one-dark.png]]

(Note: to use the Atom-one theme, install the [[https://github.com/daviderestivo/smart-mode-line-atom-one-dark-theme][smart-mode-line-atom-one-dark-theme]] package from MELPA)

Solarized Dark Theme\ [[https://cloud.githubusercontent.com/assets/601365/7131638/34a3b0f8-e247-11e4-8fd5-811365167d22.png]]

Solarized Light Theme\ [[https://cloud.githubusercontent.com/assets/601365/7131637/34946ac6-e247-11e4-8e0e-35a47df70686.png]]

(Note: to use the Solarized themes, install the [[https://github.com/bbatsov/solarized-emacs/][solarized-theme]] package from MELPA)

Powerline Theme\ [[https://raw.github.com/Malabarba/smart-mode-line/master/screenshot-powerline-theme.png]]

Light Powerline Theme\ [[https://raw.github.com/Malabarba/smart-mode-line/master/screenshot-light-powerline-theme.png]]

(Note: to use either powerline theme, install the =smart-mode-line-powerline-theme= package from MELPA)

smart-mode-line is available on Melpa, and that's the recommended way of installing it. If you do that, you can simply activate it with:

+BEGIN_SRC emacs-lisp

(sml/setup)

+END_SRC

By default, =sml= will try to figure out the best sml theme to go with your Emacs theme. But if you want to chose the theme yourself, do one of the following BEFORE =sml/setup=:

+BEGIN_SRC emacs-lisp

(setq sml/theme 'dark)
(setq sml/theme 'light)
(setq sml/theme 'respectful)

+END_SRC

**** Installation Issues (FAQ)

Its main features include:

All variables can be edited by running =sml/customize=, and the documentations are mostly self explanatory, I list here only the most important ones.

  1. =sml/theme=\ Choose what theme you want to use for the mode-line colors. For now there are 3 different themes: =dark=, =light=, and =respectful=.

  2. =sml/shorten-directory= and =sml/shorten-modes=\ Setting both of these to =t= guarantees a fixed width mode-line (directory name and minor-modes list will be truncated to fit). To actually define the width, see below.

  3. =sml/name-width= and =sml/mode-width=\ Customize these according to the width of your emacs frame. I set them to =40= and =full= respectively, and the mode-line fits perfectly when the frame is split in two even on my laptop's small 17" monitor. =full= means everything after the minor-modes will be right-indented.

  4. =sml/replacer-regexp-list=\ This variable is a list of (REGEXP REPLACEMENT) that is used to parse the path. The replacements are applied sequentially. This allows you to greatly abbreviate the path that's shown in the mode-line. If this abbreviation is of the form =:SOMETHING:=, it is considered a prefix and get's a different color (you can change what's considered a prefix by customizing =sml/prefix-regexp=). For example, if you do a lot of work on a folder called =~/Dropbox/Projects/In-Development/= almost half the mode-line would be occupied just by the folder name, which is much less important than the buffer name. But, you can't just hide the folder name, since editting a file in =~/Dropbox/Projects/In-Development/Source= is VERY different from editting a file in =~/Dropbox/Projects/Source=. By setting up a prefix for your commonly used folders, you get all that information without wasting all that space. In this example you could set the replacement to =:ProjDev:= or just =:InDev:=, so the path shown in the mode-line will be =:ProjDev:Source/= (saves a lot of space without hiding information).

Some abbreviations are defined out of the box, for instance /(see the documentation for a complete list)/:

+BEGIN_SRC emacs-lisp

("^~/\\.emacs\\.d/" ":ED:")
("^/sudo:.*:" ":SU:")
("^~/Documents/" ":Doc:")
("^~/Dropbox/" ":DB:")

+END_SRC

You can stack abbreviations sequentially, by adding them in order:

+BEGIN_SRC emacs-lisp

(add-to-list 'sml/replacer-regexp-list '("^~/Git-Projects/" ":Git:") t)
(add-to-list 'sml/replacer-regexp-list '("^:Git:\(.*\)/src/main/java/" ":G/\1/SMJ:") t)

+END_SRC

Note the =t= option ensures that your customizations are added to the end of the list, which ensures that the second one is applied after the first.

However, if you want to override one of the pre-defined abbreviations with your own definition you need to add it to the start of the list (note the omitted =t=):

+BEGIN_SRC emacs-lisp

(add-to-list 'sml/replacer-regexp-list '("^~/Dropbox/" ":DBox:"))

+END_SRC

In order to use more complex transformations (like upcasing), you'll need to write a more complex replacement. The second argument needs to be a function that accepts the matched string as its argument and returns the replacement string. You can access matched data with the =match-string= function as explained [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Simple-Match-Data.html#Simple-Match-Data][in the manual.]] For example, for using the upcased project name (assuming the project is in the =~/Projects= directory:

+BEGIN_SRC emacs-lisp

(add-to-list 'sml/replacer-regexp-list '("^~/Projects/\(\w+\)/" (lambda (s) (concat ":" (upcase (match-string 1 s)) ":"))) t)

+END_SRC

[[https://gratipay.com/Malabarba][file:https://cdn.rawgit.com/gratipay/gratipay-badge/2.1.3/dist/gratipay.png]]