What a great question! Here is the path I've taken:
Step 0: Read the Emacs Tutorial
Read the Emacs Tutorial before anything else. It sounds like you've done this. Good on ya! However, for anyone coming to this at a later time, this is the place to start your Emacs journey. There are a lot of misleading blog posts out there. They over complicate things. Emacs makes it easy:
- Start Emacs
You can also access it via
Ctrl + h
C-h t in Emacs notation.
The tutorial introduces the basic concepts of Emacs, clarifies historical terminology, and gets you going in under 30 minutes. It also sets the stage for the next step.
Step 1: Read "An Introduction to Programming in Emacs Lisp"
The next step is to read An Introduction to Programming in Emacs Lisp. I cannot recommend this book enough; it's so well written! It comes with most Emacs installs1. Simply press
C-h i and select it from the menu. You could also go to it directly via
C-h i m Emacs Lisp Intro.
The Preface states,
This text is written as an elementary introduction for people who are
It should say "for people who are not Lisp programmers." Lisp is a little different from other languages, so it's worth reading if you're unfamiliar with Lisp. The author has an approachable style and walks through many examples. It took me about a week to work through.
Step 1.5: Emacs Lisp Development Tips with John Wiegley
As of late 2015, John is the maintainer of the Emacs project. Sacha Chua does a great interview with him here in which John goes over the basics of Emacs Lisp, the development environment, and provides lots of great advice.
Step 2: Read OPC (Other People's Code)
2a. Read the source code
Because Emacs is "the extensible, customizable, self-documenting, real-time display editor", all the source code is included. Learn to use the help features,
C-h f for a function and
C-h v for a variable. There is always a link to the source code:
2b. Read all the
A lot of people track their
init.el files in Git or Mercurial. Seek them out. One trick is to click on people's profile on StackOverflow, especially emacs.stackexchange.com:
They often have links to their GitHub or personal website:
dotfiles are quite common. Over time you'll get a sense of what good code looks like and what bad code looks like. You'll also learn the big names, like those of Xah, Sasha Chua, binchen, Magnar Sveen, abo-abo, and many more. There are so many people to learn from!
Also here is a list for some good Emacs configs.
Step 3: Hack on Emacs
Challenge yourself to write the functionality you want. Never copy code blindly; always take the time to understand it. If you don't understand it, don't use it! When you take the time to understand a piece of code, aside from learning something new, you often think of ways to improve it for your particular use case. This is an opportunity to hack! After all, that's what your
init.el is for! Make mistakes, break things, learn to debug. You'll find that because Emacs is written in Elisp, development is a delight.
Step 4: Ask questions on emacs.stackexchange.com
I've found that the Emacs community on StackExchange loves a good Elisp question. So, hack with confidence that other people will appreciate your efforts to learn.
Step 5: Answer questions on emacs.stackexchange.com
Nothing clarifies your understanding like trying to explain something. Trawling through the main page, you'll also find answers to questions you never knew you had.
Over time you'll find yourself able to generate solutions faster and to answer other people's questions. Like all programming, it can be frustrating. However, remember to judge yourself today against yourself yesterday. Some people have been hacking on Emacs for, literally, 30 years! Most of the time, though, you'll find that Emacs is a pleasure to work with and the freedom it gives you is inspiring.
Happy hacking! :)
PS: Check out the package evil.
1 Some installs don't come with it. Debian users, for instance, must install it separately. It's kind of silly, but it's stored in the non-free repos. Add a non-free repo to
/etc/apt/sources.list by appending
non-free to the end of each entry:
deb http://http.us.debian.org/debian stable main contrib non-free