Emacs Workflow Optimization

May 26, 2019

Emacs is a text editor that does everything. On one hand I'm not the biggest fan, since it's huge and doesn't really follow the UNIX philosophy. On the other hand, I've optimized my entire workflow around Emacs, and love it too much to quit. Besides, it's nowhere near as heavy & bloated as modern Web browsers or Electron programs!

I want to talk about how I use Emacs daily, and how I optimize Emacs to be faster for me.


Speeding things up with 'emacs --daemon'

The graphical version of Emacs takes a long time to start up (almost a second). Now when my computer boots I have it run the command 'emacs --daemon', and from then on I can run the command 'emacsclient -c' any time. This starts Emacs instantaneously! The Daemon keeps an instance of Emacs running in the background, but since I run Emacs so often, it's nice to be able to start it so fast (it doesn't take up much memory, anyway!)

Since 'emacsclient -c is long to type, I add an alias for it in my .bashrc

alias emacs="emacsclient -c" #Now emacs acts as emacsclient -c!

I also byte-compile my ~/.emacs file with 'M-x byte-compile file RET ~/.emacs', which compiles .emacs into .emacs.elc (elc is short for Emacs-Lisp-Compiled). Emacs automatically uses the compiled file instead of the regular one, which makes the initial startup faster!

Since I use the i3 tiling window manager, I made some keybinding shortcuts for different Emacs functions:

bindsym $mod+t  exec emacsclient -a "" -c
bindsym $mod+F1 exec emacsclient -a "" -e '(ibuffer)'    -c
bindsym $mod+F2 exec emacsclient -a "" -e '(rmail "~/")' -c
bindsym $mod+F3 exec emacsclient -a "" -e '(eshell)'     -c
bindsym $mod+F4 exec emacsclient -a "" -e '(eww "")'     -c

$mod is bound to the Super key (some people call it the "Windows" key), so if I just want to boot up my computer and read my mail, I press 'Super+F2' and it opens my Emacs mail reader!

Since Emacs is always running in the background, if I quit emacs with 'C-x C-c', my buffers will still exist. If I'm working all day and close Emacs, I can press 'Super + F1' to open my buffer list, which will still display all of my open files. Very handy! (If I want to "completely kill" emacs and all the buffers, I run 'M-x kill-emacs')


The same shortcuts, but from within Emacs

Although I use the Programmer Dvorak keyboard layout, I never actually changed my Emacs keybindings. I'd say the default bindings work just as well on both QWERTY & Dvorak keyboards.

I did bind some of my favourite functions to the Fx keys, though. If I currently have an Emacs window open, I don't need to press 'Super+F2' to read my mail, I can just press 'F2' from inside Emacs!

My current bindings look like this in my .emacs file:

(global-set-key (kbd "<f1>") 'ibuffer)
(global-set-key (kbd "<f2>") 'rmail)
(global-set-key (kbd "<f3>") 'eshell)
(global-set-key (kbd "<f4>") 'eww)
(global-set-key [(shift f1)] 'byte-compile-file)
(global-set-key [(shift f2)] 'kill-emacs)
(global-set-key [(shift f3)] 'indent-region)
(global-set-key [(shift f4)] 'fill-region)
(global-set-key ("C-<backspace>") 'whitespace-cleanup)

As you can see, my in-Emacs and out-of-Emacs bindings are similar, F2 and Super+F2 both open rmail to avoid confusing myself. Shift+fx keys are for functions I use often and are handy to have as hotkeys. C-<backspace> gets rid of excess whitespaces at the end of lines (because M-<backspace> is how I delete full words.)


Reading email with rmail

Rmail is the Emacs email reader. A good introduction can be found by running 'info emacs rmail' at the terminal. I'm just going to talk about how I set my mail up (since, admittedly, I had some trouble setting my mail up)

To send mail I use SMTP. To receive email I use IMAP. Emacs works with a program called Movemail to do stuff. The Movemail command that comes bundled with Emacs doesn't support IMAP, so you may have to install the 'mailutils' package on your own package manager.

Here's what my email config looks like in my .emacs:

(setq
  rmail-primary-inbox-list '("imaps://mymail%40example.com:MyPassword@mail.example.com:993")
  rmail-file-name "~/.RMAIL"
  user-mail-address "mymail@example.com")

The 'rmail-primary-inbox-list' variable specifies where my remote mailbox is:

The 'rmail-file-name' variable specifies where to store our mail (the default is "RMAIL", but I like it to be hidden, so I specify ".RMAIL")

user-mail-address specifies what your email address should be printed as when you're sending an email to someone.

After all that it becomes easy to invoke 'M-x rmail', which will collect all my mail from my remote inbox. Very nice!


Web Browsing With eww

Eww is the Emacs Web browser. Eww browses The Good Web ("The Good Web", as I call it, is the Web without JavaScript or CSS)! I use this browser regularly in Emacs to quickly find some information (it works very well with Wiki sites and simple blogs). The Eww documentation says it handles 'basic CSS', but I don't believe it does. Emacs can also be compiled with WebKit to provide a more fully-functional browser, but I personally like the smallness of Eww much more.

Start eww with 'M-x eww' and you'll be prompted to make a websearch (by default, eww uses DuckDuckGo for search results. There are a few handy features of eww that I use regularly:)

Unfortunately, eww does not support gopher:// URLs. For that, I'd suggest Lynx

This blog is text browser compatible, and I encourage you to read it with M-x eww.


Conclusion

I'm going to keep this article short. I won't add sections about dired or gnus, as they're well documented in the Emacs manual. I have a lot of things I want to write about on this website, but everything in my oven is barely half-baked. Maybe I'll read a book on how to write interesting articles.