From WikEmacs
Revision as of 10:53, 16 May 2014 by (Talk)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Evil is an extensible vi layer for Emacs. It provides Vim features like Visual selection and text objects, and is the successor to the now defunct vimpulse and vim-mode.


Evil comes prebuilt in emacs24. In Emacs23, Evil can be downloaded and installed using el-get with: M-x el-get-install RET evil RET.

Manual install[edit]

Alternatively, Evil lives in a Git repository. To download Evil, do:

git clone git://gitorious.org/evil/evil.git

If you don't have Git, just head over to Gitorious and click the "Download master as tar.gz" link (extract with tar -xzf master.tar.gz).

If you installed it manually, move Evil to ~/.emacs.d/evil (or somewhere else in your load-path). In any case, add the following lines to ~/.emacs:

(add-to-list 'load-path "~/.emacs.d/evil") ;;no need with 24
(require 'evil)
(evil-mode 1)

Evil requires UndoTree in the load-path for linear undo and undo branches. Otherwise, Evil uses regular Emacs undo.


A brief PDF manual is available in the /doc subdirectory.


For those not familiar with vim, here's a quick summary of useful commands.

Tip:: to see a full list of commands available in the current mode, install help-fns+ with ELPA, require it (see its doc). Now you can type C-h M-k.

To enter insert state: try out i a o and the upper-case ones;

To delete chars, words and lines use x, the usual d followed by a word or a movement ($ is end of line, ^ the beginning), dd and D, or replace an object with c ;

Copy and paste: y Y p P ;

To navigate around the buffer, in normal mode, use e E w W b B t T f F ( ) { } and j k h l - + <RET> <backspace> <space>; Go to beginning and end of buffer with gg and G;

Cycle between cursor position: double backquotes, C-i and C-o;

To navigate around the screen, use H L M to go to the Highest/Lowest/Middle line of the screen;

Search forward and backward with / and ?, use n and N to go to the next and previous occurence;

Go to the next or previous occurence of token under point with * or # ;

Select a region with v or V and re-select the last region selected with gv ;

Go to the definition of the symbol under point with gd ;

Indent the line or region with < and > ;

Some more:

Join lines with J

Set a mark with m<char>, go to a mark with backquote + <char>

Code folding with za (toggle), zc (close), zm and zr (close and open all)

Move the current line at the center, bottom and top of screen: zz, zb and zt (C-l with emacs)


One thing I would recommend to any ex vimmer is to make escape to quit actually pretty much anything (like pending prompts in the minibuffer):

   ;;; esc quits
   (define-key evil-normal-state-map [escape] 'keyboard-quit)
   (define-key evil-visual-state-map [escape] 'keyboard-quit)
   (define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
   (define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
   (define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
   (define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
   (define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)

The following makes you lose vim commands, but gives you back basic emacs commands, like C-y to paste in insert mode or C-r to search backward:

   (define-key evil-normal-state-map "\C-y" 'yank)
   (define-key evil-insert-state-map "\C-y" 'yank)
   (define-key evil-visual-state-map "\C-y" 'yank)
   (define-key evil-insert-state-map "\C-e" 'end-of-line)
   (define-key evil-normal-state-map "\C-w" 'evil-delete)
   (define-key evil-insert-state-map "\C-w" 'evil-delete)
   (define-key evil-insert-state-map "\C-r" 'search-backward)
   (define-key evil-visual-state-map "\C-w" 'evil-delete)

Use fine grain undo[edit]

In insert mode, Evil uses linear undo. If you want fine grain undo:

   (setq evil-want-fine-undo t)

but remember, we shouldn't stay long in insert mode.

Use keychords to go back to normal mode[edit]

If you'd like to type jj or jk in insert mode to go back to normal mode, you may use key-chord:

   (key-chord-define evil-insert-state-map "jj" 'evil-normal-state)

Load config only when we call evil-mode[edit]

I still load evil with M-x, I didn't set (evil-mode 1), so in order to tweak keybindings I had to enclose them in a hook, so that my config is called when evil is called and not at startup:

   (add-hook 'evil-after-load-hook
         (lambda ()
         ;; config


There are some hooks that allow to do things when we enter or exit a mode (see the pdf manual).

For example, to save the buffer when we exit the insert mode:

   (defun my-save-if-bufferfilename ()
     (if (buffer-file-name)
       (message "no file is associated to this buffer: do nothing")
   (add-hook 'evil-insert-state-exit-hook 'my-save-if-bufferfilename)

Enter an emacs mode in a given state[edit]

There are some situations where you don't want to be in normal mode by default. For example, it's more useful to be in insert mode when we enter a magit commit buffer, or maybe you prefer to be in emacs mode in a dired buffer.

For that purpose, evil provides the evil-set-initial-state command (see part 2.2 of the pdf documentation) that we can use like that:

(evil-set-initial-state 'git-commit-mode 'insert) ;; enter insert mode to edit a commit message

Here is a handy loop to define more at once:

    (loop for (mode . state) in '((inferior-emacs-lisp-mode . emacs)
                              (nrepl-mode . insert)
                              (pylookup-mode . emacs)
                              (comint-mode . normal)
                              (shell-mode . insert)
                              (git-commit-mode . insert)
                              (git-rebase-mode . emacs)
                              (term-mode . emacs)
                              (help-mode . emacs)
                              (helm-grep-mode . emacs)
                              (grep-mode . emacs)
                              (bc-menu-mode . emacs)
                              (magit-branch-manager-mode . emacs)
                              (rdictcc-buffer-mode . emacs)
                              (dired-mode . emacs)
                              (wdired-mode . normal))
      do (evil-set-initial-state mode state))

See also[edit]



  • ace-jump: Port of Vim's Easy-motion: jump to any character in the buffer with 3 keystrokes.

Bug tracker[edit]

The bugtrucker can be found on Bitbucket.