Why I am still using Emacs

2015-08-15

Some months ago I noticed the release of a new text editor which was supposed to bring the best of both world, Emacs and Vim, but see Spacemacs - First Impressions From an Emacs Driven Developer for a recent review.

Spacemacs

I tried Spacemacs yesterday and I must say this should be great for people used to Vim modal approach to interacting with buffer and text. However, I feel like it is too much for Emacs users (even with the Holy mode), and I stand on my custom settings. These are certainly not the best ones, but this configuration suits my needs and that's all that matters after all! I should probably update my configuration with the use-package macro, which allows lazy loading of packages among (so many) other things, but I do not have much time at the moment. This is indeed another great advantage of Spacemacs: it is super fast!

I must admit that the Spacemacs UI is really well designed, especially the modeline, and the concept of general and private layers. The core packages are available in spacemacs/package.el; as can be seen, the authors choose some of the best packages around the ones available on MELPA. Regarding Spacemacs modeline, I found a lot of discussion on the internet (e.g., on reddit) because people seem to enjoy a lot its look-and-feel. I even found one implementation of Spacemacs modeline, although it is likely that a dedicated package will be release by the Spacemacs team in the near future.

Since I am not a Vim user, I cannot tell whether Spacemacs can lead Vim users to switch to Emacs, or pure Emacs addicts to adopt Spacemacs. I for one find difficult to work with an already customized text editor: I need to do it myself, in order to understand how everything works or what I may be missing. Anyway, having played with Spacemacs for 3-4 hours I thought it would be good to update my own Emacs.

Why am I still using Emacs? Well, I guess this is always the same story...

I decided to use company and get ride of auto-complete. I am aware of the pros and cons but I wanted to give it a try really. I also decided to use Helm in addition to ido. It can be used together with company, dash (be sure to use the built-in eww browser instead of default OS application) and projectile. I also added neotree (with ascii theme) and anzu. I enabled flycheck globally and added R support via lintr (in fact, this is managed by ESS directly, so we just need to install the R package). I customized the flycheck modeline by following Sebastian Wiesner's example. I also found a pretty low-contrast theme: apropospriate.

Finally, I upgrade Emacs to the latest development version (this was required to get projectile to work anyway, see this issue).

% brew install emacs --HEAD --use-git-head --with-cocoa --srgb
% emacs --version
GNU Emacs 25.0.50.1


I noticed that Homebrew now provides a direct link for running emacs in a Terminal (/usr/local/Cellar/emacs/HEAD/bin), although I am still using this little Bash script (/usr/local/bin/emacs):

#!/bin/bash


Here is how my Emacs looks like by now: (Click to enlarge)

My modeline is much less developped but I am happy with it. Here is what I have in some of my configuration files:

(require 'powerline)
(powerline-vim-theme)
(global-anzu-mode +1)

(require 'inbox)
(display-inbox-mode)

(require 'window-numbering)
(window-numbering-mode)

(require 'delight)
(delight '((company-mode " Ⓐ" company)
(hs-minor-mode " ⓗ" hideshow)
(outline-minor-mode " Ⓞ" outline)
(outline-mode " Ⓞ" :major)
(git-gutter-mode " Ⓖ" git-gutter)
(flyspell-mode " Ⓕ" flyspell)
(smartparens-mode " Ⓢ" smartparens)
(elisp-slime-nav-mode nil elisp-slime-nav)
(ess-noweb-font-lock-mode nil ess)
(reftex-mode " Ⓡ" reftex)
(visual-line-mode " Ⓦ" simple)
(ess-noweb-mode " Ⓝ" ess)
(anzu-mode " Ⓩ" anzu)
(abbrev-mode " ⓐ" abbrev)
(helm-mode " Ⓗ" helm)
))

(setq flycheck-mode-line
'(:eval
(pcase flycheck-last-status-change
(not-checked nil)
(no-checker " -")
(running (propertize " ✷" 'face 'success))
(errored (propertize " !" 'face 'error))
(finished
(let* ((error-counts (flycheck-count-errors flycheck-current-errors))
(no-errors (cdr (assq 'error error-counts)))
(no-warnings (cdr (assq 'warning error-counts)))
(face (cond (no-errors 'error)
(no-warnings 'warning)
(t 'success))))
(propertize (format " %s/%s" (or no-errors 0) (or no-warnings 0))
'face face)))
(interrupted " -")
(suspicious '(propertize " ?" 'face 'warning)))))

(setq projectile-mode-line '(:eval (format " :%s:" (projectile-project-name))))


Briefly, powerline let me customize the modeline a bit, while window-numbering allows me to jump to any window with M-x [0-9] where [0-9] is a number assigned to any new window. The inbox.el` file provides a handy minor mode that displays the number of unread messages from mu. I just replaced the default text by a tiny UTF-8 character. Finally, I rely on delight (instead of diminish) to display a light indicator for minor and/or major modes in the modeline. All in one, I have access to the information I need when editing text files, and this basic setup works when Emacs run in a terminal.

Here is how it looks while editing this post in Markdown mode. (Click to enlarge)

Articles with the same tag(s):

Spring quick notes
A bag of tweets / October 2015
El Capitan
A bag of tweets / September 2015
A bag of tweets / August 2015
A bag of tweets / July 2015
A bag of tweets / June 2015
A bag of tweets / May 2015
Leanpub: a new way to publish your textbook
A bag of tweets / April 2015