\input texinfo @c -*-texinfo-*- @setfilename evil.info @documentencoding ISO-8859-1 @include version.texi @settitle Evil-mode manual @include macros.texi @copying This manual is for Evil (version @value{VERSION} of @value{UPDATED}), an extensible vi layer for Emacs. Copyright @copyright{} 2011 @authors{}. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end quotation The Evil team thanks everyone at gmane.emacs.vim-emulation for their feedback and contributions. @end copying @dircategory Emacs @direntry * Evil: (evil). Extensible vi layer for Emacs. @end direntry @titlepage @title Evil @subtitle Extensible vi layer for Emacs @author @authors{} @page @insertcopying @end titlepage @contents @ifnottex @node Top, Overview, (dir), (dir) @top Evil This is the manual for Evil, an extensible vi layer for Emacs. @end ifnottex @menu * Overview:: * Settings:: * Keymaps:: * Hooks:: * Macros:: * Other internals:: * GNU Free Documentation License:: @end menu @node Overview @chapter Overview Evil is an extensible vi layer for Emacs. It emulates the main features of Vim,@footnote{Vim is the most popular version of @dfn{vi}, a modal text editor with many implementations. Vim also adds some functions of its own, like Visual selection and text objects. For more information, see: @uref{http://www.vim.org/}} turning Emacs into a modal editor. Like Emacs in general, Evil is extensible in Emacs Lisp. @menu * Installation:: * Modes and states:: @end menu @node Installation @section Installation Evil lives in a Git repository. To download Evil, do: @example git clone git://gitorious.org/evil/evil.git @end example @noindent Move Evil to @code{~/.emacs.d/evil}. Then add the following lines to @code{~/.emacs}: @lisp (add-to-list 'load-path "~/.emacs.d/evil") (require 'evil) (evil-mode 1) @end lisp @noindent Evil requires @code{undo-tree.el} to provide linear undo and undo branches. It is available from EmacsWiki.@footnote{@uref{http://www.emacswiki.org/emacs/UndoTree}} (A copy of @code{undo-tree.el} is also included in the Git repository.) @node Modes and states @section Modes and states The next time Emacs is started, it will come up in @dfn{Normal state}, denoted by @code{} on the mode line. This is where the main vi bindings are defined. Note that you can always disable Normal state with @kbd{C-z}, which switches to an ``Emacs state'' (denoted by @code{}) in which vi keys are completely disabled. Press @kbd{C-z} again to switch back to Normal state. Evil uses the term @dfn{state} for what is called a ``mode'' in vi, since ``mode'' already has its own meaning in Emacs. Evil defines a number of states, such as Normal state (@code{}), Insert state (@code{}), Visual state (@code{}), Replace state (@code{}), Operator-Pending state (@code{}), Motion state (@code{}) and Emacs state (@code{}). Each state has its own keymaps and customization variables. Meanwhile, a @dfn{mode} in Emacs is a set of key bindings for editing a certain sort of text, like @code{emacs-lisp-mode} for Emacs Lisp. Modes may include custom bindings for Evil states. @node Settings @chapter Settings Evil's behavior can be adjusted by setting various variables. The current values may be inspected by doing @kbd{M-x customize-group RET evil RET}. To change the value of a variable, add a @samp{setq} form to @code{~/.emacs}, preferably before Evil is loaded:@footnote{Strictly speaking, the order only matters if the variable affects the way Evil is loaded. This is the case with some of the @samp{evil-want-} variables.} @lisp (setq evil-shift-width 8) ;; @r{Load Evil} (require 'evil) @r{@dots{}} @end lisp @noindent Note that if a variable is buffer-local, you must use @samp{setq-default} instead of @samp{setq} to change its global value. @defvar evil-auto-indent Whether the current line is indented when entering Insert state. If @code{t} (the default), then the line is indented. If @code{nil}, then the line is not indented. Buffer-local. @end defvar @defvar evil-shift-width The number of columns a line is shifted by the commands @kbd{>} and @kbd{<}. @end defvar @defvar evil-repeat-move-cursor If @code{t} (the default), then repeating a command with @kbd{.} may change the position of the cursor. If @code{nil}, then the original position is preserved. @end defvar @defvar evil-find-skip-newlines If @code{t}, then @kbd{f}, @kbd{F}, @kbd{t} and @kbd{T} may skip over newlines to find a character. If @code{nil} (the default), then they are restricted to the current line. @end defvar @defvar evil-move-cursor-back If @code{t} (the default), then the cursor moves backwards when exiting Insert state. If @code{nil}, then the cursor does not move. @end defvar @defvar evil-want-fine-undo If @code{t}, then a change-based action like @kbd{cw} may be undone in several steps. If @code{nil} (the default), then it is undone in one step. @end defvar @defvar evil-regexp-search If @code{t} (the default), then @kbd{/} and @kbd{?} use regular expressions for searching. If @code{nil}, they use plain text. @end defvar @defvar evil-search-wrap If @code{t} (the default), then @kbd{/} and @kbd{?} wrap the search around the buffer. If @code{nil}, then they stop at buffer boundaries. @end defvar @defvar evil-flash-delay The number of seconds to flash search matches when pressing @kbd{n} and @kbd{N}. @end defvar @defvar evil-want-C-i-jump If @code{t} (the default), then @kbd{C-i} jumps forwards in the jump list. If @code{nil}, then @kbd{C-i} inserts a tab. @end defvar @defvar evil-want-C-u-scroll If @code{t}, then @kbd{C-u} scrolls the buffer. If @code{nil} (the default), then @kbd{C-u} begins a numeric prefix argument. @end defvar @menu * The cursor:: * The initial state:: @end menu @node The cursor @section The cursor A state may change the cursor's appearance. The cursor settings are stored in the variables below, which may contain a cursor type as per the @samp{cursor-type} variable, a color string as passed to the @samp{set-cursor-color} function, a zero-argument function for changing the cursor, or a list of the above. For example, the following changes the cursor in Replace state to a red box: @lisp (setq evil-replace-state-cursor '("red" box)) @end lisp @noindent If the state does not specify a cursor, @samp{evil-default-cursor} is used. @defvar evil-default-cursor The default cursor. @end defvar @defvar evil-normal-state-cursor The cursor for Normal state. @end defvar @defvar evil-insert-state-cursor The cursor for Insert state. @end defvar @defvar evil-visual-state-cursor The cursor for Visual state. @end defvar @defvar evil-replace-state-cursor The cursor for Replace state. @end defvar @defvar evil-operator-state-cursor The cursor for Operator-Pending state. @end defvar @defvar evil-motion-state-cursor The cursor for Motion state. @end defvar @defvar evil-emacs-state-cursor The cursor for Emacs state. @end defvar @node The initial state @section The initial state By default, a new buffer comes up in Normal state. This can be changed with the function @samp{evil-set-initial-state}. @defun evil-set-initial-state mode state Set the initial state for a buffer in which @var{mode} is active to @var{state}. @var{mode} should be a major mode such as @code{text-mode}, although minor modes work as well. @end defun @node Keymaps @chapter Keymaps Evil's key bindings are stored in a number of keymaps. Each state has a @dfn{global keymap}, where the default key bindings for the state are stored. For example, the global keymap for Normal state is @samp{evil-normal-state-map}, and the key bindings in this map are seen in all buffers that are currently in Normal state. Keymaps are modified with the Emacs function @samp{define-key}: @lisp (define-key evil-normal-state-map "w" 'foo) @end lisp @noindent This binds the key @kbd{w} to the command @samp{foo} in Normal state. The file @code{evil-maps.el} contains all the key bindings. @defvar evil-normal-state-map The global keymap for Normal state. @end defvar @defvar evil-insert-state-map The global keymap for Insert state. @end defvar @defvar evil-visual-state-map The global keymap for Visual state. @end defvar @defvar evil-replace-state-map The global keymap for Replace state. @end defvar @defvar evil-operator-state-map The global keymap for Operator-Pending state. @end defvar @defvar evil-motion-state-map The global keymap for Motion state. @end defvar @noindent Each state also has a @dfn{buffer-local keymap}, which is specific to the current buffer and has precedence over the global keymap. These maps may be changed from a mode hook. @defvar evil-normal-state-local-map Buffer-local keymap for Normal state. @end defvar @defvar evil-insert-state-local-map Buffer-local keymap for Insert state. @end defvar @defvar evil-visual-state-local-map Buffer-local keymap for Visual state. @end defvar @defvar evil-replace-state-local-map Buffer-local keymap for Replace state. @end defvar @defvar evil-operator-state-local-map Buffer-local keymap for Operator-Pending state. @end defvar @defvar evil-motion-state-local-map Buffer-local keymap for Motion state. @end defvar @menu * @samp{evil-define-key}:: @end menu @node @samp{evil-define-key} @section @samp{evil-define-key} Finally, Evil provides the function @samp{evil-define-key} for adding state bindings to a regular keymap. @defun evil-define-key state keymap key def In @var{keymap}, create a binding from @var{key} to @var{def} in @var{state}. @var{state} is one of @samp{normal}, @samp{insert}, @samp{visual}, @samp{replace}, @samp{operator} and @samp{motion}. The other parameters are like those of @samp{define-key}. @end defun @noindent @samp{evil-define-key} can be used to augment existing modes with state bindings, as well as create packages for custom bindings. For example, the following will create a minor mode @code{foo-mode} with Normal state bindings for the keys @kbd{w} and @kbd{e}: @lisp (define-minor-mode foo-mode "Foo mode." :keymap (make-sparse-keymap)) (evil-define-key 'normal foo-mode-map "w" 'bar) (evil-define-key 'normal foo-mode-map "e" 'baz) @end lisp @noindent This minor mode can then be enabled in any buffers where the custom bindings are desired: @lisp (add-hook 'text-mode-hook 'foo-mode) ; @r{enable alongside @code{text-mode}} @end lisp @noindent If the minor mode is put into its own file @code{foo.el} with a @code{(provide 'foo)} statement, it becomes an Emacs package. @node Hooks @chapter Hooks A @dfn{hook} is a list of functions to execute. Hooks are modified with the Emacs function @samp{add-hook}. Evil provides entry and exit hooks for all of its states. @defvar evil-normal-state-entry-hook Run when entering Normal state. @end defvar @defvar evil-normal-state-exit-hook Run when exiting Normal state. @end defvar @defvar evil-insert-state-entry-hook Run when entering Insert state. @end defvar @defvar evil-insert-state-exit-hook Run when exiting Insert state. @end defvar @defvar evil-visual-state-entry-hook Run when entering Visual state. @end defvar @defvar evil-visual-state-exit-hook Run when exiting Visual state. @end defvar @defvar evil-replace-state-entry-hook Run when entering Replace state. @end defvar @defvar evil-replace-state-exit-hook Run when exiting Replace state. @end defvar @defvar evil-operator-state-entry-hook Run when entering Operator-Pending state. @end defvar @defvar evil-operator-state-exit-hook Run when exiting Operator-Pending state. @end defvar @defvar evil-motion-state-entry-hook Run when entering Motion state. @end defvar @defvar evil-motion-state-exit-hook Run when exiting Motion state. @end defvar @noindent When these hooks are run, the variables @samp{evil-next-state} and @samp{evil-previous-state} hold information about the states being switched to and from. @defvar evil-next-state The state being switched to. @end defvar @defvar evil-previous-state The state being switched from. @end defvar @node Macros @chapter Macros Evil is implemented in terms of reusable macros. Package writers can use these to define new commands. @menu * Motions:: * Operators:: * Text objects:: * Types:: * States:: @end menu @node Motions @section Motions A @dfn{motion} is a command which moves the cursor, such as @kbd{w} and @kbd{e}. Motions are defined with the macro @samp{evil-define-motion}. Motions not defined in this way should be declared with @samp{evil-declare-motion}. @defun evil-declare-motion command Declare @var{command} to be a motion. This ensures that it works properly in Visual state. @end defun @defmac evil-define-motion motion (count args@dots{}) doc keyword-args@dots{} body@dots{} Define a movement command @var{motion}. A motion can have any number of arguments, but the first argument, if any, has a predefined meaning as the @var{count}. It is a positive or negative number, or @code{nil}. The argument list is followed by the documentation string @var{doc}, which is followed by optional keyword arguments: @table @code @item :type @var{type} The @var{type} determines how the motion works after an operator. If @var{type} is @samp{inclusive}, then the ending position is included in the motion range. If @var{type} is @samp{line}, then the range is expanded to linewise positions. If @var{type} is @samp{block}, then the range is blockwise. The default is @samp{exclusive}, which means that the range is used as-is. @item :jump @var{jump} If @var{jump} is @code{t}, then the previous position is stored in the jump list so it can be restored with @kbd{C-o}. The default is @code{nil}. @end table The keyword arguments are followed by the @var{body}, which is where the motion's behavior is defined. For instance: @lisp (evil-define-motion foo-forward (count) "Move to the right by COUNT characters." :type inclusive (forward-char (or count 1))) @end lisp For more examples, you can view the source code for any command with @kbd{C-h k}. For instance, @samp{evil-goto-line} may be viewed by typing @kbd{C-h k G} and following the file link. @end defmac @node Operators @section Operators An @dfn{operator} is a command which acts on the text moved over by a motion, such as @kbd{c}, @kbd{d} and @kbd{y}. Operators are defined with the macro @samp{evil-define-operator}. @defmac evil-define-operator operator (beg end type args@dots{}) doc keyword-args@dots{} body@dots{} Define an operator command @var{operator}. An operator must have at least two or three arguments, which have predefined meanings. @var{beg} is the beginning position, @var{end} is the ending position, and @var{type}, if given, is the type of the motion range. The argument list is followed by the documentation string @var{doc}, which is followed by optional keyword arguments: @table @code @item :type @var{type} Make the input range be a certain @var{type}. For example, an operator which only works with whole lines may set @var{type} to @samp{line}. @item :motion @var{motion} Use the motion @var{motion} instead of reading one from the keyboard. This does not affect the behavior in Visual state, where the selection boundaries are used instead. @item :repeat @var{repeat} If @var{repeat} is @code{t} (the default), then @kbd{.} will repeat the operator. If @var{repeat} is @code{nil}, then the operator will not be repeated. @item :move-point @var{move-point} If @var{move-point} is @code{t} (the default), then the cursor is positioned at the beginning of the range. If @var{move-point} is @code{nil}, then the original position is preserved. @item :keep-visual @var{keep-visual} If @var{keep-visual} is @code{t}, then the selection is not disabled when the operator is run in Visual state; it is up to the operator to do this. The default is @code{nil}, which means that Visual state is exited automatically. @end table The keyword arguments are followed by the @var{body}, which is where the operator's actions on @var{beg} and @var{end} are defined. For example, @samp{evil-rot13}, which is bound to @kbd{g?} and performs ROT13 encryption on the text, may be defined as: @lisp (evil-define-operator evil-rot13 (beg end) "ROT13 encrypt text." (rot13-region beg end)) @end lisp Pressing @kbd{g?w} will encrypt a word by calling @samp{rot13-region} on the text moved over by the @kbd{w} motion. @end defmac @node Text objects @section Text objects A @dfn{text object} is a special kind of motion which sets a beginning position as well as an ending position, such as @kbd{iw} and @kbd{a(}. In Visual state, text objects alter both ends of the selection. Text objects are defined with the macro @samp{evil-define-text-object}. @defmac evil-define-text-object object (count args@dots{}) doc keyword-args@dots{} body@dots{} Define a text object @var{object}. The first argument has a predefined meaning as the @var{count}: it is a positive or negative number. The argument list is followed by the documentation string @var{doc}, which is followed by optional keyword arguments: @table @code @item :type @var{type} Use the type @var{type} after an operator. In Visual state, this is the type of the selection. @item :extend-selection @var{extend-selection} If @var{extend-selection} is @code{t} (the default), then the text object always enlarges the current selection. If @code{nil}, then the object replaces the selection. @end table The keyword arguments are followed by the @var{body}, which should evaluate to a list @code{(@var{beg} @var{end})} of two positions in the buffer. For example, a text object which selects three characters following the current position could be defined as: @lisp (evil-define-text-object foo (count) "Select three characters." (list (point) (+ (point) 3))) @end lisp @end defmac @noindent Evil provides several functions which return a list of positions, for use in the definition of a text object. These functions follow the rule that a positive @var{count} selects text after the current position, while a negative @var{count} selects text before it. @defun evil-inner-object-range count forward backward Return a text range @code{(@var{beg} @var{end})} of @var{count} ``inner'' text objects (e.g., @kbd{iw}, @kbd{is}). @var{forward} is a function which moves to the end of an object, and @var{backward} is a function which moves to the beginning. @end defun @defun evil-an-object-range count forward backward Return a text range @code{(@var{beg} @var{end})} of @var{count} text objects with whitespace (e.g., @kbd{aw}, @kbd{as}). @var{forward} is a function which moves to the end of an object, and @var{backward} is a function which moves to the beginning. @end defun @defun evil-paren-range count open close &optional exclusive Return a text range @code{(@var{beg} @var{end})} of @var{count} delimited blocks (e.g., @kbd{i(}, @kbd{a(}). @var{open} and @var{close} are characters. If @var{exclusive} is non-nil, then the delimiters are excluded from the range. This function uses Emacs' syntax table and is only applicable for single-character delimiters; use @samp{evil-regexp-range} to match multiple characters. @end defun @defun evil-regexp-range count open close &optional exclusive Return a text range @code{(@var{beg} @var{end})} of @var{count} delimited blocks (e.g., @kbd{it}, @kbd{at}). @var{open} and @var{close} are regular expressions. If @var{exclusive} is non-nil, then the delimiters are excluded from the range. @end defun @node Types @section Types A @dfn{type} is a transformation on a pair of buffer positions. Evil defines the types @samp{exclusive}, @samp{inclusive}, @samp{line} and @samp{block}, which are used for motion ranges and Visual selection. Types are defined with the macro @samp{evil-define-type}. @defmac evil-define-type type doc keyword-args@dots{} Define a type @var{type}, described by the documentation string @var{doc}. Then follows keyword arguments: @table @code @item :expand @var{expand} A function which takes two buffer positions and returns a list @code{(@var{beg} @var{end})} of expanded positions. @item :contract @var{contract} A function which takes two expanded buffer positions and returns a list @code{(@var{beg} @var{end})} of unexpanded positions. Optional. @item :normalize @var{normalize} A function which takes two unexpanded buffer positions and returns a list @code{(@var{beg} @var{end})} of adjusted positions. Optional. @item :injective @var{injective} If @code{t} (the default), then expansion is one-to-one -- i.e., @var{expand} followed by @var{contract} always returns the original positions. If @code{nil}, then several positions may expand to the same (for example, the @samp{line} type is one-to-many as it expands to the containing lines). @end table Further keywords and functions may be specified. These are understood to be transformations on buffer positions, like @var{expand} and @var{contract}. @end defmac @node States @section States States are defined with the macro @samp{evil-define-state}. The macro defines the necessary hooks, keymaps and variables for a state, as well as a toggle function @samp{evil-@var{state}-state} for entering the state, and a predicate function @samp{evil-@var{state}-state-p} which returns @code{t} when the state is active, and @code{nil} otherwise. @defmac evil-define-state state doc keyword-args@dots{} body@dots{} Define an Evil state @var{state}, described by the documentation string @var{doc}. Then follows optional keyword arguments: @table @code @item :tag @var{tag} Mode line indicitor, e.g., @code{""}. @item :message @var{message} String shown in the echo area. @item :cursor @var{cursor} Cursor specification. @item :enable @var{enable} List of other modes and states to enable. A state may enable another state's keymaps in addition to its own. @end table This is followed the @var{body}, which is executed whenever the state is enabled or disabled. The state's predicate function may be used to distinguish between the two. @end defmac @node Other internals @chapter Other internals @menu * Command properties:: @end menu @node Command properties @section Command properties Evil defines @dfn{command properties} to store information about commands, such as whether they should be repeated. A command property is a @code{@var{:keyword}} with an associated value, e.g., @code{:repeat nil}. @defun evil-add-command-properties command &rest properties Add @var{properties} to @var{command}. The properties should be specified as a list of keywords and values: @lisp (evil-add-command-properties 'my-command :repeat t) @end lisp @end defun @defun evil-set-command-properties command &rest properties Like @samp{evil-add-command-properties}, but resets all previous properties. @end defun @defun evil-get-command-property command property Return the value of a command property. @end defun @defmac evil-define-command command (args@dots{}) doc keyword-args@dots{} body@dots{} Define a command with command properties @var{keyword-args}. @end defmac @noindent For setting repeat properties, Evil provides the following functions: @defun evil-declare-repeat command Declare @var{command} to be repeatable. @end defun @defun evil-declare-not-repeat command Declare @var{command} to be nonrepeatable. @end defun @defun evil-declare-change-repeat command Declare @var{command} to be repeatable by buffer changes rather than keystrokes. @end defun @node GNU Free Documentation License @appendix GNU Free Documentation License @include fdl-1.3.texi @bye @c Local Variables: @c mode: texinfo @c TeX-master: t @c sentence-end-double-space: t @c End: