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.
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 126.96.36.199
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/bin/env bash exec /usr/local/Cellar/emacs/HEAD/Emacs.app/Contents/MacOS/Emacs -nw "$@"
Here is how my Emacs looks like by now:
My modeline is much less developed 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))))
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.