Table of Contents
I recommend Emacs beginners to enable at least three things in their elisp files (such as dotemacs files, a.k.a. init files) that will reduce surprises later. The three things are
- a Unicode encoding (UTF-8)
- lexical scope (usually known as lexical binding mode)
- CL functions
1. how to enable UTF-8 encoding
In order to be able to use Unicode characters (in strings or comments) in your init file, visit the init file, then invoke the command add-file-local-variable-prop-line
to add the file local variable coding
with utf-8
as its value.
M-x add-file-local-variable-prop-line RET coding RET utf-8 RET
Then save and close the file. You are supposed to use add-file-local-variable-prop-line
and not add-file-local-variable
.
2. how to enable lexical scope
To make code in your init file to be lexically scoped, visit the init file, then invoke the command add-file-local-variable-prop-line
to add the file local variable lexical-binding
with t
as its value.
M-x add-file-local-variable-prop-line RET lexical-binding RET t RET
Then save and close the file. For this too you are supposed to use add-file-local-variable-prop-line
and not add-file-local-variable
.
3. how to use CL functions
To use CL functions/macros (with cl prefix) like cl-loop
, cl-defun
, cl-destructuring-bind
in your init file, you can add this line to your init file:
(require 'cl-lib)
That line should not be your first line. Your init file should not look like this:
(require 'cl-lib) ;; -*- coding: utf-8; lexical-binding: t; -*- ...
It should look like this:
;; -*- coding: utf-8; lexical-binding: t; -*- (require 'cl-lib) ...
Some articles share Emacs Lisp snippets that won’t work if you don’t include the following line when you copy them:
(require 'cl)
To spot such code easily and for relations between cl and cl-lib, see highlighting old style CL function names in Emacs Lisp
Pingback: Emacs Lisp lexical binding gotchas and related best practices | Yoo Box
I was wondering why adding a variable by “add-file-local-variable-prop-line” and not by “add-file-local-variable”. Don’t they do the same job except they put the variables in different places? Could you please explain more? Thanks.
Now I am not sure if setting
coding
requires use of...-prop-line
, but settinglexical-binding
does require it –Using Lexical Binding – GNU Emacs Lisp Reference Manual
As to why
lexical-binding
is different from others, it may have to do with the fact that the Lisp reader is supposed to read in code in one pass from top to bottom, but I am not sure.Thanks for your explanation.