summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Krauser <david@krauser.org>2020-07-13 20:25:39 -0700
committerDavid Krauser <david@krauser.org>2020-07-13 20:25:39 -0700
commit070412e94b7dab1cfc1a18950f84079082870964 (patch)
tree378dd727c25f269ef1896f7e210418f5273231ab
parent1f9ed0f19bc7db82bacdec137bf1eb60b10832f6 (diff)
parent7bf9efd656030b1edf296f6072dbd44cb94eae54 (diff)
Record evil-el (1.14.0-1) in archive suite sid
-rw-r--r--.dir-locals.el3
-rw-r--r--.github/ISSUE_TEMPLATE.md29
-rw-r--r--.gitignore24
-rw-r--r--.hg_archival.txt6
-rw-r--r--.hgtags30
-rw-r--r--.travis.yml29
-rw-r--r--CONTRIBUTING.md56
-rw-r--r--Cask6
-rw-r--r--Makefile61
-rw-r--r--README.md76
-rw-r--r--debian/.gitignore7
-rw-r--r--debian/changelog58
-rw-r--r--debian/compat1
-rw-r--r--debian/control24
-rw-r--r--debian/copyright10
-rw-r--r--debian/elpa-evil.elpa1
-rw-r--r--debian/elpa-evil.info2
-rw-r--r--debian/gbp.conf4
-rw-r--r--debian/patches/emacs25-skip-failing-tests.patch623
-rw-r--r--debian/patches/fix-evil-mode-autoload.patch22
-rw-r--r--debian/patches/series2
-rwxr-xr-xdebian/rules19
-rw-r--r--debian/watch4
-rw-r--r--doc/Makefile20
-rw-r--r--doc/build/texinfo/evil.texi2202
-rw-r--r--doc/docstringdb.json1
-rw-r--r--doc/evil.pdfbin246764 -> 0 bytes
-rw-r--r--doc/evil.texi769
-rw-r--r--doc/fdl-1.3.texi506
-rw-r--r--doc/macros.texi13
-rw-r--r--doc/make.bat35
-rw-r--r--doc/source/_ext/elisp.py309
-rw-r--r--doc/source/conf.py90
-rw-r--r--doc/source/extension.rst146
-rw-r--r--doc/source/faq.rst102
-rw-r--r--doc/source/hooks.rst16
-rw-r--r--doc/source/index.rst21
-rw-r--r--doc/source/indices.rst6
-rw-r--r--doc/source/internals.rst36
-rw-r--r--doc/source/keymaps.rst145
-rw-r--r--doc/source/license.rst447
-rw-r--r--doc/source/overview.rst107
-rw-r--r--doc/source/settings.rst185
-rw-r--r--doc/version.texi7
-rw-r--r--evil-command-window.el31
-rw-r--r--evil-commands.el1001
-rw-r--r--evil-common.el512
-rw-r--r--evil-core.el314
-rw-r--r--evil-development.el50
-rw-r--r--evil-digraphs.el4
-rw-r--r--evil-ex.el240
-rw-r--r--evil-integration.el200
-rw-r--r--evil-jumps.el81
-rw-r--r--evil-keybindings.el124
-rw-r--r--evil-macros.el119
-rw-r--r--evil-maps.el39
-rw-r--r--evil-pkg.el8
-rw-r--r--evil-repeat.el27
-rw-r--r--evil-search.el120
-rw-r--r--evil-states.el69
-rw-r--r--evil-test-helpers.el414
-rw-r--r--evil-tests.el1573
-rw-r--r--evil-types.el83
-rw-r--r--evil-vars.el447
-rw-r--r--evil.el24
-rw-r--r--lib/ert.el2549
-rw-r--r--lib/goto-chg.el271
-rw-r--r--lib/undo-tree.el137
-rwxr-xr-xscripts/evil-extract-docstrings58
-rwxr-xr-xscripts/evilupdate3
70 files changed, 8097 insertions, 6661 deletions
diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 0000000..d79ba71
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,3 @@
+;; Don't use tabs for el files
+((emacs-lisp-mode .
+ ((indent-tabs-mode . nil))))
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..a96e0b6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,29 @@
+<!-- Replace every comment and delete this line -->
+# Issue type
+
+<!-- Pick one of the following, delete the rest -->
+- Bug report
+- Enhancement request
+- Question
+- Other
+
+# Environment
+
+Emacs version: <!-- M-x emacs-version -->
+Operating System: <!-- Name and version, e.g. Windows 10, macOS Sierra, Debian Jessie -->
+Evil version: <!-- M-x evil-version -->
+Evil installation type: <!-- MELPA, MELPA stable, Quelpa, El-Get, manual -->
+Graphical/Terminal: <!-- Whether you're running Emacs in a terminal emulator or under X -->
+Tested in a `make emacs` session (see [CONTRIBUTING.md](https://github.com/emacs-evil/evil/blob/master/CONTRIBUTING.md#bug-reports)): <!-- Yes / No -->
+
+# Reproduction steps
+- Start Emacs
+<!-- Minimal list of steps to reproduce the bug, preferably using `make emacs`: https://github.com/emacs-evil/evil/blob/master/CONTRIBUTING.md#bug-reports -->
+
+# Expected behavior
+<!-- Describe how it should behave -->
+
+# Actual behavior
+<!-- Describe how it does behave -->
+
+# Further notes
diff --git a/.gitignore b/.gitignore
index adb1fcb..a9b6f32 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,22 @@
*.elc
-*.aux
*.cp
-*.fn
-*.fns
-*.info
*.ky
-*.log
*.pg
-*.toc
*.tp
-*.vr
-*.vrs
.depend
+evil-autoloads.el
+test-results.txt
+typescript
+
+/doc/dir
+/doc/*.aux
+/doc/*.fn
+/doc/*.fns
+/doc/*.info
+/doc/*.log
+/doc/*.toc
+/doc/*.vr
+/doc/*.vrs
+/doc/build/*/
+!/doc/build/texinfo/evil.texi
+*.pyc
diff --git a/.hg_archival.txt b/.hg_archival.txt
deleted file mode 100644
index f213dc7..0000000
--- a/.hg_archival.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-repo: 061c3503e3d32232b0297723a1e6ef21c499f490
-node: 3f1515976813263540eb3cf3532f86a1df4cef92
-branch: default
-latesttag: 1.2.12
-latesttagdistance: 30
-changessincelatesttag: 152
diff --git a/.hgtags b/.hgtags
deleted file mode 100644
index 119ea31..0000000
--- a/.hgtags
+++ /dev/null
@@ -1,30 +0,0 @@
-252a83d5506d6051b99fe74101404aba065c0b94 1.0.0
-07eca3a64cb88fa26a5775668a0ce5990e250e6d 1.0.1
-3c8488355f1ab6bb9b3ffc7530feb420d0f5b76f 1.0.2
-862a24c814901cdad145489979892dad4192d3fa 1.0.3
-b9b132bb83807d9cde110ea9f2f8eaf6f31519e0 1.0.4
-14513c332540d14f7b801ba6cbb0394574a81fcb 1.0.5
-34a1c0498786a948f5a028f95b4c9a744b67e4fa 1.0.6
-826a013e0a0ce5aa5f5dfa70609fcb0b52ea797e 1.0.7
-0d5a8fa286c01f1ce0b0cd7d651a6454578b3b74 1.0.8
-00e2193b344a0b55e7bc3134d79e2b304dd99224 1.0.9
-6e5f2dc8adf7997c6e47238aa94d39166a7af392 1.1.0
-ee9053dbc63617aacf6bb7afff44e3a6e5717ecb 1.1.1
-171ab4bb84676f25f76b6df43b064935f16675af 1.1.2
-88ce0ea2aaa5e8f17082afe020f34cb1578caec3 1.1.3
-ad71ff9a68e500ee511cb9a0c99069956bc85870 1.1.4
-3408efc9ef9f0d2b1634dba8edf3353ce31df524 1.1.5
-fc249515c0c8ae98f324df178c9661d8d89af6a3 1.1.6
-ae0f337644e7e1dd2c440e442f3e76fc88edb5ba 1.2.0
-c6a2caeae9d7cf88f5b049f00d04652e415d0f22 1.2.1
-88ba7c2cacd462cd174bac95dead237cd3da5b21 1.2.2
-e5588e50c0e40a66c099868ea825755e348311fb 1.2.3
-d2abac9265b3a66ecc0d7b25a9be4b27f791f330 1.2.4
-72593d8e83a3b531d87e06a3c103be8796fee0b0 1.2.5
-b2547034376a6708b1464f286bd16430def83151 1.2.6
-40817fe3630bd442c794a4f39a5b4bf0ddb5db6f 1.2.7
-464af57fd2b75801df23471a8ff658693098aed3 1.2.8
-78e1ed4dcd5dfdcfc291c6240ef707f8ce18a702 1.2.9
-cfd985652e5396e8a5b124e2ea0b792922885df3 1.2.10
-65407643bd28a708408d642ccdfef41c19b59158 1.2.11
-238b01c6dfbc891c55fcef9dad43c42e6907714d 1.2.12
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..8ed8c72
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,29 @@
+language: nix
+
+os:
+ - linux
+
+env:
+ - EMACS_CI=emacs-24-5
+ - EMACS_CI=emacs-25-3
+ - EMACS_CI=emacs-26-3
+ - EMACS_CI=emacs-snapshot
+
+matrix:
+ allow_failures:
+ - env: EMACS_CI=emacs-snapshot
+
+install:
+ - bash <(curl https://raw.githubusercontent.com/purcell/nix-emacs-ci/master/travis-install)
+
+script:
+ - emacs --version
+ - script -eqc 'make test' > /dev/null
+
+after_script:
+ - cat test-results.txt
+
+notifications:
+ email:
+ on_success: never
+ on_failure: always
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..913a5e2
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,56 @@
+# Bug reports
+
+Bug reports and feature requests should be made on the
+[issue tracker](https://github.com/emacs-evil/evil/issues) here on github.
+
+**Before** sending a bug report, please take note of the following comments.
+
+1. Please provide a full description of the configuration of your
+ system. This includes
+
+ - Emacs version,
+ - Evil version (e.g., the hash in the git repository),
+ - Whether you use Emacs/Evil in X mode or in terminal mode,
+ - Whether you use Emacs/Evil in terminal mode with some terminal multiplexer
+ like **tmux** or **screen** (and see below).
+
+2. Test the bug in a clean Emacs environment without any additional
+ packages loaded (besides Evil itself). You can easily get such an
+ environment by executing either `make emacs` (for X) or `make
+ terminal` (for terminal mode) in Evil's source directory. If your
+ bug is related to some other package, try to load only this package
+ from the clean environment after using `M-x package-initialize`
+ first.
+
+3. If you've just updated your Evil from the repository, **do not forget to
+ recompile** Evil by executing `make` in Evil's source directory.
+
+4. If possible, try to give a minimal example how to reproduce the error
+ starting from a fresh Emacs. The minimal example could be some buffer content
+ and a sequence of key-strokes that show up the error.
+
+5. If the bug you want to report is related to the behavior of some commands or
+ motions, please note the following. One goal of Evil is to get a behavior as
+ close to **Vim** as possible unless there is a good reason not to do so. The
+ reason is that many users come from Vim or use both, Vim and Evil, and we
+ want to keep the number of annoying differences between both as small as
+ possible, especially in common commands. In case you get an unexpected
+ behavior, please compare the behavior with plain Vim (i.e., without any
+ customization), if there's a difference please file the bug with a
+ description of this difference (and possibly a reference to Vim's
+ documentation). If you realize that both, Vim and Evil, behave the same but
+ you want a different behavior, you may make a **feature request** for some
+ customization option (but the default behavior will probably not be changed
+ in favor for Vim compatibility). Evil already contains several customization
+ options and sometimes the desired changes can be achieved as easily as
+ redefining some key-bindings.
+
+# Pull Requests
+
+1. Please follow the
+ [Emacs Lisp Style Guide](https://github.com/bbatsov/emacs-lisp-style-guide/)
+2. When in doubt, adhere to the style conventions in the source code,
+ but don't be afraid of suggesting code enhancements in case you
+ encounter suboptimal code.
+3. If your pull requests adds a feature or fixes a regression, add
+ tests covering it to `evil-tests.el`.
diff --git a/Cask b/Cask
new file mode 100644
index 0000000..a13cfa2
--- /dev/null
+++ b/Cask
@@ -0,0 +1,6 @@
+(package "evil" "1.14.0" "Extensible Vi layer for Emacs.")
+
+(files "*.el")
+
+;; (depends-on "goto-chg" "0.6.3")
+;; (depends-on "undo-tree" "1.6")
diff --git a/Makefile b/Makefile
index 7f58ae1..c8d3958 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
SHELL = /bin/sh
-EMACS = emacs
-FILES = $(filter-out evil-tests.el,$(filter-out evil-pkg.el,$(wildcard evil*.el)))
+EMACS ?= emacs
+FILES = $(filter-out evil-test-helpers.el evil-tests.el evil-pkg.el,$(wildcard evil*.el))
VERSION := $(shell sed -ne '/define-package/,$$p' evil-pkg.el | sed -ne '/^\s*"[[:digit:]]\+\(\.[[:digit:]]\+\)*"\s*$$/ s/^.*"\(.*\)".*$$/\1/p')
ELPAPKG = evil-$(VERSION)
PROFILER =
@@ -10,7 +10,7 @@ LIBS = -L lib
ELCFILES = $(FILES:.el=.elc)
-.PHONY: all compile compile-batch info pdf clean tests test emacs term terminal profiler indent elpa version
+.PHONY: all compile compile-batch docstrings doc clean tests test emacs term terminal profiler indent elpa version
# Byte-compile Evil.
all: compile
@@ -20,7 +20,7 @@ compile: $(ELCFILES)
@echo Compute dependencies
@rm -f .depend
@for f in $(FILES); do \
- sed -n "s/(require '\(evil-.*\))/$${f}c: \1.elc/p" $$f >> .depend;\
+ sed -n "s/ *(require '\(evil-[^)]*\).*)/$${f}c: \1.elc/p" $$f >> .depend;\
done
-include .depend
@@ -34,13 +34,14 @@ compile-batch: clean
$(EMACS) --batch -Q -L . $(LIBS) -f batch-byte-compile ${FILES}
# Documentation.
-doc: info pdf
+docstrings:
+ @$(EMACS) --script scripts/evil-extract-docstrings
-info: clean
- cd $(DOC) && makeinfo evil.texi
+doc: docstrings
+ @$(MAKE) -C doc texinfo
-pdf: clean
- cd $(DOC) && texi2pdf evil.texi
+info: doc
+ @$(MAKE) -C doc info
# Delete byte-compiled files etc.
clean:
@@ -48,7 +49,7 @@ clean:
rm -f \#*\#
rm -f *.elc
rm -f .depend
- cd $(DOC) && rm -f *.aux *.cp *.fn *.fns *.info *.ky *.log *.pg *.toc *.tp *.vr *.vrs
+ @$(MAKE) -C doc clean
# Run tests.
# The TAG variable may specify a test tag or a test name:
@@ -56,50 +57,50 @@ clean:
# This will only run tests pertaining to the repeat system.
test:
$(EMACS) -nw -Q -L . $(LIBS) -l evil-tests.el \
---eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}))"
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}))"
# Byte-compile Evil and run all tests.
tests: compile
$(EMACS) -nw -Q -L . $(LIBS) -l evil-tests.el \
---eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}))"
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}))"
rm -f *.elc .depend
# Load Evil in a fresh instance of Emacs and run all tests.
emacs:
$(EMACS) -Q -L . $(LIBS) -l goto-chg.el -l evil-tests.el \
---eval "(evil-mode 1)" \
---eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}) t)" &
+ --eval "(evil-mode 1)" \
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}) t)"
# Load Evil in a terminal Emacs and run all tests.
term: terminal
terminal:
$(EMACS) -nw -Q -L . $(LIBS) -l goto-chg.el -l evil-tests.el \
---eval "(evil-mode 1)" \
---eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}) t)"
+ --eval "(evil-mode 1)" \
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}) t)"
# Run all tests with profiler.
profiler:
$(EMACS) --batch -Q -L . $(LIBS) -l goto-chg.el -l evil-tests.el \
---eval "(evil-tests-initialize '(${TAG}) (or '(${PROFILER}) t))"
+ --eval "(evil-tests-initialize '(${TAG}) (or '(${PROFILER}) t))"
# Re-indent all Evil code.
# Loads Evil into memory in order to indent macros properly.
# Also removes trailing whitespace, tabs and extraneous blank lines.
indent: clean
$(EMACS) --batch --eval '(setq vc-handled-backends nil)' ${FILES} evil-tests.el -Q -L . $(LIBS) -l evil-tests.el \
---eval "(dolist (buffer (reverse (buffer-list))) \
-(when (buffer-file-name buffer) \
-(set-buffer buffer) \
-(message \"Indenting %s\" (current-buffer)) \
-(setq-default indent-tabs-mode nil) \
-(untabify (point-min) (point-max)) \
-(indent-region (point-min) (point-max)) \
-(delete-trailing-whitespace) \
-(untabify (point-min) (point-max)) \
-(goto-char (point-min)) \
-(while (re-search-forward \"\\n\\\\{3,\\\\}\" nil t) \
-(replace-match \"\\n\\n\")) \
-(when (buffer-modified-p) (save-buffer 0))))"
+ --eval "(dolist (buffer (reverse (buffer-list))) \
+ (when (buffer-file-name buffer) \
+ (set-buffer buffer) \
+ (message \"Indenting %s\" (current-buffer)) \
+ (setq-default indent-tabs-mode nil) \
+ (untabify (point-min) (point-max)) \
+ (indent-region (point-min) (point-max)) \
+ (delete-trailing-whitespace) \
+ (untabify (point-min) (point-max)) \
+ (goto-char (point-min)) \
+ (while (re-search-forward \"\\n\\\\{3,\\\\}\" nil t) \
+ (replace-match \"\\n\\n\")) \
+ (when (buffer-modified-p) (save-buffer 0))))"
# Create an ELPA package.
elpa:
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..16d1cc7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,76 @@
+![An extensible vi layer for Emacs](https://raw.githubusercontent.com/emacs-evil/evil/master/doc/logo.png)
+
+[![Build Status](https://travis-ci.org/emacs-evil/evil.svg?branch=master)](https://travis-ci.org/emacs-evil/evil)
+[![MELPA](https://melpa.org/packages/evil-badge.svg)](https://melpa.org/#/evil)
+[![MELPA Stable](https://stable.melpa.org/packages/evil-badge.svg)](https://stable.melpa.org/#/evil)
+[![Documentation Status](https://readthedocs.org/projects/evil/badge/?version=latest)](https://evil.readthedocs.io/en/latest/?badge=latest)
+[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
+
+Evil is an **e**xtensible **vi** **l**ayer
+for [Emacs](http://www.gnu.org/software/emacs/). It emulates the main features
+of [Vim](http://www.vim.org/), and provides facilities for writing custom
+extensions. Also see our page on [EmacsWiki](http://emacswiki.org/emacs/Evil).
+
+# Installation
+
+See the
+[official documentation](https://evil.readthedocs.io/en/latest/overview.html#installation-via-package-el)
+for installation instructions. We recommend using *package.el*.
+
+As a quickstart, you can add the following code to your Emacs init
+file.
+
+```elisp
+;; Set up package.el to work with MELPA
+(require 'package)
+(add-to-list 'package-archives
+ '("melpa" . "https://melpa.org/packages/"))
+(package-initialize)
+(package-refresh-contents)
+
+;; Download Evil
+(unless (package-installed-p 'evil)
+ (package-install 'evil))
+
+;; Enable Evil
+(require 'evil)
+(evil-mode 1)
+```
+
+## Dependencies
+
+* Evil requires Emacs 24.1 or later.
+
+* Evil requires [undo-tree.el](http://www.emacswiki.org/emacs/UndoTree) in the
+`load-path` for linear undo and undo branches.
+
+* For the motions `g;` `g,` and for the last-change-register `.`, Evil requires the
+[goto-chg.el](https://github.com/emacs-evil/goto-chg) package,
+which provides the functions `goto-last-change` and `goto-last-change-reverse`.
+
+* For Emacs 24.1 and 24.2 Evil also requires
+ [cl-lib](https://elpa.gnu.org/packages/cl-lib.html).
+
+# Documentation
+
+The latest version of the documentation is readable online
+[here](https://evil.readthedocs.io/en/latest/index.html). It is also
+available as
+[PDF](https://readthedocs.org/projects/evil/downloads/pdf/latest/) and
+as [EPUB](https://readthedocs.org/projects/evil/downloads/epub/latest/).
+
+# Mailing list
+
+Evil is discussed at the
+[gmane.emacs.vim-emulation](http://lists.ourproject.org/cgi-bin/mailman/listinfo/implementations-list)
+mailing list.
+
+# IRC
+
+Visit us on `irc.freenode.net #evil-mode`.
+
+# Contribution
+
+See
+[CONTRIBUTING.md](https://github.com/emacs-evil/evil/blob/master/CONTRIBUTING.md)
+for guidelines for issues and pull requests.
diff --git a/debian/.gitignore b/debian/.gitignore
deleted file mode 100644
index 4dda9a6..0000000
--- a/debian/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.debhelper/
-debhelper-build-stamp
-elpa-evil.postinst.debhelper
-elpa-evil.prerm.debhelper
-elpa-evil.substvars
-elpa-evil/
-files \ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
index c1b9487..4b52b98 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,61 @@
+evil-el (1.14.0-1) unstable; urgency=medium
+
+ [ David Krauser ]
+ * Update to upstream version 1.14.0 (Closes: #953397)
+ * Switch to sphinx for documentation generation
+ * Drop unused build dependency on dtach
+ * Enable autopkgtests
+
+ [ Nicholas D Steeves ]
+ * Drop emacs24 from Enhances; it is a dummy transitional package in buster
+ that does not exist in bullseye.
+ * copyright: Add path to full-text copy of GFDL-1.3 on Debian systems,
+ and add missing end quotes wherever they had been omitted.
+
+ -- David Krauser <david@krauser.org> Mon, 13 Jul 2020 23:25:39 -0400
+
+evil-el (1.12.17-1) unstable; urgency=medium
+
+ [ David Krauser ]
+ * Update to upstream version 1.12.17
+ * Include new evil-keybindings.el
+ - This provides a set of keybindings for other emacs modes
+ * Remove patch that disables tests that fail in older versions.
+ - These tests were fixed in upstream version 1.2.13, so the patch is no
+ longer necessary.
+ * Remove patch that forced evil-mode to autoload as an interactive function
+ - The patch is no longer necessary. Upstream now specifies evil-mode as
+ interactive in the autoload magic comment for the function.
+ * Update package Standards-Version to 4.4.1
+ - Drop Built-Using
+ * Update package Standards-Version to 4.5.0 (no changes required)
+ * Switch to debhelper-compat 12
+ * Drop dh-elpa version qualifier
+ - Version 1.6 of dh-elpa is the oldest version we have in the repositories,
+ which is newer than the minimum version required to build this package.
+ Should be safe to remove the qualifier.
+ * Add Rules-Requires-Root: no
+ * Remove unnecessary --parallel argument to dh
+ - This argument is now enabled by default
+ * Remove outdated upstream changelog
+ - This changelog is many years out of date at this point, and adds clutter
+ to the package that may cause confusion for users. It seems Dmitry did
+ not feel strongly about keeping this changelog when it was originally
+ added, so removing from the package.
+ * Configure gbp to use gzip compression.
+ - Upstream uses gzip for their release tarballs.
+ * Configure gbp to use pristine-tar.
+ * Update upstream URLs
+ * Add David Krauser to uploaders (Closes: #915492)
+ * Drop Dmitry Bogatov from uploaders
+ * Update maintainer name and email address
+
+ [ Nicholas D Steeves ]
+ * Update Vcs links from alioth to salsa.
+ * rules: Remove trailing whitespace.
+
+ -- David Krauser <david@krauser.org> Thu, 13 Feb 2020 22:33:42 -0500
+
evil-el (1.2.12-5) unstable; urgency=medium
* Team upload.
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index ec63514..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/debian/control b/debian/control
index b525009..cc71c5d 100644
--- a/debian/control
+++ b/debian/control
@@ -1,20 +1,24 @@
Source: evil-el
Section: lisp
Priority: optional
-Maintainer: Debian Emacs addons team <pkg-emacsen-addons@lists.alioth.debian.org>
-Uploaders: Dmitry Bogatov <KAction@gnu.org>
-Build-Depends: debhelper (>= 9), dh-elpa (>= 0.0.18), texinfo, dtach
-Standards-Version: 3.9.8
-Homepage: https://bitbucket.org/lyro/evil/wiki/Home
-Vcs-Git: https://anonscm.debian.org/git/pkg-emacsen/pkg/evil-el.git
-Vcs-Browser: https://anonscm.debian.org/cgit/pkg-emacsen/pkg/evil-el.git
+Maintainer: Debian Emacsen Team <debian-emacsen@lists.debian.org>
+Uploaders: David Krauser <david@krauser.org>
+Build-Depends: debhelper-compat (= 12)
+ , dh-elpa
+ , python3-sphinx
+ , texinfo
+Rules-Requires-Root: no
+Standards-Version: 4.5.0
+Homepage: https://github.com/emacs-evil/evil
+Vcs-Git: https://salsa.debian.org/emacsen-team/evil-el.git
+Vcs-Browser: https://salsa.debian.org/emacsen-team/evil-el
+Testsuite: autopkgtest-pkg-elpa
Package: elpa-evil
Architecture: all
-Depends: ${misc:Depends}, emacs, ${elpa:Depends}
-Built-Using: ${misc:Built-Using}
+Depends: ${misc:Depends}, emacs, ${elpa:Depends}, ${sphinxdoc:Depends}
Recommends: emacs (>= 46.0)
-Enhances: emacs, emacs24
+Enhances: emacs
Description: extensible vi layer for Emacs
Evil is an extensible vi layer for Emacs. It emulates the main
features of Vim, and provides facilities for writing custom
diff --git a/debian/copyright b/debian/copyright
index 9fb38e8..3c2d616 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,7 +1,7 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: evil
Upstream-Contact: Vegard Øye <vegard_oye@hotmail.com>
-Source: https://bitbucket.org/lyro/evil/wiki/Home
+Source: https://github.com/emacs-evil/evil
Files: *
License: GPL-3+
@@ -80,7 +80,7 @@ License: GPL-2+
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
On Debian systems, the complete text of the GNU General
- Public License version 2 can be found in "/usr/share/common-licenses/GPL-2
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2"
License: GPL-3+
This program is free software: you can redistribute it and/or modify
@@ -97,11 +97,13 @@ License: GPL-3+
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
On Debian systems, the complete text of the GNU General
- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3"
License: GFDL-1.3+
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.
-
+ .
+ On Debian systems, the complete text of the GNU Free Document License
+ version 1.3 can be found in "/usr/share/common-licenses/GFDL-1.3"
diff --git a/debian/elpa-evil.elpa b/debian/elpa-evil.elpa
index 8d2c3f6..dd51975 100644
--- a/debian/elpa-evil.elpa
+++ b/debian/elpa-evil.elpa
@@ -10,6 +10,7 @@ evil-digraphs.el
evil-ex.el
evil-integration.el
evil-jumps.el
+evil-keybindings.el
evil-macros.el
evil-maps.el
evil-repeat.el
diff --git a/debian/elpa-evil.info b/debian/elpa-evil.info
index 8a1f3cb..b7f2db3 100644
--- a/debian/elpa-evil.info
+++ b/debian/elpa-evil.info
@@ -1 +1 @@
-doc/evil.info \ No newline at end of file
+build/evil.info
diff --git a/debian/gbp.conf b/debian/gbp.conf
index 0c054fd..e27602c 100644
--- a/debian/gbp.conf
+++ b/debian/gbp.conf
@@ -3,8 +3,10 @@ upstream-branch = upstream
debian-branch = master
upstream-tag = upstream/%(version)s
debian-tag = debian/%(version)s
+pristine-tar = True
+pristine-tar-commit = True
#postbuild = lintian $GBP_CHANGES_FILE
color = on
-compression = xz
+compression = gz
compression-level = 9
diff --git a/debian/patches/emacs25-skip-failing-tests.patch b/debian/patches/emacs25-skip-failing-tests.patch
deleted file mode 100644
index be51dfb..0000000
--- a/debian/patches/emacs25-skip-failing-tests.patch
+++ /dev/null
@@ -1,623 +0,0 @@
-Description: Skip tests, failing with emacs25
- Test suite for evil-1.2.12 fails with emacs25 (#847040).
- Upstream bug is filed.
- .
- But since evil works for my not so advanced usage pattern, let us to
- comment out failing tests for now. Ideally, they should be
- uncommented when upstream relases fix in (evil > 1.2.12).
-Author: Dmitry Bogatov <KAction@gnu.org>
-Forwarded: not-needed
-Last-Update: 2016-12-17
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- a/evil-tests.el
-+++ b/evil-tests.el
-@@ -1072,73 +1072,73 @@ If nil, KEYS is used."
- (should (equal (evil-normalize-repeat-info (ring-ref evil-repeat-ring 0))
- (list (vconcat (or recorded keys))))))
-
--(ert-deftest evil-test-normal-repeat-info-simple-command ()
-- "Save key-sequence after simple editing command in Normal state"
-- :tags '(evil repeat)
-- (evil-test-buffer
-- "[T]his is a test buffer"
-- (ert-info ("Call simple command without count")
-- (evil-test-repeat-info "x"))
-- (ert-info ("Call simple command with count 3")
-- (evil-test-repeat-info "3x"))))
--
--(ert-deftest evil-test-normal-repeat-info-char-command ()
-- "Save key-sequence after editing command with character in Normal state"
-- :tags '(evil repeat)
-- (evil-test-buffer
-- "[T]his is a test buffer"
-- (ert-info ("Call command with character argument without count")
-- (evil-test-repeat-info "r5"))
-- (ert-info ("Call command with character argument with count 12")
-- (evil-test-repeat-info "12rX"))))
--
--(ert-deftest evil-test-insert-repeat-info ()
-- "Save key-sequence after Insert state"
-- :tags '(evil repeat)
-- (evil-test-buffer
-- (ert-info ("Insert text without count")
-- (evil-test-repeat-info (vconcat "iABC" [escape])))
-- (ert-info ("Insert text with count 42")
-- (evil-test-repeat-info (vconcat "42iABC" [escape])))))
--
--(ert-deftest evil-test-repeat ()
-- "Repeat several editing commands"
-- :tags '(evil repeat)
-- (ert-info ("Repeat replace")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save"
-- ("rX")
-- "[X]; This buffer is for notes you don't want to save"
-- ([right right] ".")
-- "X;[X]This buffer is for notes you don't want to save"))
-- (ert-info ("Repeat replace with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save"
-- ("2rX")
-- "X[X] This buffer is for notes you don't want to save"
-- ([right right] ".")
-- "XX X[X]is buffer is for notes you don't want to save"))
-- (ert-info ("Repeat replace without count with a new count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save"
-- ("rX")
-- "[X]; This buffer is for notes you don't want to save"
-- ([right right] "13.")
-- "X;XXXXXXXXXXXX[X]is for notes you don't want to save"))
-- (ert-info ("Repeat replace with count replacing original count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save"
-- ("10rX")
-- "XXXXXXXXX[X]ffer is for notes you don't want to save"
-- ([right right] "20.")
-- "XXXXXXXXXXfXXXXXXXXXXXXXXXXXXX[X] don't want to save"))
-- (ert-info ("Repeat movement in Insert state")
-- (evil-test-buffer
-- ";; [T]his buffer is for notes you don't want to save"
-- ("i(\M-f)" [escape])
-- ";; (This[)] buffer is for notes you don't want to save"
-- ("w.")
-- ";; (This) (buffer[)] is for notes you don't want to save")))
-+;; (ert-deftest evil-test-normal-repeat-info-simple-command ()
-+;; "Save key-sequence after simple editing command in Normal state"
-+;; :tags '(evil repeat)
-+;; (evil-test-buffer
-+;; "[T]his is a test buffer"
-+;; (ert-info ("Call simple command without count")
-+;; (evil-test-repeat-info "x"))
-+;; (ert-info ("Call simple command with count 3")
-+;; (evil-test-repeat-info "3x"))))
-+
-+;; (ert-deftest evil-test-normal-repeat-info-char-command ()
-+;; "Save key-sequence after editing command with character in Normal state"
-+;; :tags '(evil repeat)
-+;; (evil-test-buffer
-+;; "[T]his is a test buffer"
-+;; (ert-info ("Call command with character argument without count")
-+;; (evil-test-repeat-info "r5"))
-+;; (ert-info ("Call command with character argument with count 12")
-+;; (evil-test-repeat-info "12rX"))))
-+
-+;; (ert-deftest evil-test-insert-repeat-info ()
-+;; "Save key-sequence after Insert state"
-+;; :tags '(evil repeat)
-+;; (evil-test-buffer
-+;; (ert-info ("Insert text without count")
-+;; (evil-test-repeat-info (vconcat "iABC" [escape])))
-+;; (ert-info ("Insert text with count 42")
-+;; (evil-test-repeat-info (vconcat "42iABC" [escape])))))
-+
-+;; (ert-deftest evil-test-repeat ()
-+;; "Repeat several editing commands"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat replace")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save"
-+;; ("rX")
-+;; "[X]; This buffer is for notes you don't want to save"
-+;; ([right right] ".")
-+;; "X;[X]This buffer is for notes you don't want to save"))
-+;; (ert-info ("Repeat replace with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save"
-+;; ("2rX")
-+;; "X[X] This buffer is for notes you don't want to save"
-+;; ([right right] ".")
-+;; "XX X[X]is buffer is for notes you don't want to save"))
-+;; (ert-info ("Repeat replace without count with a new count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save"
-+;; ("rX")
-+;; "[X]; This buffer is for notes you don't want to save"
-+;; ([right right] "13.")
-+;; "X;XXXXXXXXXXXX[X]is for notes you don't want to save"))
-+;; (ert-info ("Repeat replace with count replacing original count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save"
-+;; ("10rX")
-+;; "XXXXXXXXX[X]ffer is for notes you don't want to save"
-+;; ([right right] "20.")
-+;; "XXXXXXXXXXfXXXXXXXXXXXXXXXXXXX[X] don't want to save"))
-+;; (ert-info ("Repeat movement in Insert state")
-+;; (evil-test-buffer
-+;; ";; [T]his buffer is for notes you don't want to save"
-+;; ("i(\M-f)" [escape])
-+;; ";; (This[)] buffer is for notes you don't want to save"
-+;; ("w.")
-+;; ";; (This) (buffer[)] is for notes you don't want to save")))
-
- (ert-deftest evil-test-repeat-register ()
- "Test repeating a register command."
-@@ -1198,38 +1198,38 @@ If nil, KEYS is used."
- ("2ievil rulz " [escape])
- ";; evil rulz evil rulz[ ]This buffer is for notes"))
-
--(ert-deftest evil-test-repeat-insert ()
-- "Test repeating of `evil-insert'"
-- :tags '(evil repeat)
-- (ert-info ("Repeat insert")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("iABC" [escape])
-- "AB[C];; This buffer is for notes"
-- ("..")
-- "ABABAB[C]CC;; This buffer is for notes"))
-- (ert-info ("Repeat insert with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("2iABC" [escape])
-- "ABCAB[C];; This buffer is for notes"
-- ("..")
-- "ABCABABCABABCAB[C]CC;; This buffer is for notes"))
-- (ert-info ("Repeat insert with repeat count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("iABC" [escape])
-- "AB[C];; This buffer is for notes"
-- ("11.")
-- "ABABCABCABCABCABCABCABCABCABCABCAB[C]C;; This buffer is for notes"))
-- (ert-info ("Repeat insert with count with repeat with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("10iABC" [escape])
-- "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
-- ("11.")
-- "ABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCABCABCABCABCAB[C]C;; \
--This buffer is for notes")))
-+;; (ert-deftest evil-test-repeat-insert ()
-+;; "Test repeating of `evil-insert'"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat insert")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("iABC" [escape])
-+;; "AB[C];; This buffer is for notes"
-+;; ("..")
-+;; "ABABAB[C]CC;; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("2iABC" [escape])
-+;; "ABCAB[C];; This buffer is for notes"
-+;; ("..")
-+;; "ABCABABCABABCAB[C]CC;; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with repeat count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("iABC" [escape])
-+;; "AB[C];; This buffer is for notes"
-+;; ("11.")
-+;; "ABABCABCABCABCABCABCABCABCABCABCAB[C]C;; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with count with repeat with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("10iABC" [escape])
-+;; "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
-+;; ("11.")
-+;; "ABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCABCABCABCABCAB[C]C;; \
-+;; This buffer is for notes")))
-
- (ert-deftest evil-test-repeat-error ()
- "Test whether repeat returns to normal state in case of an error."
-@@ -1289,38 +1289,38 @@ This buffer is for notes")))
- ("2aevil rulz " [escape])
- ";; Tevil rulz evil rulz[ ]his buffer is for notes"))
-
--(ert-deftest evil-test-repeat-append ()
-- "Test repeating of `evil-append'"
-- :tags '(evil repeat)
-- (ert-info ("Repeat insert")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("aABC" [escape])
-- ";AB[C]; This buffer is for notes"
-- ("..")
-- ";ABCABCAB[C]; This buffer is for notes"))
-- (ert-info ("Repeat insert with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("2aABC" [escape])
-- ";ABCAB[C]; This buffer is for notes"
-- ("..")
-- ";ABCABCABCABCABCAB[C]; This buffer is for notes"))
-- (ert-info ("Repeat insert with repeat count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("aABC" [escape])
-- ";AB[C]; This buffer is for notes"
-- ("11.")
-- ";ABCABCABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"))
-- (ert-info ("Repeat insert with count with repeat with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes"
-- ("10aABC" [escape])
-- ";ABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"
-- ("11.")
-- ";ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]; \
--This buffer is for notes")))
-+;; (ert-deftest evil-test-repeat-append ()
-+;; "Test repeating of `evil-append'"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat insert")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("aABC" [escape])
-+;; ";AB[C]; This buffer is for notes"
-+;; ("..")
-+;; ";ABCABCAB[C]; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("2aABC" [escape])
-+;; ";ABCAB[C]; This buffer is for notes"
-+;; ("..")
-+;; ";ABCABCABCABCABCAB[C]; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with repeat count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("aABC" [escape])
-+;; ";AB[C]; This buffer is for notes"
-+;; ("11.")
-+;; ";ABCABCABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with count with repeat with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes"
-+;; ("10aABC" [escape])
-+;; ";ABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"
-+;; ("11.")
-+;; ";ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]; \
-+;; This buffer is for notes")))
-
- (ert-deftest evil-test-append-vcount ()
- "Test `evil-append' with vertical repeating"
-@@ -1354,44 +1354,44 @@ This buffer is for notes")))
- evil\nrulz\nevil\nrul[z]
- ;; and for Lisp evaluation."))
-
--(ert-deftest evil-test-repeat-open-above ()
-- "Test repeating of `evil-open-above'"
-- :tags '(evil repeat)
-- (ert-info ("Repeat insert")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save."
-- ("Oevil\nrulz" [escape])
-- "evil\nrul[z]
--;; This buffer is for notes you don't want to save."
-- ("..")
-- "evil\nevil\nevil\nrul[z]\nrulz\nrulz
--;; This buffer is for notes you don't want to save."))
-- (ert-info ("Repeat insert with count")
-- (evil-test-buffer
-- ";; This buffer is for notes you don't want to save."
-- ("2Oevil\nrulz" [escape])
-- "evil\nrulz\nevil\nrul[z]
--;; This buffer is for notes you don't want to save."
-- ("..")
-- "evil\nrulz\nevil\nevil\nrulz\nevil\nevil\nrulz\nevil\nrul[z]\nrulz\nrulz
--;; This buffer is for notes you don't want to save."))
-- (ert-info ("Repeat insert with repeat count")
-- (evil-test-buffer
-- ";; This buffer is for notes you don't want to save."
-- ("Oevil\nrulz" [escape])
-- "evil\nrul[z]\n;; This buffer is for notes you don't want to save."
-- ("2.")
-- "evil\nevil\nrulz\nevil\nrul[z]\nrulz
--;; This buffer is for notes you don't want to save."))
-- (ert-info ("Repeat insert with count with repeat with count")
-- (evil-test-buffer
-- ";; This buffer is for notes you don't want to save."
-- ("2Oevil\nrulz" [escape])
-- "evil\nrulz\nevil\nrul[z]
--;; This buffer is for notes you don't want to save."
-- ("3.")
-- "evil\nrulz\nevil\nevil\nrulz\nevil\nrulz\nevil\nrul[z]\nrulz
--;; This buffer is for notes you don't want to save.")))
-+;; (ert-deftest evil-test-repeat-open-above ()
-+;; "Test repeating of `evil-open-above'"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat insert")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save."
-+;; ("Oevil\nrulz" [escape])
-+;; "evil\nrul[z]
-+;; ;; This buffer is for notes you don't want to save."
-+;; ("..")
-+;; "evil\nevil\nevil\nrul[z]\nrulz\nrulz
-+;; ;; This buffer is for notes you don't want to save."))
-+;; (ert-info ("Repeat insert with count")
-+;; (evil-test-buffer
-+;; ";; This buffer is for notes you don't want to save."
-+;; ("2Oevil\nrulz" [escape])
-+;; "evil\nrulz\nevil\nrul[z]
-+;; ;; This buffer is for notes you don't want to save."
-+;; ("..")
-+;; "evil\nrulz\nevil\nevil\nrulz\nevil\nevil\nrulz\nevil\nrul[z]\nrulz\nrulz
-+;; ;; This buffer is for notes you don't want to save."))
-+;; (ert-info ("Repeat insert with repeat count")
-+;; (evil-test-buffer
-+;; ";; This buffer is for notes you don't want to save."
-+;; ("Oevil\nrulz" [escape])
-+;; "evil\nrul[z]\n;; This buffer is for notes you don't want to save."
-+;; ("2.")
-+;; "evil\nevil\nrulz\nevil\nrul[z]\nrulz
-+;; ;; This buffer is for notes you don't want to save."))
-+;; (ert-info ("Repeat insert with count with repeat with count")
-+;; (evil-test-buffer
-+;; ";; This buffer is for notes you don't want to save."
-+;; ("2Oevil\nrulz" [escape])
-+;; "evil\nrulz\nevil\nrul[z]
-+;; ;; This buffer is for notes you don't want to save."
-+;; ("3.")
-+;; "evil\nrulz\nevil\nevil\nrulz\nevil\nrulz\nevil\nrul[z]\nrulz
-+;; ;; This buffer is for notes you don't want to save.")))
-
- (ert-deftest evil-test-open-below-with-count ()
- "Test insertion of `evil-open-below' with repeat count"
-@@ -1404,55 +1404,55 @@ evil\nrulz\nevil\nrul[z]
- evil\nrulz\nevil\nrul[z]
- ;; and for Lisp evaluation."))
-
--(ert-deftest evil-test-repeat-open-below ()
-- "Test repeating `evil-open-below'"
-- :tags '(evil repeat)
-- (ert-info ("Repeat insert")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save,
--;; and for Lisp evaluation."
-- ("oevil\nrulz" [escape])
-- ";; This buffer is for notes you don't want to save,
--evil\nrul[z]\n;; and for Lisp evaluation."
-- ("..")
-- ";; This buffer is for notes you don't want to save,
--evil\nrulz\nevil\nrulz\nevil\nrul[z]
--;; and for Lisp evaluation."))
-- (ert-info ("Repeat insert with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save,
--;; and for Lisp evaluation."
-- ("2oevil\nrulz" [escape])
-- ";; This buffer is for notes you don't want to save,
--evil\nrulz\nevil\nrul[z]
--;; and for Lisp evaluation."
-- ("..")
-- ";; This buffer is for notes you don't want to save,
--evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
--;; and for Lisp evaluation."))
-- (ert-info ("Repeat insert with repeat count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save,
--;; and for Lisp evaluation."
-- ("oevil\nrulz" [escape])
-- ";; This buffer is for notes you don't want to save,
--evil\nrul[z]\n;; and for Lisp evaluation."
-- ("2.")
-- ";; This buffer is for notes you don't want to save,
--evil\nrulz\nevil\nrulz\nevil\nrul[z]
--;; and for Lisp evaluation."))
-- (ert-info ("Repeat insert with count with repeat with count")
-- (evil-test-buffer
-- "[;]; This buffer is for notes you don't want to save,
--;; and for Lisp evaluation."
-- ("2oevil\nrulz" [escape])
-- ";; This buffer is for notes you don't want to save,
--evil\nrulz\nevil\nrul[z]
--;; and for Lisp evaluation."
-- ("3.")
-- ";; This buffer is for notes you don't want to save,
--evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
--;; and for Lisp evaluation.")))
-+;; (ert-deftest evil-test-repeat-open-below ()
-+;; "Test repeating `evil-open-below'"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat insert")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save,
-+;; ;; and for Lisp evaluation."
-+;; ("oevil\nrulz" [escape])
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrul[z]\n;; and for Lisp evaluation."
-+;; ("..")
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrulz\nevil\nrulz\nevil\nrul[z]
-+;; ;; and for Lisp evaluation."))
-+;; (ert-info ("Repeat insert with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save,
-+;; ;; and for Lisp evaluation."
-+;; ("2oevil\nrulz" [escape])
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrulz\nevil\nrul[z]
-+;; ;; and for Lisp evaluation."
-+;; ("..")
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
-+;; ;; and for Lisp evaluation."))
-+;; (ert-info ("Repeat insert with repeat count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save,
-+;; ;; and for Lisp evaluation."
-+;; ("oevil\nrulz" [escape])
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrul[z]\n;; and for Lisp evaluation."
-+;; ("2.")
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrulz\nevil\nrulz\nevil\nrul[z]
-+;; ;; and for Lisp evaluation."))
-+;; (ert-info ("Repeat insert with count with repeat with count")
-+;; (evil-test-buffer
-+;; "[;]; This buffer is for notes you don't want to save,
-+;; ;; and for Lisp evaluation."
-+;; ("2oevil\nrulz" [escape])
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrulz\nevil\nrul[z]
-+;; ;; and for Lisp evaluation."
-+;; ("3.")
-+;; ";; This buffer is for notes you don't want to save,
-+;; evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
-+;; ;; and for Lisp evaluation.")))
-
- (ert-deftest evil-test-insert-line-with-count ()
- "Test `evil-insert-line' with repeat count"
-@@ -1462,37 +1462,37 @@ evil\nrulz\nevil\nrulz\nevil\nrulz\nevil
- ("2Ievil rulz " [escape])
- "evil rulz evil rulz[ ];; This buffer is for notes"))
-
--(ert-deftest evil-test-repeat-insert-line ()
-- "Test repeating of `evil-insert-line'"
-- :tags '(evil repeat)
-- (ert-info ("Repeat insert")
-- (evil-test-buffer
-- ";; This buffer is for note[s]"
-- ("IABC" [escape])
-- "AB[C];; This buffer is for notes"
-- ("..")
-- "AB[C]ABCABC;; This buffer is for notes"))
-- (ert-info ("Repeat insert with count")
-- (evil-test-buffer
-- ";; This buffer is for note[s]"
-- ("2IABC" [escape])
-- "ABCAB[C];; This buffer is for notes"
-- ("..")
-- "ABCAB[C]ABCABCABCABC;; This buffer is for notes"))
-- (ert-info ("Repeat insert with repeat count")
-- (evil-test-buffer
-- ";; This buffer is for note[s]"
-- ("IABC" [escape])
-- "AB[C];; This buffer is for notes"
-- ("11.")
-- "ABCABCABCABCABCABCABCABCABCABCAB[C]ABC;; This buffer is for notes"))
-- (ert-info ("Repeat insert with count with repeat with count")
-- (evil-test-buffer
-- ";; This buffer is for note[s]"
-- ("10IABC" [escape])
-- "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
-- ("11.")
-- "ABCABCABCABCABCABCABCABCABCABCAB[C]ABCABCABCABCABCABCABCABCABCABC;; This buffer is for notes")))
-+;; (ert-deftest evil-test-repeat-insert-line ()
-+;; "Test repeating of `evil-insert-line'"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat insert")
-+;; (evil-test-buffer
-+;; ";; This buffer is for note[s]"
-+;; ("IABC" [escape])
-+;; "AB[C];; This buffer is for notes"
-+;; ("..")
-+;; "AB[C]ABCABC;; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with count")
-+;; (evil-test-buffer
-+;; ";; This buffer is for note[s]"
-+;; ("2IABC" [escape])
-+;; "ABCAB[C];; This buffer is for notes"
-+;; ("..")
-+;; "ABCAB[C]ABCABCABCABC;; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with repeat count")
-+;; (evil-test-buffer
-+;; ";; This buffer is for note[s]"
-+;; ("IABC" [escape])
-+;; "AB[C];; This buffer is for notes"
-+;; ("11.")
-+;; "ABCABCABCABCABCABCABCABCABCABCAB[C]ABC;; This buffer is for notes"))
-+;; (ert-info ("Repeat insert with count with repeat with count")
-+;; (evil-test-buffer
-+;; ";; This buffer is for note[s]"
-+;; ("10IABC" [escape])
-+;; "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
-+;; ("11.")
-+;; "ABCABCABCABCABCABCABCABCABCABCAB[C]ABCABCABCABCABCABCABCABCABCABC;; This buffer is for notes")))
-
- (ert-deftest evil-test-insert-line-vcount ()
- "Test `evil-insert-line' with vertical repeating"
-@@ -1522,37 +1522,37 @@ ABCABC{
- ("2Aevil rulz " [escape])
- ";; This buffer is for notes.evil rulz evil rulz[ ]"))
-
--(ert-deftest evil-test-repeat-append-line ()
-- "Test repeating of `evil-append-line'"
-- :tags '(evil repeat)
-- (ert-info ("Repeat insert")
-- (evil-test-buffer
-- ";; [T]his buffer is for notes."
-- ("AABC" [escape])
-- ";; This buffer is for notes.AB[C]"
-- ("..")
-- ";; This buffer is for notes.ABCABCAB[C]"))
-- (ert-info ("Repeat insert with count")
-- (evil-test-buffer
-- ";; [T]his buffer is for notes."
-- ("2AABC" [escape])
-- ";; This buffer is for notes.ABCAB[C]"
-- ("..")
-- ";; This buffer is for notes.ABCABCABCABCABCAB[C]"))
-- (ert-info ("Repeat insert with repeat count")
-- (evil-test-buffer
-- ";; [T]his buffer is for notes."
-- ("AABC" [escape])
-- ";; This buffer is for notes.ABC"
-- ("11.")
-- ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
-- (ert-info ("Repeat insert with count with repeat with count")
-- (evil-test-buffer
-- ";; [T]his buffer is for notes."
-- ("10AABC" [escape])
-- ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCAB[C]"
-- ("11.")
-- ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]")))
-+;; (ert-deftest evil-test-repeat-append-line ()
-+;; "Test repeating of `evil-append-line'"
-+;; :tags '(evil repeat)
-+;; (ert-info ("Repeat insert")
-+;; (evil-test-buffer
-+;; ";; [T]his buffer is for notes."
-+;; ("AABC" [escape])
-+;; ";; This buffer is for notes.AB[C]"
-+;; ("..")
-+;; ";; This buffer is for notes.ABCABCAB[C]"))
-+;; (ert-info ("Repeat insert with count")
-+;; (evil-test-buffer
-+;; ";; [T]his buffer is for notes."
-+;; ("2AABC" [escape])
-+;; ";; This buffer is for notes.ABCAB[C]"
-+;; ("..")
-+;; ";; This buffer is for notes.ABCABCABCABCABCAB[C]"))
-+;; (ert-info ("Repeat insert with repeat count")
-+;; (evil-test-buffer
-+;; ";; [T]his buffer is for notes."
-+;; ("AABC" [escape])
-+;; ";; This buffer is for notes.ABC"
-+;; ("11.")
-+;; ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
-+;; (ert-info ("Repeat insert with count with repeat with count")
-+;; (evil-test-buffer
-+;; ";; [T]his buffer is for notes."
-+;; ("10AABC" [escape])
-+;; ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCAB[C]"
-+;; ("11.")
-+;; ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]")))
-
- (ert-deftest evil-test-append-line-vcount ()
- "Test `evil-append-line' with vertical repeating"
diff --git a/debian/patches/fix-evil-mode-autoload.patch b/debian/patches/fix-evil-mode-autoload.patch
deleted file mode 100644
index f168d5e..0000000
--- a/debian/patches/fix-evil-mode-autoload.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-Description: Fix evil-mode autoloading
- Change autoload marker for evil-mode that hardcoded autoload
- form. With it evil-mode was autoload as non-interactive function,
- which is wrong. This problem is Debian-specific and does not occur
- when installing Evil from MELPA.
-
-Author: Dmitry Bogatov <KAction@gnu.org>
-Last-Update: 2016-06-27
-Forwarded: not-needed
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- a/evil-core.el
-+++ b/evil-core.el
-@@ -175,7 +175,7 @@ To enable Evil globally, do (evil-mode 1
- (evil-local-mode 1)
- (evil-initialize-state)))
-
--;;;###autoload (autoload 'evil-mode "evil")
-+;;;###autoload
- (define-globalized-minor-mode evil-mode
- evil-local-mode evil-initialize)
-
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index 365cf4f..0000000
--- a/debian/patches/series
+++ /dev/null
@@ -1,2 +0,0 @@
-emacs25-skip-failing-tests.patch
-fix-evil-mode-autoload.patch
diff --git a/debian/rules b/debian/rules
index 766f04a..3915629 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,16 +1,16 @@
#!/usr/bin/make -f
%:
- dh $@ --parallel --with elpa
+ dh $@ --with elpa,sphinxdoc
+override_dh_auto_build: export http_proxy=127.0.0.1:9
+override_dh_auto_build: export https_proxy=127.0.0.1:9
override_dh_auto_build:
- $(MAKE) info
+ PYTHONPATH=. python3 -m sphinx -N -btexinfo doc/source/ build/info
+ makeinfo --no-split build/info/*.texi -o build/evil.info
-# CHANGES.org is a bit outdated, but probably still of interest. If
-# you think otherwise, I do not object.
-# -- Dmitry Bogatov <KAction@gnu.org> Wed Jun 22 14:13:06 MSK 2016
-override_dh_installchangelogs:
- dh_installchangelogs CHANGES.org
+override_dh_auto_clean:
+ rm -rf build doc/source/_ext/__pycache__ test-results.txt .depend
# These tests require terminal, and the following is true:
#
@@ -22,8 +22,3 @@ override_dh_installchangelogs:
# -- Dmitry Bogatov <KAction@gnu.org> Wed, 14 Dec 16 06:05:23 +0300
override_dh_elpa_test:
if [ -t 1 -a -t 0 ] ; then $(MAKE) test ; fi
-
-override_dh_elpa:
- dh_elpa
- sed -i 's#"evil-core"#"evil"#g' \
- debian/elpa-evil/usr/share/emacs/site-lisp/elpa-src/evil-*/evil-autoloads.el
diff --git a/debian/watch b/debian/watch
index 9a9692e..cbaf25b 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,2 +1,2 @@
-version=3
-https://bitbucket.org/lyro/evil/downloads .*/get/([0-9.]+)[.]tar[.]gz
+version=4
+https://github.com/emacs-evil/evil/releases /emacs-evil/evil/archive/(.+)\.tar\.gz
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..d0c3cbf
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/doc/build/texinfo/evil.texi b/doc/build/texinfo/evil.texi
new file mode 100644
index 0000000..ac3385b
--- /dev/null
+++ b/doc/build/texinfo/evil.texi
@@ -0,0 +1,2202 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename evil.info
+@documentencoding UTF-8
+@ifinfo
+@*Generated by Sphinx 2.4.3.@*
+@end ifinfo
+@settitle Evil documentation
+@defindex ge
+@paragraphindent 0
+@exampleindent 4
+@finalout
+@dircategory Emacs
+@direntry
+* evil: (evil.info). Extensible vi layer for Emacs
+@end direntry
+
+@definfoenclose strong,`,'
+@definfoenclose emph,`,'
+@c %**end of header
+
+@copying
+@quotation
+Evil 1.14.0, Mar 04, 2020
+
+Eivind Fonn, Frank Fischer, Vegard Øye
+
+Copyright @copyright{} 2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye
+@end quotation
+
+@end copying
+
+@titlepage
+@title Evil documentation
+@insertcopying
+@end titlepage
+@contents
+
+@c %** start of user preamble
+
+@c %** end of user preamble
+
+@ifnottex
+@node Top
+@top Evil documentation
+@insertcopying
+@end ifnottex
+
+@c %**start of body
+@anchor{index doc}@anchor{40}
+@c Evil documentation master file, created by
+@c sphinx-quickstart on Thu Dec 12 10:34:49 2019.
+@c You can adapt this file completely to your liking, but it should at least
+@c contain the root `toctree` directive.
+
+@menu
+* Overview::
+* Settings::
+* Keymaps::
+* Hooks::
+* Extension::
+* Frequently Asked Questions::
+* Internals::
+* The GNU Free Documentation License::
+* Emacs lisp functions and variables::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Overview
+
+* Installation via package.el: Installation via package el.
+* Manual installation::
+* Modes and states::
+
+Settings
+
+* The initial state::
+* Keybindings and other behaviour::
+* Search::
+* Indentation::
+* Cursor movement::
+* Cursor display::
+* Window management::
+* Parenthesis highlighting::
+* Miscellaneous::
+
+Keymaps
+
+* evil-define-key::
+* Leader keys::
+
+Extension
+
+* Motions::
+* Operators::
+* Text objects::
+* Range types::
+* States::
+
+Frequently Asked Questions
+
+* Problems with the escape key in the terminal::
+* Underscore is not a word character::
+
+Internals
+
+* Command properties::
+
+@end detailmenu
+@end menu
+
+@node Overview,Settings,Top,Top
+@anchor{overview doc}@anchor{41}@anchor{overview evil}@anchor{42}@anchor{overview overview}@anchor{43}
+@chapter Overview
+
+
+Evil is an extensible vi layer for Emacs. It emulates the main
+features of Vim, @footnote{@w{(1)}
+Vim is the most popular version of @emph{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{https://vim.org,the official Vim website}.
+} turning Emacs into a modal editor. Like Emacs in
+general, Evil is extensible in Emacs Lisp.
+
+@menu
+* Installation via package.el: Installation via package el.
+* Manual installation::
+* Modes and states::
+
+@end menu
+
+@node Installation via package el,Manual installation,,Overview
+@anchor{overview installation-via-package-el}@anchor{44}
+@section Installation via package.el
+
+
+Evil is available as a package from MELPA stable and MELPA unstable.
+This is the recommended way of installing Evil.
+
+To set up @cite{package.el} to work with one of these repositories, you can
+follow the instructions on
+melpa.org@footnote{https://melpa.org/#/getting-started}.
+
+Once that is done, you can execute the following commands:
+
+@example
+M-x package-refresh-contents
+M-x package-install RET evil RET
+@end example
+
+Finally, add the following lines to your Emacs init file:
+
+@example
+(require 'evil)
+(evil-mode 1)
+@end example
+
+@node Manual installation,Modes and states,Installation via package el,Overview
+@anchor{overview manual-installation}@anchor{45}
+@section Manual installation
+
+
+First, install @cite{undo-tree}, @cite{goto-chg} and @cite{cl-lib}. If you have an
+Emacs version of 24.3 or newer, you should already have @cite{cl-lib}.
+
+Evil lives in a git repository. To download Evil, do:
+
+@example
+git clone --depth 1 https://github.com/emacs-evil/evil.git
+@end example
+
+Then add the following lines to your Emacs init file:
+
+@example
+(add-to-list 'load-path "path/to/evil")
+(require 'evil)
+(evil-mode 1)
+@end example
+
+Ensure that your replace @code{path/to/evil} with the actual path to
+where you cloned Evil.
+
+@node Modes and states,,Manual installation,Overview
+@anchor{overview modes-and-states}@anchor{46}
+@section Modes and states
+
+
+The next time Emacs is started, it will come up in @emph{normal state},
+denoted by @code{<N>} in the mode line. This is where the main vi
+bindings are defined. Note that you can always disable normal state
+with @code{C-z}, which switches to an “Emacs state†(denoted by
+@code{<E>}) in which vi keys are completely disabled. Press @code{C-z}
+again to switch back to normal state.
+
+
+@table @asis
+
+@item state
+
+Evil uses the term @emph{state} for what is called a “mode†in regular vi
+usage, because @emph{modes} are understood in Emacs terms to mean
+something else.
+@end table
+
+Evil defines a number of states by default:
+
+
+@table @asis
+
+@item normal state (@code{<N>})
+
+This is the default “resting state†of Evil, in which the main body
+of vi bindings are defined.
+
+@item insert state (@code{<I>})
+
+This is the state for insertion of text, where non-modified keys
+will insert the corresponding character in the buffer.
+
+@item visual state (@code{<V>})
+
+A state for selecting text regions. Motions are available for
+modifying the selected region, and operators are available for
+acting on it.
+
+@item replace state (@code{<R>})
+
+A special state mostly similar to insert state, except it replaces
+text instead of inserting.
+
+@item operator-pending state (@code{<O>})
+
+A special state entered after launching an operator, but before
+specifying the corresponding motion or text object.
+
+@item motion state (@code{<M>})
+
+A special state useful for buffers that are read-only, where motions
+are available but editing operations are not.
+
+@item Emacs state (@code{<E>})
+
+A state that as closely as possible mimics default Emacs behaviour,
+by eliminating all vi bindings, except for @code{C-z}, to re-enter
+normal state.
+@end table
+
+@node Settings,Keymaps,Overview,Top
+@anchor{settings doc}@anchor{47}@anchor{settings settings}@anchor{48}
+@chapter Settings
+
+
+Evil’s behaviour can be adjusted by setting some variables. The list
+of all available variables and their current values can be inspected
+by doing:
+
+@example
+M-x customize-group RET evil RET
+@end example
+
+To change the value of a variable, you can use this interface, or add
+a @code{setq} form to your Emacs init file, preferably before Evil is
+loaded. @footnote{@w{(1)}
+Strictly speaking, the order only matters if the variable
+affects the way Evil is loaded. This is the case with some
+variables.
+}
+
+@example
+(setq evil-shift-width 0)
+;; Load Evil
+(require 'evil)
+@end example
+
+What follows is a non-exhaustive list of the most relevant
+customization options.
+
+@menu
+* The initial state::
+* Keybindings and other behaviour::
+* Search::
+* Indentation::
+* Cursor movement::
+* Cursor display::
+* Window management::
+* Parenthesis highlighting::
+* Miscellaneous::
+
+@end menu
+
+@node The initial state,Keybindings and other behaviour,,Settings
+@anchor{settings the-initial-state}@anchor{49}
+@section The initial state
+
+
+The initial state of a buffer is determined by its major mode. Evil
+maintains an association between major modes and their corresponding
+states, which is most easily modified using the function
+@ref{2f,,evil-set-initial-state}.
+
+@anchor{settings elispobj-evil-set-initial-state}@anchor{2f}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}set@w{-}initial@w{-}state MODE STATE)
+
+Set the initial state for major mode @emph{MODE} to @emph{STATE}.
+This is the state the buffer comes up in.
+@end deffn
+
+If no state can be found, Evil uses the default initial state.
+
+@anchor{settings elispobj-evil-default-state}@anchor{d}
+@deffn {Emacs Lisp Autovariable} evil@w{-}default@w{-}state
+
+The default Evil state.
+This is the state a buffer starts in when it is not otherwise
+configured (see @ref{2f,,evil-set-initial-state} and
+@ref{5,,evil-buffer-regexps}). The value may be one of @code{normal},
+@code{insert}, @code{visual}, @code{replace}, @code{operator}, @code{motion} and @code{emacs}.
+
+Default: @code{normal}
+@end deffn
+
+Alternatively, it is possible to select the initial state based on the
+buffer @emph{name} rather than its major mode. This is checked first, so
+it takes precedence over the other methods for setting the state.
+
+@anchor{settings elispobj-evil-buffer-regexps}@anchor{5}
+@deffn {Emacs Lisp Autovariable} evil@w{-}buffer@w{-}regexps
+
+Regular expressions determining the initial state for a buffer.
+Entries have the form @code{(REGEXP . STATE)}, where @emph{REGEXP} is a regular
+expression matching the buffer’s name and @emph{STATE} is one of @code{normal},
+@code{insert}, @code{visual}, @code{replace}, @code{operator}, @code{motion}, @code{emacs} and
+@code{nil}. If @emph{STATE} is @code{nil}, Evil is disabled in the buffer.
+
+Default: @code{(("^ \\*load\\*"))}
+@end deffn
+
+@node Keybindings and other behaviour,Search,The initial state,Settings
+@anchor{settings keybindings-and-other-behaviour}@anchor{4a}
+@section Keybindings and other behaviour
+
+
+Evil comes with a rich system for modifying its key bindings
+@ref{4b,,Keymaps}. For the most common tweaks, the following
+variables are available.
+
+@anchor{settings elispobj-evil-toggle-key}@anchor{35}
+@deffn {Emacs Lisp Autovariable} evil@w{-}toggle@w{-}key
+
+The key used to change to and from Emacs state.
+Must be readable by @code{read-kbd-macro}. For example: “C-zâ€.
+
+Default: @code{"C-z"}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-i-jump}@anchor{39}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}i@w{-}jump
+
+Whether @code{C-i} jumps forward in the jump list (like Vim).
+Otherwise, @code{C-i} inserts a tab character.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-u-delete}@anchor{3a}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}u@w{-}delete
+
+Whether @code{C-u} deletes back to indentation in insert state.
+Otherwise, @code{C-u} applies a prefix argument. The binding of
+@code{C-u} mirrors Emacs behaviour by default due to the relative
+ubiquity of prefix arguments.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-u-scroll}@anchor{3b}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}u@w{-}scroll
+
+Whether @code{C-u} scrolls up (like Vim).
+Otherwise, @code{C-u} applies a prefix argument. The binding of
+@code{C-u} mirrors Emacs behaviour by default due to the relative
+ubiquity of prefix arguments.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-d-scroll}@anchor{38}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}d@w{-}scroll
+
+Whether @code{C-d} scrolls down (like Vim).
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-w-delete}@anchor{3c}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}w@w{-}delete
+
+Whether @code{C-w} deletes a word in Insert state.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-w-in-emacs-state}@anchor{3d}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}w@w{-}in@w{-}emacs@w{-}state
+
+Whether @code{C-w} prefixes windows commands in Emacs state.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-want-Y-yank-to-eol}@anchor{3f}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}Y@w{-}yank@w{-}to@w{-}eol
+
+Whether @code{Y} yanks to the end of the line.
+The default behavior is to yank the whole line, like Vim.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-disable-insert-state-bindings}@anchor{15}
+@deffn {Emacs Lisp Autovariable} evil@w{-}disable@w{-}insert@w{-}state@w{-}bindings
+
+Whether insert state bindings should be used.
+Bindings for escape, delete and @ref{35,,evil-toggle-key} are always
+available. If this is non-nil, default Emacs bindings are by and
+large accessible in insert state.
+
+Default: @code{nil}
+@end deffn
+
+@node Search,Indentation,Keybindings and other behaviour,Settings
+@anchor{settings search}@anchor{4c}
+@section Search
+
+
+@anchor{settings elispobj-evil-regexp-search}@anchor{27}
+@deffn {Emacs Lisp Autovariable} evil@w{-}regexp@w{-}search
+
+Whether to use regular expressions for searching in @code{/} and @code{?}.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-search-wrap}@anchor{2a}
+@deffn {Emacs Lisp Autovariable} evil@w{-}search@w{-}wrap
+
+Whether search with @code{/} and @code{?} wraps around the buffer.
+If this is non-nil, search stops at the buffer boundaries.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-flash-delay}@anchor{19}
+@deffn {Emacs Lisp Autovariable} evil@w{-}flash@w{-}delay
+
+Time in seconds to flash search matches after @code{n} and @code{N}.
+
+Default: @code{2}
+@end deffn
+
+@anchor{settings elispobj-evil-ex-hl-update-delay}@anchor{18}
+@deffn {Emacs Lisp Autovariable} evil@w{-}ex@w{-}hl@w{-}update@w{-}delay
+
+Time in seconds of idle before updating search highlighting.
+Setting this to a period shorter than that of keyboard’s repeat
+rate allows highlights to update while scrolling.
+
+Default: @code{0.02}
+@end deffn
+
+@node Indentation,Cursor movement,Search,Settings
+@anchor{settings indentation}@anchor{4d}
+@section Indentation
+
+
+@anchor{settings elispobj-evil-auto-indent}@anchor{2}
+@deffn {Emacs Lisp Autovariable} evil@w{-}auto@w{-}indent
+
+Whether to auto-indent when opening lines with @code{o} and @code{O}.
+
+Default: @code{t}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-shift-width}@anchor{32}
+@deffn {Emacs Lisp Autovariable} evil@w{-}shift@w{-}width
+
+The number of columns by which a line is shifted.
+This applies to the shifting operators @code{>} and @code{<}.
+
+Default: @code{4}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-shift-round}@anchor{31}
+@deffn {Emacs Lisp Autovariable} evil@w{-}shift@w{-}round
+
+Whether shifting rounds to the nearest multiple.
+If non-nil, @code{>} and @code{<} adjust line
+indentation to the nearest multiple of @ref{32,,evil-shift-width}.
+
+Default: @code{t}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-indent-convert-tabs}@anchor{1e}
+@deffn {Emacs Lisp Autovariable} evil@w{-}indent@w{-}convert@w{-}tabs
+
+If non-nil, the @code{=} operator converts between leading tabs and spaces.
+Whether tabs are converted to spaces or vice versa depends on the
+value of @code{indent-tabs-mode}.
+
+Default: @code{t}
+@end deffn
+
+@node Cursor movement,Cursor display,Indentation,Settings
+@anchor{settings cursor-movement}@anchor{4e}
+@section Cursor movement
+
+
+In standard Emacs terms, the cursor is generally understood to be
+located between two characters. In Vim, and therefore also Evil, this
+is the case in insert state, but in other states the cursor is
+understood to be @emph{on} a character, and that this character is not a
+newline.
+
+Forcing this behaviour in Emacs is the source of some potentially
+surprising results (especially for traditional Emacs users—users
+used to Vim may find the default behavior to their satisfaction). Many
+of them can be tweaked using the following variables.
+
+@anchor{settings elispobj-evil-repeat-move-cursor}@anchor{28}
+@deffn {Emacs Lisp Autovariable} evil@w{-}repeat@w{-}move@w{-}cursor
+
+Whether repeating commands with @code{.} may move the cursor.
+If nil, the original cursor position is preserved, even if the command
+normally would have moved the cursor.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-move-cursor-back}@anchor{26}
+@deffn {Emacs Lisp Autovariable} evil@w{-}move@w{-}cursor@w{-}back
+
+Whether the cursor is moved backwards when exiting insert state.
+If non-nil, the cursor moves “backwards†when exiting insert state,
+so that it ends up on the character to the left. Otherwise it remains
+in place, on the character to the right.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-move-beyond-eol}@anchor{25}
+@deffn {Emacs Lisp Autovariable} evil@w{-}move@w{-}beyond@w{-}eol
+
+Whether the cursor can move past the end of the line.
+If non-nil, the cursor is allowed to move one character past the
+end of the line, as in Emacs.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-cross-lines}@anchor{7}
+@deffn {Emacs Lisp Autovariable} evil@w{-}cross@w{-}lines
+
+Whether horizontal motions may move to other lines. If non-nil,
+certain motions that conventionally operate in a single line may move
+the cursor to other lines. Otherwise, they are restricted to the
+current line. This applies to @code{h}, @code{SPC}, @code{f}, @code{F}, @code{t}, @code{T}, @code{~}.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-respect-visual-line-mode}@anchor{29}
+@deffn {Emacs Lisp Autovariable} evil@w{-}respect@w{-}visual@w{-}line@w{-}mode
+
+Whether movement commands respect @code{visual-line-mode}.
+If non-nil, @code{visual-line-mode} is generally respected when it is
+on. In this case, motions such as @code{j} and
+@code{k} navigate by visual lines (on the screen) rather
+than “physical†lines (defined by newline characters). If nil,
+the setting of @code{visual-line-mode} is ignored.
+
+This variable must be set before Evil is loaded.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-track-eol}@anchor{36}
+@deffn {Emacs Lisp Autovariable} evil@w{-}track@w{-}eol
+
+Whether @code{$} “sticks†the cursor to the end of the line.
+If non-nil, vertical motions after @code{$} maintain the cursor at the
+end of the line, even if the target line is longer. This is analogous
+to @code{track-eol}, but respects Evil’s interpretation of end-of-line.
+
+Default: @code{t}
+@end deffn
+
+@node Cursor display,Window management,Cursor movement,Settings
+@anchor{settings cursor-display}@anchor{4f}
+@section Cursor display
+
+
+A state may change the appearance of the cursor. Use the variable
+@ref{c,,evil-default-cursor} to set the default cursor, and the
+variables @code{evil-normal-state-cursor}, @code{evil-insert-state-cursor}
+etc. to set the cursors for specific states. The acceptable values
+for all of them are the same.
+
+@anchor{settings elispobj-evil-default-cursor}@anchor{c}
+@deffn {Emacs Lisp Autovariable} evil@w{-}default@w{-}cursor
+
+The default cursor.
+May be a cursor type as per @code{cursor-type}, a color string as passed
+to @code{set-cursor-color}, a zero-argument function for changing the
+cursor, or a list of the above.
+
+Default: @code{t}
+@end deffn
+
+@node Window management,Parenthesis highlighting,Cursor display,Settings
+@anchor{settings window-management}@anchor{50}
+@section Window management
+
+
+@anchor{settings elispobj-evil-auto-balance-windows}@anchor{1}
+@deffn {Emacs Lisp Autovariable} evil@w{-}auto@w{-}balance@w{-}windows
+
+If non-nil window creation and deletion trigger rebalancing.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-split-window-below}@anchor{34}
+@deffn {Emacs Lisp Autovariable} evil@w{-}split@w{-}window@w{-}below
+
+If non-nil split windows are created below.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-vsplit-window-right}@anchor{37}
+@deffn {Emacs Lisp Autovariable} evil@w{-}vsplit@w{-}window@w{-}right
+
+If non-nil vertically split windows with are created to the right.
+
+Default: @code{nil}
+@end deffn
+
+@node Parenthesis highlighting,Miscellaneous,Window management,Settings
+@anchor{settings parenthesis-highlighting}@anchor{51}
+@section Parenthesis highlighting
+
+
+These settings concern the integration between Evil and
+@code{show-paren-mode}. They take no effect if this mode is not enabled.
+
+@anchor{settings elispobj-evil-show-paren-range}@anchor{33}
+@deffn {Emacs Lisp Autovariable} evil@w{-}show@w{-}paren@w{-}range
+
+The minimal distance between point and a parenthesis
+which causes the parenthesis to be highlighted.
+
+Default: @code{0}
+@end deffn
+
+@anchor{settings elispobj-evil-highlight-closing-paren-at-point-states}@anchor{1d}
+@deffn {Emacs Lisp Autovariable} evil@w{-}highlight@w{-}closing@w{-}paren@w{-}at@w{-}point@w{-}states
+
+The states in which the closing parenthesis at point should be highlighted.
+All states listed here highlight the closing parenthesis at
+point (which is Vim’s default behavior). All others highlight the
+parenthesis before point (which is Emacs default behavior). If
+this list contains the symbol @code{not} then its meaning is inverted,
+i.e. all states listed here highlight the closing parenthesis
+before point.
+
+Default: @code{(not emacs insert replace)}
+@end deffn
+
+@node Miscellaneous,,Parenthesis highlighting,Settings
+@anchor{settings miscellaneous}@anchor{52}
+@section Miscellaneous
+
+
+@anchor{settings elispobj-evil-want-fine-undo}@anchor{3e}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}fine@w{-}undo
+
+Whether actions are undone in several steps.
+There are two possible choices: nil (“noâ€) means that all
+changes made during insert state, including a possible delete
+after a change operation, are collected in a single undo step.
+Non-nil (“yesâ€) means that undo steps are determined according
+to Emacs heuristics, and no attempt is made to aggregate changes.
+
+For backward compatibility purposes, the value @code{fine} is
+interpreted as @code{nil}. This option was removed because it did not
+work consistently.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-backspace-join-lines}@anchor{3}
+@deffn {Emacs Lisp Autovariable} evil@w{-}backspace@w{-}join@w{-}lines
+
+Whether backward delete in insert state may join lines.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-kbd-macro-suppress-motion-error}@anchor{20}
+@deffn {Emacs Lisp Autovariable} evil@w{-}kbd@w{-}macro@w{-}suppress@w{-}motion@w{-}error
+
+Whether left/right motions signal errors in keyboard macros.
+This variable only affects beginning-of-line or end-of-line errors
+regarding the motions @code{h} and @code{SPC}
+respectively. This may be desired since such errors cause macro
+definition or execution to be terminated. There are four
+possibilities:
+
+
+@itemize -
+
+@item
+@code{record}: errors are suppressed when recording macros, but not when
+replaying them.
+
+@item
+@code{replay}: errors are suppressed when replaying macros, but not when
+recording them.
+
+@item
+@code{t}: errors are suppressed in both cases.
+
+@item
+@code{nil}: errors are never suppressed.
+@end itemize
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-mode-line-format}@anchor{23}
+@deffn {Emacs Lisp Autovariable} evil@w{-}mode@w{-}line@w{-}format
+
+The position of the state tag in the mode line.
+If set to @code{before} or @code{after}, the tag is placed at the beginning
+or the end of the mode-line, respectively. If nil, there is no
+tag. Otherwise it should be a cons cell @code{(WHERE . WHICH)}, where
+@emph{WHERE} is either @code{before} or @code{after}, and @emph{WHICH} is a symbol in
+@code{mode-line-format}. The tag is then placed before or after that
+symbol, respectively.
+
+Default: @code{before}
+@end deffn
+
+@anchor{settings elispobj-evil-mouse-word}@anchor{24}
+@deffn {Emacs Lisp Autovariable} evil@w{-}mouse@w{-}word
+
+The @emph{thing-at-point} symbol for double click selection.
+The double-click starts visual state in a special word selection
+mode. This symbol is used to determine the words to be
+selected. Possible values are @code{evil-word} or @code{evil-WORD}.
+
+Default: @code{evil-word}
+@end deffn
+
+@anchor{settings elispobj-evil-bigword}@anchor{4}
+@deffn {Emacs Lisp Autovariable} evil@w{-}bigword
+
+The set of characters to be interpreted as WORD boundaries.
+This is enclosed with square brackets and used as a regular
+expression. By default, whitespace characters are considered
+WORD boundaries.
+
+Default: @code{"^ \t\r\n"}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-esc-delay}@anchor{17}
+@deffn {Emacs Lisp Autovariable} evil@w{-}esc@w{-}delay
+
+The time, in seconds, to wait for another key after escape.
+If no further event arrives during this time, the event is
+translated to @code{ESC}. Otherwise, it is translated according to
+@code{input-decode-map}. This does not apply in Emacs state, and may
+also be inhibited by setting @code{evil-inhibit-esc}.
+
+Default: @code{0.01}
+@end deffn
+
+@anchor{settings elispobj-evil-intercept-esc}@anchor{1f}
+@deffn {Emacs Lisp Autovariable} evil@w{-}intercept@w{-}esc
+
+Whether Evil should intercept the escape key.
+In the terminal, escape and a meta key sequence both generate the
+same event. In order to distingush these, Evil uses
+@code{input-decode-map}. It is not necessary to do this in a graphical
+Emacs session. However, if you prefer to use @code{C-[} as escape (which
+is identical to the terminal escape key code), this interception must
+also happen in graphical Emacs sessions. Set this variable to
+@code{always}, t (only in the terminal) or nil (never intercept).
+
+Default: @code{always}
+@end deffn
+
+@anchor{settings elispobj-evil-kill-on-visual-paste}@anchor{21}
+@deffn {Emacs Lisp Autovariable} evil@w{-}kill@w{-}on@w{-}visual@w{-}paste
+
+Whether pasting in visual state adds the replaced text to the
+kill ring, making it the default for the next paste. The default,
+replicates the default Vim behavior.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-echo-state}@anchor{16}
+@deffn {Emacs Lisp Autovariable} evil@w{-}echo@w{-}state
+
+Whether to signal the current state in the echo area.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-complete-all-buffers}@anchor{6}
+@deffn {Emacs Lisp Autovariable} evil@w{-}complete@w{-}all@w{-}buffers
+
+Whether completion looks for matches in all buffers.
+This applies to @code{C-n} and @code{C-p} in insert state.
+
+Default: @code{t}
+@end deffn
+
+@node Keymaps,Hooks,Settings,Top
+@anchor{keymaps doc}@anchor{53}@anchor{keymaps chapter-keymaps}@anchor{4b}@anchor{keymaps keymaps}@anchor{54}
+@chapter Keymaps
+
+
+Evil’s key bindings are stored in a number of different keymaps. Each
+state has a @emph{global keymap}, where the default bindings for that state
+are stored. They are named @code{evil-normal-state-map},
+@code{evil-insert-state-map}, and so on. The bindings in these maps are
+visible in all buffers currently in the corresponding state.
+
+These keymaps function like ordinary Emacs keymaps and may be modified
+using the Emacs function @code{define-key}:
+
+@example
+(define-key evil-normal-state-map (kbd "w") 'some-function)
+@end example
+
+This binds the key @code{w} to the command @code{some-function} in normal
+state. The use of @code{kbd} is optional for simple key sequences, like
+this one, but recommended in general.
+
+Most of Evil’s bindings are defined in the file @code{evil-maps.el}.
+
+To facilitate shared keybindings between states, some states may
+activate keybindings from other states as well. For example, motion
+state bindings are visible in normal and visual state, and normal
+state bindings are also visible in visual state.
+
+Each state also has a @emph{buffer-local keymap} which is specific to the
+current buffer, and which takes precedence over the global keymap.
+These maps are most suitably modified by a mode hook. They are named
+@code{evil-normal-state-local-map}, @code{evil-insert-state-local-map}, and
+so on.
+
+@example
+(add-hook 'some-mode-hook
+ (lambda ()
+ (define-key evil-normal-state-local-map
+ (kbd "w") 'some-function)))
+@end example
+
+For convenience, the functions @ref{1c,,evil-global-set-key} and
+@ref{22,,evil-local-set-key} are available for setting global and
+local state keys.
+
+@anchor{keymaps elispobj-evil-global-set-key}@anchor{1c}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}global@w{-}set@w{-}key STATE KEY DEF)
+
+Bind @emph{KEY} to @emph{DEF} in @emph{STATE}.
+@end deffn
+
+@anchor{keymaps elispobj-evil-local-set-key}@anchor{22}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}local@w{-}set@w{-}key STATE KEY DEF)
+
+Bind @emph{KEY} to @emph{DEF} in @emph{STATE} in the current buffer.
+@end deffn
+
+The above examples could therefore have been written as follows:
+
+@example
+(evil-global-set-key 'normal (kbd "w") 'some-function)
+
+(add-hook 'some-mode-hook
+ (lambda ()
+ (evil-local-set-key 'normal (kbd "w") 'some-function)))
+@end example
+
+@menu
+* evil-define-key::
+* Leader keys::
+
+@end menu
+
+@node evil-define-key,Leader keys,,Keymaps
+@anchor{keymaps evil-define-key}@anchor{55}
+@section evil-define-key
+
+
+Evil provides the macro @ref{f,,evil-define-key} for adding state
+bindings to ordinary keymaps. It is quite powerful, and is the
+preferred method for fine-tuning bindings to activate in specific
+circumstances.
+
+@anchor{keymaps elispobj-evil-define-key}@anchor{f}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}key STATE KEYMAP KEY DEF [BINDINGS...])
+
+Create a @emph{STATE} binding from @emph{KEY} to @emph{DEF} for @emph{KEYMAP}.
+@emph{STATE} is one of @code{normal}, @code{insert}, @code{visual}, @code{replace},
+@code{operator}, @code{motion}, @code{emacs}, or a list of one or more of
+these. Omitting a state by using @code{nil} corresponds to a standard
+Emacs binding using @code{define-key}. The remaining arguments are
+like those of @code{define-key}. For example:
+
+@example
+(evil-define-key 'normal foo-map "a" 'bar)
+@end example
+
+This creates a binding from @code{a} to @code{bar} in normal state, which
+is active whenever @code{foo-map} is active. Using nil for the state,
+the following lead to identical bindings:
+
+@example
+(evil-define-key nil foo-map "a" 'bar)
+(define-key foo-map "a" 'bar)
+@end example
+
+It is possible to specify multiple states and/or bindings at
+once:
+
+@example
+(evil-define-key '(normal visual) foo-map
+ "a" 'bar
+ "b" 'foo)
+@end example
+
+If @code{foo-map} has not been initialized yet, this macro adds an
+entry to @code{after-load-functions}, delaying execution as necessary.
+
+@emph{KEYMAP} may also be a quoted symbol. If the symbol is @code{global}, the
+global evil keymap corresponding to the state(s) is used, meaning
+the following lead to identical bindings:
+
+@example
+(evil-define-key 'normal 'global "a" 'bar)
+(evil-global-set-key 'normal "a" 'bar)
+@end example
+
+The symbol @code{local} may also be used, which corresponds to using
+@ref{22,,evil-local-set-key}. If a quoted symbol is used that is not
+@code{global} or @code{local}, it is assumed to be the name of a minor
+mode, in which case @code{evil-define-minor-mode-key} is used.
+@end deffn
+
+There follows a brief overview of the main functions of this macro.
+
+
+@itemize -
+
+@item
+Define a binding in a given state
+
+@example
+(evil-define-key 'state 'global (kbd "key") 'target)
+@end example
+
+@item
+Define a binding in a given state in the current buffer
+
+@example
+(evil-define-key 'state 'local (kbd "key") 'target)
+@end example
+
+@item
+Define a binding in a given state under the @emph{foo-mode} major mode.
+
+@example
+(evil-define-key 'state foo-mode-map (kbd "key") 'target)
+@end example
+
+Note that @code{foo-mode-map} is unquoted, and that this form is safe
+before @code{foo-mode-map} is loaded.
+
+@item
+Define a binding in a given state under the @emph{bar-mode} minor mode.
+
+@example
+(evil-define-key 'state 'bar-mode (kbd "key") 'target)
+@end example
+
+Note that @code{bar-mode} is quoted, and that this form is safe before
+@code{bar-mode} is loaded.
+@end itemize
+
+The macro @ref{f,,evil-define-key} can be used to augment existing
+modes with state bindings, as well as creating packages with custom
+bindings. For example, the following will create a minor mode
+@code{foo-mode} with normal state bindings for the keys @code{w} and
+@code{e}:
+
+@example
+(define-minor-mode foo-mode
+ "Foo mode."
+ :keymap (make-sparse-keymap))
+
+(evil-define-key 'normal 'foo-mode "w" 'bar)
+(evil-define-key 'normal 'foo-mode "e" 'baz)
+@end example
+
+This minor mode can then be enabled in any buffers where the custom
+bindings are desired:
+
+@example
+(add-hook 'text-mode-hook 'foo-mode) ; enable alongside text-mode
+@end example
+
+@node Leader keys,,evil-define-key,Keymaps
+@anchor{keymaps leader-keys}@anchor{56}
+@section Leader keys
+
+
+Evil supports a simple implementation of Vim’s @emph{leader} keys. To bind
+a function to a leader key you can use the expression @code{<leader>} in
+a key mapping, e.g.
+
+@example
+(evil-define-key 'normal 'global (kbd "<leader>fs") 'save-buffer)
+@end example
+
+Likewise, you can use the expression @code{<localleader>} to mimic Vim’s
+local leader, which is designed for mode-specific key bindings.
+
+You can use the function @ref{30,,evil-set-leader} to designate
+which key acts as the leader and the local leader.
+
+@anchor{keymaps elispobj-evil-set-leader}@anchor{30}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}set@w{-}leader STATE KEY [LOCALLEADER])
+
+Set @emph{KEY} to trigger leader bindings in @emph{STATE}.
+@emph{KEY} should be in the form produced by @code{kbd}. @emph{STATE} is one of
+@code{normal}, @code{insert}, @code{visual}, @code{replace}, @code{operator}, @code{motion},
+@code{emacs}, a list of one or more of these, or @code{nil}, which means
+all of the above. If @emph{LOCALLEADER} is non-nil, set the local leader
+instead.
+@end deffn
+
+@node Hooks,Extension,Keymaps,Top
+@anchor{hooks doc}@anchor{57}@anchor{hooks hooks}@anchor{58}
+@chapter Hooks
+
+
+A @emph{hook} is a list of functions that are executed when certain events
+happen. Hooks are modified with the Emacs function @code{add-hook}.
+Evil provides entry and exit hooks for all its states. For example,
+when switching from normal state to insert state, all functions in
+@code{evil-normal-state-exit-hook} and @code{evil-insert-state-entry-hook}
+are executed.
+
+It is guaranteed that the exit hook will be executed before the entry
+hook on all state switches.
+
+During the hook execution, the variables @code{evil-next-state} and
+@code{evil-previous-state} contain information about the states being
+switched to and from, respectively.
+
+@node Extension,Frequently Asked Questions,Hooks,Top
+@anchor{extension doc}@anchor{59}@anchor{extension extension}@anchor{5a}
+@chapter Extension
+
+
+The main functionality of Evil is implemented in terms of reusable
+macros. Package writers can use these to define new commands.
+
+@menu
+* Motions::
+* Operators::
+* Text objects::
+* Range types::
+* States::
+
+@end menu
+
+@node Motions,Operators,,Extension
+@anchor{extension motions}@anchor{5b}
+@section Motions
+
+
+A @emph{motion} is a command which moves the cursor, such as @code{w} or
+@code{e}. Motions are defined with the macro
+@ref{10,,evil-define-motion}. Motions not defined in this way
+should be declared with @ref{9,,evil-declare-motion}.
+
+@anchor{extension elispobj-evil-declare-motion}@anchor{9}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}motion COMMAND)
+
+Declare @emph{COMMAND} to be a movement function.
+This ensures that it behaves correctly in visual state.
+@end deffn
+
+@anchor{extension elispobj-evil-define-motion}@anchor{10}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}motion MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)
+
+Define a motion command @emph{MOTION}.
+@emph{ARGS} is a list of arguments. Motions can have any number of
+arguments, but the first (if any) has the predefined meaning of
+count. @emph{BODY} must execute the motion by moving point.
+
+Optional keyword arguments are:
+
+
+@itemize -
+
+@item
+@code{:type} - determines how the motion works after an operator (one of
+@code{inclusive}, @code{line}, @code{block} and @code{exclusive}, or a self-defined
+motion type)
+
+@item
+@code{:jump} - if non-nil, the previous position is stored in the jump
+list, so that it can be restored with @code{C-o}
+@end itemize
+@end deffn
+
+For example, this is a motion that moves the cursor forward by a
+number of characters:
+
+@example
+(evil-define-motion foo-forward (count)
+ "Move to the right by COUNT characters."
+ :type inclusive
+ (forward-char (or count 1)))
+@end example
+
+The @emph{type} of a motion determines how it works when used together with
+an operator. Inclusive motions include the endpoint in the range
+being operated on, while exclusive motions do not. Line motions
+extend the whole range to linewise positions, effectively behaving as
+if the endpoint were really at the end of the line. Blockwise ranges
+behave as a “rectangle†on screen rather than a contiguous range of
+characters.
+
+@node Operators,Text objects,Motions,Extension
+@anchor{extension operators}@anchor{5c}
+@section Operators
+
+
+An operator is a command that acts on the text moved over by a motion,
+such as @code{c} (change), @code{d} (delete) or @code{y} (yank or
+copy, not to be confused with “yank†in Emacs terminology which means
+@emph{paste}).
+
+@anchor{extension elispobj-evil-define-operator}@anchor{11}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}operator OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)
+
+Define an operator command @emph{OPERATOR}.
+The operator acts on the range of characters @emph{BEG} through
+@emph{END}. @emph{BODY} must execute the operator by potentially manipulating
+the buffer contents, or otherwise causing side effects to happen.
+
+Optional keyword arguments are:
+
+
+@itemize -
+
+@item
+@code{:type} - force the input range to be of a given type (@code{inclusive},
+@code{line}, @code{block}, and @code{exclusive}, or a self-defined motion type).
+
+@item
+@code{:motion} - use a predetermined motion instead of waiting for one
+from the keyboard. This does not affect the behavior in visual
+state, where selection boundaries are always used.
+
+@item
+@code{:repeat} - if non-nil (default), then @code{.} will repeat the
+operator.
+
+@item
+@code{:move-point} - if non-nil (default), the cursor will be moved to
+the beginning of the range before the body executes
+
+@item
+@code{:keep-visual} - if non-nil, the selection is not disabled when the
+operator is executed in visual state. By default, visual state is
+exited automatically.
+@end itemize
+@end deffn
+
+For example, this is an operator that performs ROT13 encryption on the
+text under consideration:
+
+@example
+(evil-define-operator evil-rot13 (beg end)
+ "ROT13 encrypt text."
+ (rot13-region beg end))
+@end example
+
+Binding this to @code{g?} (where it is by default) will cause a key
+sequence such as @code{g?w} to encrypt from the current cursor to the
+end of the word.
+
+@node Text objects,Range types,Operators,Extension
+@anchor{extension text-objects}@anchor{5d}
+@section Text objects
+
+
+Text objects are like motions in that they define a range over which
+an operator may act. Unlike motions, text objects can set both a
+beginning and an endpoint. In visual state, text objects alter both
+ends of the selection.
+
+Text objects are not directly usable in normal state. Instead, they
+are bound in the two keymaps @code{evil-inner-text-ojects-map} and
+@code{evil-outer-text-objects-map}, which are available in visual and
+operator-pending state under the keys @code{i} and @code{a}
+respectively.
+
+@anchor{extension elispobj-evil-define-text-object}@anchor{13}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}text@w{-}object OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)
+
+Define a text object command @emph{OBJECT}.
+@emph{BODY} should return a range @code{(BEG END)} to the right of point
+if @emph{COUNT} is positive, and to the left of it if negative.
+
+Optional keyword arguments:
+
+
+@itemize -
+
+@item
+@code{:type} - determines how the range applies after an operator
+(@code{inclusive}, @code{line}, @code{block}, and @code{exclusive}, or a self-defined
+motion type).
+
+@item
+@code{:extend-selection} - if non-nil (default), the text object always
+enlarges the current selection. Otherwise, it replaces the current
+selection.
+@end itemize
+@end deffn
+
+For eample, this is a text object which selects the next three
+characters after the current location:
+
+@example
+(evil-define-text-object foo (count)
+ "Select three characters."
+ (list (point) (+ 3 (point))))
+@end example
+
+For convenience, Evil provides several functions returning a list of
+positions which can be used for defining text objects. All of them
+follow the convention that a positive @emph{count} selects text after the
+current location, while negative @emph{count} selects text before it.
+
+@cartouche
+@quotation Note
+The @emph{thingatpt} library is used quite extensively in Evil to define
+text objects, and this dependency leaks through in the following
+functions. A @emph{thing} in this context is any symbol for which there
+is a function called @code{forward-THING} @footnote{@w{(1)}
+There are many more ways that a @emph{thing} can be defined,
+but the definition of @code{forward-THING} is perhaps the most
+straightforward way to go about it.
+} which moves past a
+number of @emph{things}.
+@end quotation
+@end cartouche
+
+@anchor{extension elispobj-evil-select-inner-object}@anchor{2c}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}select@w{-}inner@w{-}object THING BEG END TYPE [COUNT LINE])
+
+Return an inner text object range of @emph{COUNT} objects.
+If @emph{COUNT} is positive, return objects following point; if @emph{COUNT} is
+negative, return objects preceding point. If one is unspecified,
+the other is used with a negative argument. @emph{THING} is a symbol
+understood by @emph{thing-at-point}. @emph{BEG}, @emph{END} and @emph{TYPE} specify the
+current selection. If @emph{LINE} is non-nil, the text object should be
+linewise, otherwise it is character wise.
+@end deffn
+
+@anchor{extension elispobj-evil-select-an-object}@anchor{2b}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}select@w{-}an@w{-}object THING BEG END TYPE COUNT [LINE])
+
+Return an outer text object range of @emph{COUNT} objects.
+If @emph{COUNT} is positive, return objects following point; if @emph{COUNT} is
+negative, return objects preceding point. If one is unspecified,
+the other is used with a negative argument. @emph{THING} is a symbol
+understood by @emph{thing-at-point}. @emph{BEG}, @emph{END} and @emph{TYPE} specify the
+current selection. If @emph{LINE} is non-nil, the text object should be
+linewise, otherwise it is character wise.
+@end deffn
+
+@anchor{extension elispobj-evil-select-paren}@anchor{2d}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}select@w{-}paren OPEN CLOSE BEG END TYPE COUNT [INCLUSIVE])
+
+Return a range @code{(BEG END)} of @emph{COUNT} delimited text objects.
+@emph{OPEN} and @emph{CLOSE} specify the opening and closing delimiter,
+respectively. @emph{BEG} @emph{END} @emph{TYPE} are the currently selected (visual)
+range. If @emph{INCLUSIVE} is non-nil, @emph{OPEN} and @emph{CLOSE} are included in
+the range; otherwise they are excluded.
+
+The types of @emph{OPEN} and @emph{CLOSE} specify which kind of THING is used
+for parsing with @code{evil-select-block}. If @emph{OPEN} and @emph{CLOSE} are
+characters @code{evil-up-paren} is used. Otherwise @emph{OPEN} and @emph{CLOSE}
+must be regular expressions and @code{evil-up-block} is used.
+
+If the selection is exclusive, whitespace at the end or at the
+beginning of the selection until the end-of-line or beginning-of-line
+is ignored.
+@end deffn
+
+@node Range types,States,Text objects,Extension
+@anchor{extension range-types}@anchor{5e}
+@section Range types
+
+
+A @emph{type} is a transformation acting on a pair of buffer positions.
+Evil defines the types @code{inclusive}, @code{line}, @code{block} and
+@code{exclusive}, which are used for motion ranges and visual selection.
+New types may be defined with the macro @emph{evil-define-type}.
+
+@anchor{extension elispobj-evil-define-type}@anchor{14}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}type TYPE DOC [[KEY FUNC]...])
+
+Define type @emph{TYPE}.
+@emph{DOC} is a general description and shows up in all docstrings.
+
+Optional keyword arguments:
+
+
+@itemize -
+
+@item
+@code{:expand} - expansion function. This function should accept two
+positions in the current buffer, BEG and END,and return a pair of
+expanded buffer positions.
+
+@item
+@code{:contract} - the opposite of @code{:expand}. Optional.
+
+@item
+@code{:one-to-one} - non-nil if expansion is one-to-one. This means that
+@code{:expand} followed by @code{:contract} always return the original range.
+
+@item
+@code{:normalize} - normalization function. This function should accept
+two unexpanded positions and adjust them before expansion. May be
+used to deal with buffer boundaries.
+
+@item
+@code{:string} - description function. Takes two buffer positions and
+returns a human-readable string. For example “2 linesâ€
+@end itemize
+
+If further keywords and functions are specified, they are assumed to
+be transformations on buffer positions, like @code{:expand} and @code{:contract}.
+@end deffn
+
+@node States,,Range types,Extension
+@anchor{extension states}@anchor{5f}
+@section States
+
+
+States are defined with the macro @ref{12,,evil-define-state},
+which takes care to define the necessary hooks, keymaps and variables,
+as well as a toggle function @code{evil-NAME-state} and a predicate
+function @code{evil-NAME-state-p} for checking whether the state is
+active.
+
+@anchor{extension elispobj-evil-define-state}@anchor{12}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}state STATE DOC [[KEY VAL]...] BODY...)
+
+Define an Evil state @emph{STATE}.
+@emph{DOC} is a general description and shows up in all docstrings;
+the first line of the string should be the full name of the state.
+
+@emph{BODY} is executed each time the state is enabled or disabled.
+
+Optional keyword arguments:
+
+
+@itemize -
+
+@item
+@code{:tag} - the mode line indicator, e.g. “<T>â€.
+
+@item
+@code{:message} - string shown in the echo area when the state is
+activated.
+
+@item
+@code{:cursor} - default cursor specification.
+
+@item
+@code{:enable} - list of other state keymaps to enable when in this
+state.
+
+@item
+@code{:entry-hook} - list of functions to run when entering this state.
+
+@item
+@code{:exit-hook} - list of functions to run when exiting this state.
+
+@item
+@code{:suppress-keymap} - if non-nil, effectively disables bindings to
+@code{self-insert-command} by making @code{evil-suppress-map} the parent of
+the global state keymap.
+@end itemize
+
+The global keymap of this state will be @code{evil-test-state-map},
+the local keymap will be @code{evil-test-state-local-map}, and so on.
+@end deffn
+
+For example:
+
+@example
+(evil-define-state test
+ "Test state."
+ :tag " <T> "
+ (message (if (evil-test-state-p)
+ "Enabling test state."
+ "Disabling test state.")))
+@end example
+
+@node Frequently Asked Questions,Internals,Extension,Top
+@anchor{faq doc}@anchor{60}@anchor{faq frequently-asked-questions}@anchor{61}
+@chapter Frequently Asked Questions
+
+
+@menu
+* Problems with the escape key in the terminal::
+* Underscore is not a word character::
+
+@end menu
+
+@node Problems with the escape key in the terminal,Underscore is not a word character,,Frequently Asked Questions
+@anchor{faq problems-with-the-escape-key-in-the-terminal}@anchor{62}
+@section Problems with the escape key in the terminal
+
+
+A common problem when using Evil in terminal mode is a certain delay
+after pressing the escape key. Even more, when pressing the escape key
+followed quickly by another key the command is recognized as
+@code{M-<key>} instead of two separate keys: @code{ESC} followed by
+@code{<key>}. In fact, it is perfectly valid to simulate
+@code{M-<key>} by pressing @code{ESC <key>} quickly (but see below).
+
+The reason for this is that in terminal mode a key sequence involving
+the meta key (or alt key) always generates a so called “escape
+sequenceâ€, i.e. a sequence of two events sent to Emacs, the first
+being @code{ESC} and the second the key pressed simultaneously. The
+problem is that pressing the escape key itself also generates the
+@code{ESC} event. Thus, if Emacs (and therefore Evil) receives an
+@code{ESC} event there is no way to tell whether the escape key has
+been pressed (and no further event will arrive) or a @code{M-<key>}
+combination has been pressed (and the @code{<key>} event will arrive
+soon). In order to distinguish both situations Evil does the
+following. After receiving an @code{ESC} event Evil waits for a short
+time period (specified by the variable @ref{17,,evil-esc-delay}
+which defaults to 0.01 seconds) for another event. If no other event
+arrives Evil assumes that the plain escape key has been pressed,
+otherwise it assumes a @code{M-<key>} combination has been pressed and
+combines the @code{ESC} event with the second one. Because a
+@code{M-<key>} sequence usually generates both events in very quick
+succession, 0.01 seconds are usually enough and the delay is hardly
+noticeable by the user.
+
+If you use a terminal multiplexer like @emph{tmux} or @emph{screen} the
+situation may be worse. These multiplexers have exactly the same
+problem recognizing @code{M-<key>} sequences and often introduce their
+own delay for the @code{ESC} key. There is no way for Evil to
+influence this delay. In order to reduce it you must reconfigure your
+terminal multiplexer.
+
+Note that this problem should not arise when using Evil in graphical
+mode. The reason is that in this case the escape key itself generates
+a different command, namely @code{escape} (a symbol) and hence Evil can
+distinguish whether the escape key or a @code{M-<key>} combination has
+been pressed. But this also implies that pressing @code{ESC} followed
+by <key> cannot be used to simulate @code{M-<key>} in graphical mode!
+
+@node Underscore is not a word character,,Problems with the escape key in the terminal,Frequently Asked Questions
+@anchor{faq underscore-is-not-a-word-character}@anchor{63}
+@section Underscore is not a word character
+
+
+An underscore @code{_} is a word character in Vim. This means that word
+motions like @code{w} skip over underlines in a sequence of letters as
+if it was a letter itself. In contrast, in Evil the underscore is
+often a non-word character like operators, e.g. @code{+}.
+
+The reason is that Evil uses Emacs’ definition of a word and this
+definition does often not include the underscore. In Emacs word
+characters are determined by the syntax-class of the buffer. The
+syntax-class usually depends on the major-mode of this buffer. This
+has the advantage that the definition of a “word†may be adapted to
+the particular type of document being edited. Evil uses Emacs’
+definition and does not simply use Vim’s definition in order to be
+consistent with other Emacs functions. For example, word characters
+are exactly those characters that are matched by the regular
+expression character class @code{[:word:]}.
+
+If you want the underscore to be recognised as word character, you can
+modify its entry in the syntax-table:
+
+@example
+(modify-syntax-entry ?_ "w")
+@end example
+
+This gives the underscore the ‘word’ syntax class. You can use a
+mode-hook to modify the syntax-table in all buffers of some mode,
+e.g.:
+
+@example
+(add-hook 'c-mode-common-hook
+ (lambda () (modify-syntax-entry ?_ "w")))
+@end example
+
+This gives the underscore the word syntax-class in all C-like buffers.
+
+Alternatively, many find that motion by @emph{symbols} is more convenient
+than motion by @emph{words}. One way to make word motions operate as
+symbol motions is to alias the @code{evil-word} @emph{thing} @footnote{@w{(1)}
+Many of Evil’s text objects and motions are defined in
+terms of the @emph{thingatpt} library, which in this case are defined
+entirely in terms of @code{forward-THING} functions. Thus aliasing
+one to another should make all motions and text objects implemented
+in terms of that @emph{thing} behave the same.
+} to
+the @code{evil-symbol} thing:
+
+@example
+(defalias 'forward-evil-word 'forward-evil-symbol)
+@end example
+
+@node Internals,The GNU Free Documentation License,Frequently Asked Questions,Top
+@anchor{internals doc}@anchor{64}@anchor{internals internals}@anchor{65}
+@chapter Internals
+
+
+@menu
+* Command properties::
+
+@end menu
+
+@node Command properties,,,Internals
+@anchor{internals command-properties}@anchor{66}
+@section Command properties
+
+
+Evil defines @emph{command properties} to store information about commands
+@footnote{@w{(1)}
+In this context, a @emph{command} may mean any Evil motion,
+text object, operator or indeed other Emacs commands, which have
+not been defined through the Evil machinery.
+}, such as whether they should be repeated. A command
+property is a @code{:keyword} with an associated value, e.g.
+@code{:repeat nil}.
+
+@anchor{internals elispobj-evil-add-command-properties}@anchor{0}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}add@w{-}command@w{-}properties COMMAND [PROPERTIES...])
+
+Add @emph{PROPERTIES} to @emph{COMMAND}.
+@emph{PROPERTIES} should be a property list.
+To replace all properties at once, use @ref{2e,,evil-set-command-properties}.
+@end deffn
+
+@anchor{internals elispobj-evil-set-command-properties}@anchor{2e}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}set@w{-}command@w{-}properties COMMAND [PROPERTIES...])
+
+Replace all of @emph{COMMAND}’s properties with @emph{PROPERTIES}.
+@emph{PROPERTIES} should be a property list.
+This erases all previous properties; to only add properties,
+use @code{evil-set-command-property}.
+@end deffn
+
+@anchor{internals elispobj-evil-get-command-properties}@anchor{1a}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}get@w{-}command@w{-}properties COMMAND)
+
+Return all Evil properties of @emph{COMMAND}.
+See also @ref{1b,,evil-get-command-property}.
+@end deffn
+
+@anchor{internals elispobj-evil-get-command-property}@anchor{1b}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}get@w{-}command@w{-}property COMMAND PROPERTY [DEFAULT])
+
+Return the value of Evil @emph{PROPERTY} of @emph{COMMAND}.
+If the command does not have the property, return @emph{DEFAULT}.
+See also @ref{1a,,evil-get-command-properties}.
+@end deffn
+
+@anchor{internals elispobj-evil-define-command}@anchor{e}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}command COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)
+
+Define a command @emph{COMMAND}.
+@end deffn
+
+For setting repeat properties, use the following functions:
+
+@anchor{internals elispobj-evil-declare-repeat}@anchor{b}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}repeat COMMAND)
+
+Declare @emph{COMMAND} to be repeatable.
+@end deffn
+
+@anchor{internals elispobj-evil-declare-not-repeat}@anchor{a}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}not@w{-}repeat COMMAND)
+
+Declare @emph{COMMAND} to be nonrepeatable.
+@end deffn
+
+@anchor{internals elispobj-evil-declare-change-repeat}@anchor{8}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}change@w{-}repeat COMMAND)
+
+Declare @emph{COMMAND} to be repeatable by buffer changes rather than
+keystrokes.
+@end deffn
+
+@node The GNU Free Documentation License,Emacs lisp functions and variables,Internals,Top
+@anchor{license doc}@anchor{67}@anchor{license the-gnu-free-documentation-license}@anchor{68}
+@chapter The GNU Free Documentation License
+
+
+Version 1.3, 3 November 2008
+
+@quotation
+
+Copyright (c) 2000, 2001, 2002, 2007, 2008 Free Software
+Foundation, Inc. @indicateurl{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of
+this license document, but changing it is not allowed.
+@end quotation
+
+
+@enumerate 0
+
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @emph{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or
+noncommercially. Secondarily, this License preserves for the
+author and publisher a way to get credit for their work, while not
+being considered responsible for modifications made by others.
+
+This License is a kind of “copyleftâ€, which means that derivative
+works of the document must themselves be free in the same sense.
+It complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for
+free software, because free software needs free documentation: a
+free program should come with manuals providing the same freedoms
+that the software does. But this License is not limited to
+software manuals; it can be used for any textual work, regardless
+of subject matter or whether it is published as a printed book. We
+recommend this License principally for works whose purpose is
+instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium,
+that contains a notice placed by the copyright holder saying it can
+be distributed under the terms of this License. Such a notice
+grants a world-wide, royalty-free license, unlimited in duration,
+to use that work under the conditions stated herein. The
+“Documentâ€, below, refers to any such manual or work. Any member
+of the public is a licensee, and is addressed as “youâ€. You accept
+the license if you copy, modify or distribute the work in a way
+requiring permission under copyright law.
+
+A “Modified Version†of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A “Secondary Section†is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document’s overall
+subject (or to related matters) and contains nothing that could
+fall directly within that overall subject. (Thus, if the Document
+is in part a textbook of mathematics, a Secondary Section may not
+explain any mathematics.) The relationship could be a matter of
+historical connection with the subject or with related matters, or
+of legal, commercial, philosophical, ethical or political position
+regarding them.
+
+The “Invariant Sections†are certain Secondary Sections whose
+titles are designated, as being those of Invariant Sections, in the
+notice that says that the Document is released under this License.
+If a section does not fit the above definition of Secondary then it
+is not allowed to be designated as Invariant. The Document may
+contain zero Invariant Sections. If the Document does not identify
+any Invariant Sections then there are none.
+
+The “Cover Texts†are certain short passages of text that are
+listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+that says that the Document is released under this License. A
+Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+be at most 25 words.
+
+A “Transparent†copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed
+of pixels) generic paint programs or (for drawings) some widely
+available drawing editor, and that is suitable for input to text
+formatters or for automatic translation to a variety of formats
+suitable for input to text formatters. A copy made in an otherwise
+Transparent file format whose markup, or absence of markup, has
+been arranged to thwart or discourage subsequent modification by
+readers is not Transparent. An image format is not Transparent if
+used for any substantial amount of text. A copy that is not
+“Transparent†is called “Opaqueâ€.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format,
+SGML or XML using a publicly available DTD, and standard-conforming
+simple HTML, PostScript or PDF designed for human modification.
+Examples of transparent image formats include PNG, XCF and JPG.
+Opaque formats include proprietary formats that can be read and
+edited only by proprietary word processors, SGML or XML for which
+the DTD and/or processing tools are not generally available, and
+the machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The “Title Page†means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the
+material this License requires to appear in the title page. For
+works in formats which do not have any title page as such, “Title
+Page†means the text near the most prominent appearance of the
+work’s title, preceding the beginning of the body of the text.
+
+The “publisher†means any person or entity that distributes copies
+of the Document to the public.
+
+A section “Entitled XYZ†means a named subunit of the Document
+whose title either is precisely XYZ or contains XYZ in parentheses
+following text that translates XYZ in another language. (Here XYZ
+stands for a specific section name mentioned below, such as
+“Acknowledgementsâ€, “Dedicationsâ€, “Endorsementsâ€, or “Historyâ€.)
+To “Preserve the Title†of such a section when you modify the
+Document means that it remains a section “Entitled XYZ†according
+to this definition.
+
+The Document may include Warranty Disclaimers next to the notice
+which states that this License applies to the Document. These
+Warranty Disclaimers are considered to be included by reference in
+this License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and
+has no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License
+applies to the Document are reproduced in all copies, and that you
+add no other conditions whatsoever to those of this License. You
+may not use technical measures to obstruct or control the reading
+or further copying of the copies you make or distribute. However,
+you may accept compensation in exchange for copies. If you
+distribute a large enough number of copies you must also follow the
+conditions in section 3.
+
+You may also lend copies, under the same conditions stated above,
+and you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly
+have printed covers) of the Document, numbering more than 100, and
+the Document’s license notice requires Cover Texts, you must
+enclose the copies in covers that carry, clearly and legibly, all
+these Cover Texts: Front-Cover Texts on the front cover, and
+Back-Cover Texts on the back cover. Both covers must also clearly
+and legibly identify you as the publisher of these copies. The
+front cover must present the full title with all words of the title
+equally prominent and visible. You may add other material on the
+covers in addition. Copying with changes limited to the covers, as
+long as they preserve the title of the Document and satisfy these
+conditions, can be treated as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto
+adjacent pages.
+
+If you publish or distribute Opaque copies of the Document
+numbering more than 100, you must either include a machine-readable
+Transparent copy along with each Opaque copy, or state in or with
+each Opaque copy a computer-network location from which the general
+network-using public has access to download using public-standard
+network protocols a complete Transparent copy of the Document, free
+of added material. If you use the latter option, you must take
+reasonably prudent steps, when you begin distribution of Opaque
+copies in quantity, to ensure that this Transparent copy will
+remain thus accessible at the stated location until at least one
+year after the last time you distribute an Opaque copy (directly or
+through your agents or retailers) of that edition to the public.
+
+It is requested, but not required, that you contact the authors of
+the Document well before redistributing any large number of copies,
+to give them a chance to provide you with an updated version of the
+Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document
+under the conditions of sections 2 and 3 above, provided that you
+release the Modified Version under precisely this License, with the
+Modified Version filling the role of the Document, thus licensing
+distribution and modification of the Modified Version to whoever
+possesses a copy of it. In addition, you must do these things in
+the Modified Version:
+
+
+@enumerate A
+
+@item
+Use in the Title Page (and on the covers, if any) a title
+distinct from that of the Document, and from those of previous
+versions (which should, if there were any, be listed in the
+History section of the Document). You may use the same title as
+a previous version if the original publisher of that version
+gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or
+entities responsible for authorship of the modifications in the
+Modified Version, together with at least five of the principal
+authors of the Document (all of its principal authors, if it has
+fewer than five), unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license
+notice giving the public permission to use the Modified Version
+under the terms of this License, in the form shown in the
+Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant
+Sections and required Cover Texts given in the Document’s
+license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled “Historyâ€, Preserve its Title, and
+add to it an item stating at least the title, year, new authors,
+and publisher of the Modified Version as given on the Title
+Page. If there is no section Entitled “History†in the
+Document, create one stating the title, year, authors, and
+publisher of the Document as given on its Title Page, then add
+an item describing the Modified Version as stated in the
+previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and
+likewise the network locations given in the Document for
+previous versions it was based on. These may be placed in the
+“History†section. You may omit a network location for a work
+that was published at least four years before the Document
+itself, or if the original publisher of the version it refers to
+gives permission.
+
+@item
+For any section Entitled “Acknowledgements†or “Dedicationsâ€,
+Preserve the Title of the section, and preserve in the section
+all the substance and tone of each of the contributor
+acknowledgements and/or dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document, unaltered
+in their text and in their titles. Section numbers or the
+equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled “Endorsementsâ€. Such a section may
+not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled
+“Endorsements†or to conflict in title with any Invariant
+Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no
+material copied from the Document, you may at your option designate
+some or all of these sections as invariant. To do this, add their
+titles to the list of Invariant Sections in the Modified Version’s
+license notice. These titles must be distinct from any other
+section titles.
+
+You may add a section Entitled “Endorsementsâ€, provided it contains
+nothing but endorsements of your Modified Version by various
+parties—for example, statements of peer review or that the text
+has been approved by an organization as the authoritative
+definition of a standard.
+
+You may add a passage of up to five words as a Front-Cover Text,
+and a passage of up to 25 words as a Back-Cover Text, to the end of
+the list of Cover Texts in the Modified Version. Only one passage
+of Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document
+already includes a cover text for the same cover, previously added
+by you or by arrangement made by the same entity you are acting on
+behalf of, you may not add another; but you may replace the old
+one, on explicit permission from the previous publisher that added
+the old one.
+
+The author(s) and publisher(s) of the Document do not by this
+License give permission to use their names for publicity for or to
+assert or imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under
+this License, under the terms defined in section 4 above for
+modified versions, provided that you include in the combination all
+of the Invariant Sections of all of the original documents,
+unmodified, and list them all as Invariant Sections of your
+combined work in its license notice, and that you preserve all
+their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name
+but different contents, make the title of each such section unique
+by adding at the end of it, in parentheses, the name of the
+original author or publisher of that section if known, or else a
+unique number. Make the same adjustment to the section titles in
+the list of Invariant Sections in the license notice of the
+combined work.
+
+In the combination, you must combine any sections Entitled
+“History†in the various original documents, forming one section
+Entitled “Historyâ€; likewise combine any sections Entitled
+“Acknowledgementsâ€, and any sections Entitled “Dedicationsâ€. You
+must delete all sections Entitled “Endorsements.â€
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other
+documents released under this License, and replace the individual
+copies of this License in the various documents with a single copy
+that is included in the collection, provided that you follow the
+rules of this License for verbatim copying of each of the documents
+in all other respects.
+
+You may extract a single document from such a collection, and
+distribute it individually under this License, provided you insert
+a copy of this License into the extracted document, and follow this
+License in all other respects regarding verbatim copying of that
+document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other
+separate and independent documents or works, in or on a volume of a
+storage or distribution medium, is called an “aggregate†if the
+copyright resulting from the compilation is not used to limit the
+legal rights of the compilation’s users beyond what the individual
+works permit. When the Document is included in an aggregate, this
+License does not apply to the other works in the aggregate which
+are not themselves derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half
+of the entire aggregate, the Document’s Cover Texts may be placed
+on covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic
+form. Otherwise they must appear on printed covers that bracket
+the whole aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of
+section 4. Replacing Invariant Sections with translations requires
+special permission from their copyright holders, but you may
+include translations of some or all Invariant Sections in addition
+to the original versions of these Invariant Sections. You may
+include a translation of this License, and all the license notices
+in the Document, and any Warranty Disclaimers, provided that you
+also include the original English version of this License and the
+original versions of those notices and disclaimers. In case of a
+disagreement between the translation and the original version of
+this License or a notice or disclaimer, the original version will
+prevail.
+
+If a section in the Document is Entitled “Acknowledgementsâ€,
+“Dedicationsâ€, or “Historyâ€, the requirement (section 4) to
+Preserve its Title (section 1) will typically require changing the
+actual title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void,
+and will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the
+copyright holder fails to notify you of the violation by some
+reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from
+that copyright holder, and you cure the violation prior to 30 days
+after your receipt of the notice.
+
+Termination of your rights under this section does not terminate
+the licenses of parties who have received copies or rights from you
+under this License. If your rights have been terminated and not
+permanently reinstated, receipt of a copy of some or all of the
+same material does not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+@end enumerate
+
+@quotation
+
+The Free Software Foundation may publish new, revised versions of
+the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@indicateurl{http://www.gnu.org/copyleft}.
+
+Each version of the License is given a distinguishing version
+number. If the Document specifies that a particular numbered
+version of this License “or any later version†applies to it, you
+have the option of following the terms and conditions either of
+that specified version or of any later version that has been
+published (not as a draft) by the Free Software Foundation. If the
+Document does not specify a version number of this License, you may
+choose any version ever published (not as a draft) by the Free
+Software Foundation. If the Document specifies that a proxy can
+decide which future versions of this License can be used, that
+proxy’s public statement of acceptance of a version permanently
+authorizes you to choose that version for the Document.
+@end quotation
+
+
+@enumerate 11
+
+@item
+RELICENSING
+@end enumerate
+
+@quotation
+
+“Massive Multiauthor Collaboration Site†(or “MMC Siteâ€) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server.
+A “Massive Multiauthor Collaboration†(or “MMCâ€) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+“CC-BY-SA†means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+“Incorporate†means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is “eligible for relicensing†if it is licensed under this
+License, and if all works that were first published under this
+License somewhere other than this MMC, and subsequently
+incorporated in whole or in part into the MMC, (1) had no cover
+texts or invariant sections, and (2) were thus incorporated prior
+to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the
+site under CC-BY-SA on the same site at any time before August 1,
+2009, provided the MMC is eligible for relicensing.
+@end quotation
+
+
+@node Emacs lisp functions and variables,,The GNU Free Documentation License,Top
+@unnumbered Emacs lisp functions and variables
+
+
+@menu
+* evil-add-command-properties: 0.
+* evil-auto-balance-windows: 1.
+* evil-auto-indent: 2.
+* evil-backspace-join-lines: 3.
+* evil-bigword: 4.
+* evil-buffer-regexps: 5.
+* evil-complete-all-buffers: 6.
+* evil-cross-lines: 7.
+* evil-declare-change-repeat: 8.
+* evil-declare-motion: 9.
+* evil-declare-not-repeat: a.
+* evil-declare-repeat: b.
+* evil-default-cursor: c.
+* evil-default-state: d.
+* evil-define-command: e.
+* evil-define-key: f.
+* evil-define-motion: 10.
+* evil-define-operator: 11.
+* evil-define-state: 12.
+* evil-define-text-object: 13.
+* evil-define-type: 14.
+* evil-disable-insert-state-bindings: 15.
+* evil-echo-state: 16.
+* evil-esc-delay: 17.
+* evil-ex-hl-update-delay: 18.
+* evil-flash-delay: 19.
+* evil-get-command-properties: 1a.
+* evil-get-command-property: 1b.
+* evil-global-set-key: 1c.
+* evil-highlight-closing-paren-at-point-states: 1d.
+* evil-indent-convert-tabs: 1e.
+* evil-intercept-esc: 1f.
+* evil-kbd-macro-suppress-motion-error: 20.
+* evil-kill-on-visual-paste: 21.
+* evil-local-set-key: 22.
+* evil-mode-line-format: 23.
+* evil-mouse-word: 24.
+* evil-move-beyond-eol: 25.
+* evil-move-cursor-back: 26.
+* evil-regexp-search: 27.
+* evil-repeat-move-cursor: 28.
+* evil-respect-visual-line-mode: 29.
+* evil-search-wrap: 2a.
+* evil-select-an-object: 2b.
+* evil-select-inner-object: 2c.
+* evil-select-paren: 2d.
+* evil-set-command-properties: 2e.
+* evil-set-initial-state: 2f.
+* evil-set-leader: 30.
+* evil-shift-round: 31.
+* evil-shift-width: 32.
+* evil-show-paren-range: 33.
+* evil-split-window-below: 34.
+* evil-toggle-key: 35.
+* evil-track-eol: 36.
+* evil-vsplit-window-right: 37.
+* evil-want-C-d-scroll: 38.
+* evil-want-C-i-jump: 39.
+* evil-want-C-u-delete: 3a.
+* evil-want-C-u-scroll: 3b.
+* evil-want-C-w-delete: 3c.
+* evil-want-C-w-in-emacs-state: 3d.
+* evil-want-fine-undo: 3e.
+* evil-want-Y-yank-to-eol: 3f.
+@end menu
+
+
+@c %**end of body
+@bye
diff --git a/doc/docstringdb.json b/doc/docstringdb.json
new file mode 100644
index 0000000..f51750c
--- /dev/null
+++ b/doc/docstringdb.json
@@ -0,0 +1 @@
+{"evil-forward-WORD-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the COUNT-th next WORD.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a list (BEG END [TYPE] PROPERTIES...).\nBEG and END are buffer positions (numbers or markers),\nTYPE is a type as per `evil-type-p', and PROPERTIES is\na property list.","arglist":["beg","end","&optional","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-alist":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Association list of characters overwritten in Replace state.\nThe format is (POS . CHAR).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-exchange-corners":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Rearrange corners in Visual Block mode.\n\n M---+ +---M\n | | <=> | |\n +---P P---+\n\nFor example, if mark is in the upper left corner and point\nin the lower right, this function puts mark in the upper right\ncorner and point in the lower left.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-echo-area-message":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Previous value of `current-message'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-record-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set `evil-repeat-buffer' to the current buffer.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--jumps-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["format","&rest","args"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-substitute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex substitute command.\n[BEG,END]substitute/PATTERN/REPLACEMENT/FLAGS","arglist":["beg","end","&optional","pattern","replacement","flags"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-cross-lines":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"\\<evil-motion-state-map>\nWhether horizontal motions may move to other lines. If non-nil,\ncertain motions that conventionally operate in a single line may move\nthe cursor to other lines. Otherwise, they are restricted to the\ncurrent line. This applies to \\[evil-backward-char], \\[evil-forward-char], \\[evil-find-char], \\[evil-find-char-backward], \\[evil-find-char-to], \\[evil-find-char-to-backward], \\<evil-normal-state-map>\\[evil-invert-char].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-emacs-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-kbd-macro-suppress-motion-error":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"\\<evil-motion-state-map>\nWhether left/right motions signal errors in keyboard macros.\nThis variable only affects beginning-of-line or end-of-line errors\nregarding the motions \\[evil-backward-char] and \\[evil-forward-char]\nrespectively. This may be desired since such errors cause macro\ndefinition or execution to be terminated. There are four\npossibilities:\n\n- `record': errors are suppressed when recording macros, but not when\n replaying them.\n- `replay': errors are suppressed when replaying macros, but not when\n recording them.\n- `t': errors are suppressed in both cases.\n- `nil': errors are never suppressed.","fn-docstring":"Returns non-nil if a motion error should be suppressed.\nWhether the motion error should be suppressed depends on the\nvariable `evil-kbd-macro-suppress-motion-error'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-prev-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-recording-current-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether we are recording the current command for repeat.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-define-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a STATE binding from KEY to DEF for KEYMAP.\nSTATE is one of `normal', `insert', `visual', `replace',\n`operator', `motion', `emacs', or a list of one or more of\nthese. Omitting a state by using `nil' corresponds to a standard\nEmacs binding using `define-key'. The remaining arguments are\nlike those of `define-key'. For example:\n\n (evil-define-key 'normal foo-map \"a\" 'bar)\n\nThis creates a binding from `a' to `bar' in normal state, which\nis active whenever `foo-map' is active. Using nil for the state,\nthe following lead to identical bindings:\n\n (evil-define-key nil foo-map \"a\" 'bar)\n (define-key foo-map \"a\" 'bar)\n\nIt is possible to specify multiple states and/or bindings at\nonce:\n\n (evil-define-key '(normal visual) foo-map\n \"a\" 'bar\n \"b\" 'foo)\n\nIf `foo-map' has not been initialized yet, this macro adds an\nentry to `after-load-functions', delaying execution as necessary.\n\nKEYMAP may also be a quoted symbol. If the symbol is `global', the\nglobal evil keymap corresponding to the state(s) is used, meaning\nthe following lead to identical bindings:\n\n (evil-define-key 'normal 'global \"a\" 'bar)\n (evil-global-set-key 'normal \"a\" 'bar)\n\nThe symbol `local' may also be used, which corresponds to using\n`evil-local-set-key'. If a quoted symbol is used that is not\n`global' or `local', it is assumed to be the name of a minor\nmode, in which case `evil-define-minor-mode-key' is used.","arglist":["state","keymap","key","def","&rest","bindings"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-backward-sentence":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-fill-and-move":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Fill text and move point to the end of the filled region.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-block-expand":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform expand transformation on block from BEG to END with PROPERTIES.\n\nLike `inclusive', but for rectangles:\nthe last column is included.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-screen-line-contract":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform contract transformation on screen-line from BEG to END with PROPERTIES.\n\nInclude whole lines, being aware of `visual-line-mode'\nwhen `evil-respect-visual-line-mode' is non-nil.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-exit-emacs-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exit Emacs state.\nChanges the state to the previous state, or to Normal state\nif the previous state was Emacs state.","arglist":["&optional","buffer","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-highlight-all":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If t and interactive search is enabled, all matches are\nhighlighted.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-want-change-word-to-end":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether `cw' behaves like `ce'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-find-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return word near point as a string.\nIf FORWARD is nil, search backward, otherwise forward. Returns\nnil if nothing is found.","arglist":["forward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-previous-line-func":{"default":"(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (let ((hippie-expand-try-functions-list '(try-expand-line try-expand-line-all-buffers))) (hippie-expand arg)))","local":null,"default-type":"cons","var-docstring":"Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-previous-line].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-align-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Right-align lines in the region at WIDTH columns.\nThe default for width is the value of `fill-column'.","arglist":["beg","end","&optional","type","width"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-definition-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find definition for STRING with evil-search.","arglist":["string","_position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat the last search.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jumps-history":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"History of `evil-mode' jumps that are persisted with `savehist'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-half-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change cursor to a half-height box.\n(This is really just a thick horizontal bar.)","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-parse":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse STRING as an Ex expression and return an evaluation tree.\nIf SYNTAX is non-nil, return a syntax tree instead.\nSTART is the start symbol, which defaults to `expression'.","arglist":["string","&optional","syntax","start"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-char-in-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-char-in-line'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-write-all":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves all buffers visiting a file.\nIf BANG is non nil then read-only buffers are saved, too,\notherwise they are skipped. ","arglist":["bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-backward-word-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the COUNT-th previous word.\nIf BIGWORD is non-nil, move by WORDS.","arglist":["&optional","count","bigword"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-overriding-maps":{"default":"((Buffer-menu-mode-map) (color-theme-mode-map) (comint-mode-map) (compilation-mode-map) (grep-mode-map) (dictionary-mode-map) (ert-results-mode-map . motion) (Info-mode-map . motion) (speedbar-key-map) (speedbar-file-key-map) (speedbar-buffers-key-map))","local":null,"default-type":"cons","var-docstring":"Keymaps that should override Evil maps.\nEntries have the form (MAP-VAR . STATE), where MAP-VAR is\na keymap variable and STATE is the state whose bindings\nshould be overridden. If STATE is nil, all states are\noverridden.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-delete-whole-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete whole line.","arglist":["beg","end","&optional","type","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-clean-isearch-overlays":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Clean isearch overlays unless `this-command' is search.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-beginning-of-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the current line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-jump":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["idx","shift"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-matches":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-mouse-drag-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the region to the text that the mouse is dragged over.\nHighlight the drag area as you move the mouse.\nThis must be bound to a button-down mouse event.\n\nIf the click is in the echo area, display the `*Messages*' buffer.\n\nSTART-EVENT should be the event that started the drag.","arglist":["start-event"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-line-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-line-below'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-find-next-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Look for the next occurrence of PATTERN in a certain DIRECTION.\nNote that this function ignores the whole-line property of PATTERN.","arglist":["pattern","&optional","direction"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-signal-at-bob":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Signals 'beginning-of-buffer if `point' is at bob.\nThis function should be used in backward motions. If `point' is at\nbob so that no further backward motion is possible the error\n'beginning-of-buffer is raised.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-avy-goto-word-or-subword-1":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-word-or-subword-1'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-previous-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The previously executed Ex command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-forward-section-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the COUNT-th next section.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-indent-convert-tabs":{"default":"t","local":null,"default-type":"symbol","var-docstring":"\\<evil-normal-state-map>\nIf non-nil, the \\[evil-indent] operator converts between leading tabs and spaces.\nWhether tabs are converted to spaces or vice versa depends on the\nvalue of `indent-tabs-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-move-cursor":{"default":"t","local":null,"default-type":"symbol","var-docstring":"\\<evil-normal-state-map>\nWhether repeating commands with \\[evil-repeat] may move the cursor.\nIf nil, the original cursor position is preserved, even if the command\nnormally would have moved the cursor.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-pattern-regex":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the regular expression of a search PATTERN.","arglist":["pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-height":{"default":8,"local":null,"default-type":"integer","var-docstring":"Height (in lines) of the command line window.\nSet to 0 to use the default height for `split-window'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-forward-beginning":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move forward to beginning of THING.\nThe motion is repeated COUNT times.","arglist":["thing","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-list-view-select-action":{"default":"nil","local":true,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-substitute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change a character.","arglist":["beg","end","&optional","type","register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-mode-syntax-table":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Syntax table for `evil-command-window-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-history":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"History of Ex commands.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-echo-overlay":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Overlay used for displaying info messages during ex.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-a-paragraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a paragraph.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Normal state.\n(That is, whether `evil-state' is `normal'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-match-substitute-replacement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return REPLACEMENT as it will be inserted by `evil-replace-match'.","arglist":["replacement","&optional","fixedcase","string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Insert state is enabled.\nUse the command `evil-insert-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-echo-state":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether to signal the current state in the echo area.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-types":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"An alist of defined repeat-types.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-local-keymaps-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of keymap variables that must be\nreinitialized in each buffer. Entries have the form\n(MODE . KEYMAP), where KEYMAP is the variable containing\nthe keymap for MODE.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-insert-at-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeation recording function for commands that insert text in region.\nThis records text insertion when a command inserts some text in a\nbuffer between (point) and (mark).","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-markers-alist":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Association list for markers.\nEntries have the form (CHAR . DATA), where CHAR is the marker's\nname and DATA is either a marker object as returned by `make-marker',\na variable, a movement function, or a cons cell (STRING NUMBER),\nwhere STRING is a file path and NUMBER is a buffer position.\nThe global value of this variable holds markers available from\nevery buffer, while the buffer-local value holds markers available\nonly in the current buffer.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-WORD":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-symbol":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-backward-history":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"History of backward searches.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-read-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Read a MOTION, motion COUNT and motion TYPE from the keyboard.\nThe type may be overridden with MODIFIER, which may be a type\nor a Visual selection as defined by `evil-define-visual-selection'.\nReturn a list (MOTION COUNT [TYPE]).","arglist":["&optional","motion","count","type","modifier"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-line-move":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"A wrapper for line motions which conserves the column.\nSignals an error at buffer boundaries unless NOERROR is non-nil.","arglist":["count","&optional","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-active-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the highlight with a certain NAME is active.","arglist":["name"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-update":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update the highlighting and info-message for the search pattern.\nPATTERN is the search pattern and OFFSET the associated offset.\nBEG and END specifiy the current match, MESSAGE is the info\nmessage to be shown. This function does nothing if\n`evil-ex-search-interactive' is nil.","arglist":["pattern","offset","beg","end","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-rotate-downwards":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Rotates the windows according to the current cyclic ordering.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-quit-all":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exits Emacs, asking for saving.","arglist":["&optional","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-paste":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Information about the latest paste.\nThis should be a list (CMD COUNT POINT BEG END FIRSTVISUAL) where\nCMD is the last paste-command (`evil-paste-before',\n`evil-paste-after' or `evil-visual-paste'), COUNT is the repeat\ncount of the paste, POINT is the position of point before the\npaste, BEG end END are the region of the inserted\ntext. FIRSTVISUAL is t if and only if the previous command was\nthe first visual paste (i.e. before any paste-pop).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-vector-to-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Turns vector into a string, changing <escape> to '\\e'","arglist":["vector"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-echo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Display a message after the current Ex command.","arglist":["string","&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-abbrev-expand-on-insert-exit":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If non-nil abbrevs will be expanded when leaving insert state\nlike in Vim, if `abbrev-mode' is on.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-replace-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Replace state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the line number of BASE plus OFFSET.","arglist":["base","&optional","offset"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-an-angle":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select an angle bracket.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-side-windows":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Toggle side windows, evaluate BODY, restore side windows.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-global-set-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Bind KEY to DEF in STATE.","arglist":["state","key","def"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-sort":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex sort command.\n[BEG,END]sort[!] [i][u]\nThe following additional options are supported:\n\n * i ignore case\n * u remove duplicate lines\n\nThe 'bang' argument means to sort in reverse order.","arglist":["beg","end","&optional","options","reverse"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-avy-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["command","type"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-make-hl":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a new highlight object with name NAME and properties ARGS.\nThe following properties are supported:\n:face The face to be used for the highlighting overlays.\n:win The window in which the highlighting should be shown.\n Note that the highlight will be visible in all windows showing\n the corresponding buffer, but only the matches visible in the\n specified window will actually be highlighted. If :win is nil,\n the matches in all windows will be highlighted.\n:min The minimal buffer position for highlighted matches.\n:max The maximal buffer position for highlighted matches.\n:match-hook A hook to be called once for each highlight.\n The hook must take two arguments, the highlight and\n the overlay for that highlight.\n:update-hook A hook called once after updating the highlighting\n with two arguments, the highlight and a message string\n describing the current match status.","arglist":["name","&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-undo-entry":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Information about the latest undo entry in the buffer.\nThis should be a pair (OBJ . CONS) where OBJ is the entry as an\nobject, and CONS is a copy of the entry.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-goto-definition-imenu":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find definition for STRING with imenu.","arglist":["string","_position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-command-window-current-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The buffer from which the command line window was called.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-file-or-shell-command-completion-at-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-track-last-insertion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Track the last insertion range and its text.\nThe insertion range is stored as a pair of buffer positions in\n`evil-current-insertion'. If a subsequent change is compatible,\nthen the current range is modified, otherwise it is replaced by a\nnew range. Compatible changes are changes that do not create a\ndisjoin range.","arglist":["beg","end","len"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-previous":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat the last search in the opposite direction.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"mouse-yank-primary":"<mouse-2>","redo":"C-r","undo":"C-x u","evil-paste-pop":"C-p","evil-paste-pop":"C-p","evil-force-normal-state":"<escape>","evil-backward-char":"DEL","evil-quit":"Z Q","evil-save-modified-and-close":"Z Z","evil-shift-right":">","evil-shift-left":"<","evil-indent":"=","evil-invert-char":"~","evil-use-register":"\"","evil-execute-macro":"@","evil-repeat":".","evil-repeat-pop-next":"M-.","evil-repeat-pop":"C-.","pop-tag-mark":"C-t","evil-paste-pop":"C-p","evil-paste-pop-next":"C-n","ispell-word":"z =","evil-close-folds":"z m","evil-open-folds":"z r","evil-toggle-fold":"z a","evil-close-fold":"z c","evil-open-fold-rec":"z O","evil-open-fold":"z o","goto-last-change-reverse":"g ,","goto-last-change":"g ;","tab-bar-switch-to-prev-tab":"g T","tab-bar-switch-to-next-tab":"g t","evil-invert-case":"g ~","evil-rot13":"g ?","browse-url-at-point":"g x","evil-find-file-at-point-with-line":"g F","find-file-at-point":"g f","evil-upcase":"g U","evil-downcase":"g u","evil-fill":"g w","evil-fill-and-move":"g q","evil-join-whitespace":"g J","evil-insert-resume":"g i","what-cursor-position":"g a","what-cursor-position":"g a","evil-ex-repeat-global-substitute":"g &","evil-ex-repeat-substitute":"&","evil-yank-line":"Y","evil-yank":"y","evil-delete-char":"x","evil-delete-backward-char":"X","evil-delete-char":"x","evil-change-whole-line":"S","evil-substitute":"s","evil-replace-state":"R","evil-replace":"r","evil-record-macro":"q","evil-paste-before":"P","evil-paste-after":"p","evil-open-above":"O","evil-open-below":"o","evil-set-marker":"m","evil-join":"J","evil-insert-line":"I","evil-insert":"i","evil-insert":"i","evil-insert":"i","evil-delete-line":"D","evil-delete":"d","evil-change-line":"C","evil-change":"c","evil-append-line":"A","evil-append":"a"}},"evil-copy-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a copy of RANGE.","arglist":["range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-marker":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return MARKER's line number in the current buffer.\nSignal an error if MARKER is in a different buffer.","arglist":["marker"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ace-jump-line-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Jump visually to the beginning of a line using ace-jump.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mouse--remap-link-click-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["start-event","end-event"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-bindings":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Evil's bindings for insert state (for\n`evil-insert-state-map'), excluding <delete>, <escape>, and\n`evil-toggle-key'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-isearch-function":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a search function for use with isearch.\nBased on `isearch-regexp' and `isearch-forward'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeation for motions. Motions are recorded by keystroke but only in insert state.","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-properties":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Property list of miscellaneous Visual properties.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-state-modes":{"default":"(comint-mode erc-mode eshell-mode geiser-repl-mode gud-mode inferior-apl-mode inferior-caml-mode inferior-emacs-lisp-mode inferior-j-mode inferior-python-mode inferior-scheme-mode inferior-sml-mode internal-ange-ftp-mode prolog-inferior-mode reb-mode shell-mode slime-repl-mode term-mode wdired-mode)","local":null,"default-type":"cons","var-docstring":"Modes that should come up in Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-intercept-esc":{"default":"always","local":null,"default-type":"symbol","var-docstring":"Whether Evil should intercept the escape key.\nIn the terminal, escape and a meta key sequence both generate the\nsame event. In order to distingush these, Evil uses\n`input-decode-map'. It is not necessary to do this in a graphical\nEmacs session. However, if you prefer to use `C-[' as escape (which\nis identical to the terminal escape key code), this interception must\nalso happen in graphical Emacs sessions. Set this variable to\n`always', t (only in the terminal) or nil (never intercept).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-avy-goto-symbol-1-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-symbol-1-above'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"*Characterwise selection.","fn-docstring":"Characterwise selection.","arglist":["&optional","mark","point","type","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Information accumulated during current repeat.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-emacs-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-signal-at-eob":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Signals 'end-of-buffer if `point' is at eob.\nThis function should be used in forward motions. If `point' is close\nto eob so that no further forward motion is possible the error\n'end-of-buffer is raised. This is the case if `point' is at\n`point-max' or if is one position before `point-max',\n`evil-move-beyond-eol' is nil and `point' is not at the end\nof a line. The latter is necessary because `point' cannot be\nmoved to `point-max' if `evil-move-beyond-eol' is nil and\nthe last line in the buffer is not empty.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-top-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to top-left window.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-shell-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute a shell command.\nIf BEG, END and TYPE is specified, COMMAND is executed on the region,\nwhich is replaced with the command's output. Otherwise, the\noutput is displayed in its own buffer. If PREVIOUS is non-nil,\nthe previous shell command is executed instead.","arglist":["beg","end","&optional","type","command","previous"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-up-xml-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of balanced xml tags.\nOPEN and CLOSE should be characters identifying the opening and\nclosing parenthesis, respectively. If COUNT is greater than zero\npoint is moved forward otherwise it is moved backwards. Whenever\nan opening delimiter is found the COUNT is increased by one, if a\nclosing delimiter is found the COUNT is decreased by one. The\nmotion stops when COUNT reaches zero. The match-data reflects the\nlast successful match (that caused COUNT to reach zero).","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jump-to-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Jump to tag under point.\nIf called with a prefix argument, provide a prompt\nfor specifying the tag.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete to end of line.","arglist":["beg","end","&optional","type","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-echo-area":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the echo area; execute BODY; restore the echo area.\nIntermittent messages are not logged in the *Messages* buffer.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-save-modified-and-close":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves the current buffer and closes the window.","arglist":["file","&optional","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-find-char-to":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move before the next COUNT'th occurrence of CHAR.","arglist":["&optional","count","char"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank-characters":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves the characters defined by the region BEG and END in the kill-ring.","arglist":["beg","end","&optional","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-set-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the pattern of the highlight HL to PATTERN.","arglist":["hl","pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-suppress-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Full keymap disabling default bindings to `self-insert-command'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-struct":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to insert state at beginning of current line.\nPoint is placed at the first non-blank character on the current\nline. The insertion will be repeated COUNT times. If VCOUNT is\nnon nil it should be number > 0. The insertion will be repeated\nin the next VCOUNT - 1 lines below the current one.","arglist":["count","&optional","vcount"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ace-jump-char-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Jump visually directly to a char using ace-jump.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-has-command-property-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether COMMAND has Evil PROPERTY.\nSee also `evil-has-command-properties-p'.","arglist":["command","property"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-emacs-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Emacs state is enabled.\nUse the command `evil-emacs-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-define-interactive-code":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define an interactive code.\nPROMPT, if given, is the remainder of the interactive string\nup to the next newline. Command properties may be specified\nvia KEY-VALUE pairs. BODY should evaluate to a list of values.\n\n(fn CODE (PROMPT) [[KEY VALUE]...] BODY...)","arglist":["code","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-paste-before":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Pastes the latest yanked text before the cursor position.\nThe return value is the yanked text.","arglist":["count","&optional","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-start-session":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Initialize Ex for interactive search.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-last-cmd":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-intercept-maps":{"default":"((edebug-mode-map))","local":null,"default-type":"cons","var-docstring":"Keymaps that should intercept Evil maps.\nEntries have the form (MAP-VAR . STATE), where MAP-VAR is\na keymap variable and STATE is the state whose bindings\nshould be intercepted. If STATE is nil, all states are\nintercepted.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-move-far-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Closes the current window, splits the upper-left one vertically\nand redisplays the current buffer there.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-maybe-expand-abbrev":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-looking-at-start-comment":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns t if point is at the start of a comment.\npoint must be on one of the opening characters of a block comment\naccording to the current syntax table. Futhermore these\ncharacters must been parsed as opening characters, i.e. they\nwon't be considered as comment starters inside a string or\npossibly another comment. Point is moved to the first character\nof the comment opener if MOVE is non-nil.","arglist":["&optional","move"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-read-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Read a key from the keyboard.\nTranslates it according to the input method.","arglist":["&optional","prompt"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-delete":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Deletes the current window.\nIf `evil-auto-balance-windows' is non-nil then all children of\nthe deleted window's parent window are rebalanced.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-execute-macro":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute keyboard macro MACRO, COUNT times.\nWhen called with a non-numerical prefix (such as \\[universal-argument]),\nCOUNT is infinite. MACRO is read from a register\nwhen called interactively.","arglist":["count","macro"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-backward-sentence-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the previous COUNT-th beginning of a sentence or paragraph.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ac-prefix-len":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-pending-custom-initialize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"A list of pending initializations for custom variables.\nEach element is a triple (FUNC VAR VALUE). When Evil is\ncompletely loaded then the functions (funcall FUNC VAR VALUE) is\ncalled for each element. FUNC should be a function suitable for\nthe :initialize property of `defcustom'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-change-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Record change information for current command.","arglist":["beg","end","length"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-end-of-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the current line.\nIf COUNT is given, move COUNT - 1 lines downward first.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-add-hjkl-bindings":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Add \"h\", \"j\", \"k\", \"l\" bindings to KEYMAP in STATE.\nAdd additional BINDINGS if specified.","arglist":["keymap","&optional","state","&rest","bindings"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-fold-action":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform fold ACTION for each matching major or minor mode in LIST.\n\nACTION will be performed for the first matching handler in LIST. For more\ninformation on its features and format, see the documentation for\n`evil-fold-list'.\n\nIf no matching ACTION is found in LIST, an error will signaled.\n\nHandler errors will be demoted, so a problem in one handler will (hopefully)\nnot interfere with another.","arglist":["list","action"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-repeat-substitute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat last substitute command.\nThis is the same as :s//~/","arglist":["beg","end","&optional","flags"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-exit-visual-and-repeat":"<mouse-2>","evil-exit-visual-state":"<escape>","evil-inner-symbol":"i o","evil-inner-tag":"i t","evil-inner-back-quote":"i `","evil-inner-double-quote":"i \"","evil-inner-single-quote":"i '","evil-inner-angle":"i >","evil-inner-angle":"i >","evil-inner-curly":"i }","evil-inner-curly":"i }","evil-inner-curly":"i }","evil-inner-bracket":"i ]","evil-inner-bracket":"i ]","evil-inner-paren":"i )","evil-inner-paren":"i )","evil-inner-paren":"i )","evil-inner-paragraph":"i p","evil-inner-sentence":"i s","evil-inner-WORD":"i W","evil-inner-word":"i w","evil-a-symbol":"a o","evil-a-tag":"a t","evil-a-back-quote":"a `","evil-a-double-quote":"a \"","evil-a-single-quote":"a '","evil-an-angle":"a >","evil-an-angle":"a >","evil-a-curly":"a }","evil-a-curly":"a }","evil-a-curly":"a }","evil-a-bracket":"a ]","evil-a-bracket":"a ]","evil-a-paren":"a )","evil-a-paren":"a )","evil-a-paren":"a )","evil-a-paragraph":"a p","evil-a-sentence":"a s","evil-a-WORD":"a W","evil-a-word":"a w","ispell-word":"z =","evil-upcase":"U","evil-downcase":"u","evil-change":"R","evil-visual-exchange-corners":"O","exchange-point-and-mark":"o","evil-insert":"I","evil-append":"A"}},"evil-complete-next-minibuffer-func":{"default":"minibuffer-complete","local":null,"default-type":"symbol","var-docstring":"Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-next].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-do-update-highlight":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Timer function for updating the highlights.","arglist":["&optional","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-transient-mark-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save Transient Mark mode and make it buffer-local.\nAny changes to Transient Mark mode are now local to the current\nbuffer, until `evil-restore-transient-mark-mode' is called.\n\nVariables pertaining to Transient Mark mode are listed in\n`evil-transient-vars', and their values are stored in\n`evil-transient-vals'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-previous-minibuffer-func":{"default":"minibuffer-complete","local":null,"default-type":"symbol","var-docstring":"Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-previous].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-mode-off-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-record-macro":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Record a keyboard macro into REGISTER.\nIf REGISTER is :, /, or ?, the corresponding command line window\nwill be opened instead.","arglist":["register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move by words.\nMoves point COUNT words forward or (- COUNT) words backward if\nCOUNT is negative. This function is the same as `forward-word'\nbut returns the number of words by which point could *not* be\nmoved.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-transient-vals":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of old values for Transient Mark mode variables.\nEntries have the form (VARIABLE VALUE LOCAL), where LOCAL is\nwhether the variable was previously buffer-local.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-start":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Start recording a new repeat into `evil-repeat-info'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-not-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be nonrepeatable.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-WORD":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a WORD.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-region-expanded":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Whether the region matches the Visual selection.\nThat is, whether the positions of point and mark have been\nexpanded to coincide with the selection's boundaries.\nThis makes the selection available to functions acting\non Emacs' region.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ret":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT lines down.\nIf point is on a widget or a button, click on it.\nIn Insert state, insert a newline.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-backward-paragraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the beginning of the COUNT-th previous paragraph.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-back-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner back-quoted expression.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-transient-vars":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"List of variables pertaining to Transient Mark mode.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-repeat-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Record insertion keys in `evil-insert-repeat-info'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-normal":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex normal command.\nExecute the argument as normal command on each line in the\nrange. The given argument is passed straight to\n`execute-kbd-macro'. The default is the current line.","arglist":["beg","end","&optional","commands"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-buffers":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-find-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat the last find COUNT times.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-unbounded-word-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search forward for symbol under point.\nThe search is unbounded, i.e., the pattern is not wrapped in\n\\<...\\>.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-concat-alists":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate association lists, removing duplicates.\nAn alist is a list of cons cells (KEY . VALUE) where each key\nmay occur only once. Later values overwrite earlier values.","arglist":["&rest","sequences"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-symbol-word-search":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"If nil then * and # search for words otherwise for symbols.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-get-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return contents of REGISTER.\nSignal an error if empty, unless NOERROR is non-nil.\n\nThe following special registers are supported.\n \" the unnamed register\n * the clipboard contents\n + the clipboard contents\n <C-w> the word at point (ex mode only)\n <C-a> the WORD at point (ex mode only)\n <C-o> the symbol at point (ex mode only)\n <C-f> the current file at point (ex mode only)\n % the current file name (read only)\n # the alternate file name (read only)\n / the last search pattern (read only)\n : the last command line (read only)\n . the last inserted text (read only)\n - the last small (less than a line) delete\n _ the black hole register\n = the expression register (read only)","arglist":["register","&optional","_noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-disable-insert-state-bindings":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether insert state bindings should be used.\nBindings for escape, delete and `evil-toggle-key' are always\navailable. If this is non-nil, default Emacs bindings are by and\nlarge accessible in insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-decrease-width":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Decrease current window width by COUNT.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-shortcut-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\".","fn-docstring":"Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\".","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-integration":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether to load evil-integration.el.\nThis variable must be set before Evil is loaded.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-maybe-remove-spaces":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Flag to determine if newly inserted spaces should be removed.\nSee the function `evil-maybe-remove-spaces'.","fn-docstring":"Remove space from newly opened empty line.\nThis function removes (indentation) spaces that have been\ninserted by opening a new empty line. The behavior depends on the\nvariable `evil-maybe-remove-spaces'. If this variable is nil the\nfunction does nothing. Otherwise the behavior depends on\nDO-REMOVE. If DO-REMOVE is non-nil the spaces are\nremoved. Otherwise `evil-maybe-remove-spaces' is set to nil\nunless the last command opened yet another new line.\n\nThis function should be added as a post-command-hook to track\ncommands opening a new line.","arglist":["&optional","do-remove"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-nreplaced":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-find-thing":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a THING near point as a string.\nTHING should be a symbol understood by `thing-at-point',\ne.g. 'symbol or 'word. If FORWARD is nil, search backward,\notherwise forward. Returns nil if nothing is found.","arglist":["forward","thing"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-char-2-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-char-2-above'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be repeatable.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-move-cursor-back":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether the cursor is moved backwards when exiting insert state.\nIf non-nil, the cursor moves \"backwards\" when exiting insert state,\nso that it ends up on the character to the left. Otherwise it remains\nin place, on the character to the right.","fn-docstring":"Move point one character back within the current line.\nContingent on the variable `evil-move-cursor-back' or the FORCE\nargument. Honors field boundaries, i.e., constrains the movement\nto the current field as recognized by `line-beginning-position'.","arglist":["&optional","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ace-jump-exit-recursive-edit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exit a recursive edit caused by an evil jump.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-make-selection":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a Visual selection with point at POINT and mark at MARK.\nThe boundaries of the selection are inferred from these\nand the current TYPE. To specify the boundaries and infer\nmark and point, use `evil-visual-select' instead.","arglist":["mark","point","&optional","type","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-definition":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to definition or first occurrence of symbol under point.\nSee also `evil-goto-definition-functions'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-flash-search-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Flash last search matches for duration of `evil-flash-delay'.\nIf ALL is non-nil, flash all matches. STRING is a message\nto display in the echo area.","arglist":["string","&optional","all"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last executed register.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-put-command-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set PROPERTY to VALUE for COMMAND.\nTo set multiple properties at once, see\n`evil-set-command-properties' and `evil-add-command-properties'.","arglist":["command","property","value"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-get-command-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return all Evil properties of COMMAND.\nSee also `evil-get-command-property'.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-different-buffer-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the buffer has changed in a repeat.\nIf STRICT is non-nil, returns t if the previous buffer\nis unknown; otherwise returns t only if the previous\nbuffer is known and different from the current buffer.","arglist":["&optional","strict"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the window of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-setup":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Initialize Ex minibuffer.\nThis function registers several hooks that are used for the\ninteractive actions during ex state.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-range-beginning":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set RANGE's beginning to BEG.\nIf COPY is non-nil, return a copy of RANGE.","arglist":["range","beg","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-member-recursive-if":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find the first item satisfying PREDICATE in TREE.","arglist":["predicate","tree"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-posn-x-y":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the x and y coordinates in POSITION.\nThis function returns y offset from the top of the buffer area including\nthe header line.\n\nOn Emacs 24 and later versions, the y-offset returned by\n`posn-at-point' is relative to the text area excluding the header\nline, while y offset taken by `posn-at-x-y' is relative to the buffer\narea including the header line. This asymmetry is by design according\nto GNU Emacs team. This function fixes the asymmetry between them.\n\nLearned from mozc.el.","arglist":["position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-flash-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Disable hightlighting if `this-command' is not search.\nDisable anyway if FORCE is t.","arglist":["&optional","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-count":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The explicit count passed to an command starting Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-with-active-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY with an active region from BEG to END.","arglist":["beg","end","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-operator-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-recording-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns non-nil iff a recording is in progress.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-open-fold-rec":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open fold at point recursively.\nSee also `evil-open-fold' and `evil-close-fold'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-key*":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a STATE binding from KEY to DEF for KEYMAP.\nSTATE is one of normal, insert, visual, replace, operator,\nmotion, emacs, or a list of one or more of these. Omitting a\nstate by using nil corresponds to a standard Emacs binding using\n`define-key' The remaining arguments are like those of\n`define-key'. For example:\n\n (evil-define-key* 'normal foo-map \"a\" 'bar)\n\nThis creates a binding from \"a\" to bar in Normal state, which\nis active whenever foo-map is active. Using nil for the state,\nthe following are equivalent:\n\n (evil-define-key* nil foo-map \"a\" 'bar)\n\n (define-key foo-map \"a\" 'bar)\n\n It is possible to specify multiple states and/or bindings at\n once:\n\n (evil-define-key* '(normal visual) foo-map\n \"a\" 'bar\n \"b\" 'foo)\n\nKEYMAP may also be a quoted symbol. If the symbol is global, the\nglobal evil keymap corresponding to the state(s) is used, meaning\nthe following are equivalent:\n\n (evil-define-key* 'normal 'global \"a\" 'bar)\n\n (evil-global-set-key 'normal \"a\" 'bar)\n\nThe symbol local may also be used, which corresponds to using\n`evil-local-set-key'.\n\nThe use is nearly identical to `evil-define-key' with the\nexception that this is a function and not a macro (and so will\nnot be expanded when compiled which can have unintended\nconsequences). `evil-define-key*' also does not defer any\nbindings like `evil-define-key' does using `evil-delay'. This\nallows errors in the bindings to be caught immediately, and makes\nits behavior more predictable.","arglist":["state","keymap","key","def","&rest","bindings"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-sentence":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a sentence.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-prev-flyspell-error":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the COUNT'th spelling mistake preceding point.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-bottom-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to bottom-right window.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil--show-jumps-select-action":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["jump"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-get-jumps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["struct"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-remove-default":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Remove the default text shown in the ex minibuffer.\nWhen ex starts, the previous command is shown enclosed in\nparenthesis. This function removes this text when the first key\nis pressed.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-range-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set RANGE's properties to PROPERTIES.\nIf COPY is non-nil, return a copy of RANGE.","arglist":["range","properties","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open a command line window for HIST with CMD-KEY and EXECUTE-FN.\nHIST should be a list of commands. CMD-KEY should be the string of\nthe key whose history is being shown (one of \":\", \"/\", or\n\"?\"). EXECUTE-FN should be a function of one argument to\nexecute on the result that the user selects.","arglist":["hist","cmd-key","execute-fn"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Operator-Pending state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-state-modes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Modes that should come up in Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-avy-goto-symbol-1-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-symbol-1-below'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-screen-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"*Linewise selection in `visual-line-mode'.","fn-docstring":"Linewise selection in `visual-line-mode'.","arglist":["&optional","mark","point","type","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-disabled-buffer-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether Evil should be disabled in BUFFER.","arglist":["&optional","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-undo-pop":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Undo the last buffer change.\nRemoves the last undo information from `buffer-undo-list'.\nIf undo is disabled in the current buffer, use the information\nin `evil-temporary-undo' instead.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-bottom":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to line COUNT from the bottom of the window\non the first non-blank character.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-mode-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for `evil-command-window-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-command-window-execute":"<insert-state> RET","evil-command-window-execute":"<insert-state> RET"}},"evil-change-whole-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change whole line.","arglist":["beg","end","&optional","type","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-split-search-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Split PATTERN in regexp, offset and next-pattern parts.\nReturns a triple (regexp offset next-search).","arglist":["pattern","direction"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-overlays":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the list of active overlays of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-line-to-bottom":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls line number COUNT (or the cursor line) to the bottom of the window.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-visual-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restores a character visual selection.\nIf the selection is in a single line, the restored visual\nselection covers the same number of characters. If the selection\ncovers several lines, the restored selection covers the same\nnumber of lines and the same number of characters in the last\nline as the original selection.","arglist":["nfwdlines","nfwdchars"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-concat-charsets":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate character sets.\nA character set is the part between [ and ] in a regular expression.\nIf any character set is complemented, the result is also complemented.","arglist":["&rest","sets"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inclusive-expand":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform expand transformation on inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-get-marker":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the marker denoted by CHAR.\nThis is either a marker object as returned by `make-marker',\na number, a cons cell (FILE . POS) with FILE being a string\nand POS a number, or nil. If RAW is non-nil, then the\nreturn value may also be a variable, a movement function,\nor a marker object pointing nowhere.","arglist":["char","&optional","raw"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-turn-on-undo-tree-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-block":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"*Blockwise selection.","fn-docstring":"Blockwise selection.","arglist":["&optional","mark","point","type","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-space":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-next-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT screen lines down.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-minor-mode-keymap-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether MAP is a minor-mode keymap.","arglist":["map"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-initial-input":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Additional initial content of the ex command line.\nThis content of this variable is appended to the ex command line\nif ex is started interactively.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-command-window-execute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["config","result"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-global":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"If non-nil substitute patterns are global by default.\nUsually (if this variable is nil) a substitution works only on\nthe first match of a pattern in a line unless the 'g' flag is\ngiven, in which case the substitution happens on all matches in a\nline. If this option is non-nil, this behaviour is reversed: the\nsubstitution works on all matches unless the 'g' pattern is\nspecified, then is works only on the first match.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-want-C-d-scroll":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether `C-d' scrolls down (like Vim).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-emacs-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Emacs state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-find-char-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the previous COUNT'th occurrence of CHAR.","arglist":["&optional","count","char"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-type-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether SYM is the name of a type.","arglist":["sym"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-echo-area-restore":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restore the echo area from `evil-echo-area-message'.\nDoes not restore if `evil-write-echo-area' is non-nil.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-state-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the value of property PROP for STATE.\nPROP is a keyword as used by `evil-define-state'.\nSTATE is the state's symbolic name.\nIf VALUE is non-nil and the value is a variable,\nreturn the value of that variable.","arglist":["state","prop","&optional","value"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-substitute-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last substitute pattern.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-refresh-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Refresh the cursor for STATE in BUFFER.\nBUFFER defaults to the current buffer. If STATE is nil the\ncursor type is either `evil-force-cursor' or the current state.","arglist":["&optional","state","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-local-mode-off-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-forward-syntax":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of a sequence of characters in\nSYNTAX.\nStop on reaching a character not in SYNTAX.","arglist":["syntax","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last search pattern.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-repeat-substitute-with-flags":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat last substitute command with last flags.\nThis is the same as :s//~/&","arglist":["beg","end","&optional","flags"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-idle-update":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Triggers the timer to update the highlights in the current buffer.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-flash-delay":{"default":2,"local":null,"default-type":"integer","var-docstring":"\\<evil-motion-state-map>\nTime in seconds to flash search matches after \\[evil-search-next] and \\[evil-search-previous].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--ex-remove-echo-overlay":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Remove echo overlay from ex minibuffer.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-shift-left-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shift the current line COUNT times to the left.\nThe text is shifted to the nearest multiple of\n`evil-shift-width'. Like `evil-shift-left' but always works on\nthe current line.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-lookup-func":{"default":"woman","local":null,"default-type":"symbol","var-docstring":"Lookup function used by \"\\<evil-motion-state-map>\\[evil-lookup]\".","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-backward-section-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the COUNT-th previous section.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-interactive-search-highlight":{"default":"all-windows","local":null,"default-type":"symbol","var-docstring":"Determine in which windows the interactive highlighting should be shown.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-make-intercept-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Give KEYMAP precedence over all Evil keymaps in STATE.\nIf STATE is nil, give it precedence over all states. If AUX is non-nil, make the\nauxiliary keymap corresponding to KEYMAP in STATE an intercept keymap instead of\nKEYMAP itself. See also `evil-make-overriding-map'.","arglist":["keymap","&optional","state","aux"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-vsplit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits the current window vertically, COUNT columns width,\nediting a certain FILE. The new window will be created to the\nright when `evil-vsplit-window-right' is non-nil. If COUNT and\n`evil-auto-balance-windows'are both non-nil then all children\nof the parent of the splitted window are rebalanced.","arglist":["&optional","count","file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-local-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Evil-Local mode is enabled.\nUse the command `evil-local-mode' to change this variable.","fn-docstring":"Minor mode for setting up Evil in a single buffer.\n\nIf called interactively, enable Evil-Local mode if ARG is\npositive, and disable it if ARG is zero or negative. If called\nfrom Lisp, also enable the mode if ARG is omitted or nil, and\ntoggle it if ARG is `toggle'; disable the mode otherwise.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-state-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a keymap alist of keymaps activated by STATE.\nIf STATE references other states in its :enable property,\nthese states are recursively processed and added to the list.\n(The EXCLUDED argument is an internal safeguard against\ninfinite recursion, keeping track of processed states.)","arglist":["state","&rest","excluded"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-block-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return size of block from BEG to END with PROPERTIES.\n\nLike `inclusive', but for rectangles:\nthe last column is included.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-char-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Characterwise selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-echo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Display an unlogged message in the echo area.\nThat is, the message is not logged in the *Messages* buffer.\n(To log the message, just use `message'.)","arglist":["string","&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-cjk-emacs-word-boundary":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Determine word boundary exactly the same way as Emacs does.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-motions":{"default":"(back-to-indentation backward-char backward-list backward-paragraph backward-sentence backward-sexp backward-up-list backward-word beginning-of-buffer beginning-of-defun beginning-of-line beginning-of-visual-line c-beginning-of-defun c-end-of-defun diff-file-next diff-file-prev diff-hunk-next diff-hunk-prev down-list end-of-buffer end-of-defun end-of-line end-of-visual-line exchange-point-and-mark forward-char forward-list forward-paragraph forward-sentence forward-sexp forward-word goto-last-change ibuffer-backward-line ibuffer-forward-line isearch-abort isearch-cancel isearch-complete isearch-del-char isearch-delete-char isearch-edit-string isearch-exit isearch-highlight-regexp isearch-occur isearch-other-control-char isearch-other-meta-char isearch-printing-char isearch-query-replace isearch-query-replace-regexp isearch-quote-char isearch-repeat-backward isearch-repeat-forward isearch-ring-advance isearch-ring-retreat isearch-toggle-case-fold isearch-toggle-input-method isearch-toggle-regexp isearch-toggle-specified-input-method isearch-toggle-word isearch-yank-char isearch-yank-kill isearch-yank-line isearch-yank-word-or-char keyboard-quit left-char left-word mouse-drag-region mouse-save-then-kill mouse-set-point mouse-set-region mwheel-scroll move-beginning-of-line move-end-of-line next-error next-line paredit-backward paredit-backward-down paredit-backward-up paredit-forward paredit-forward-down paredit-forward-up pop-global-mark pop-tag-mark pop-to-mark-command previous-error previous-line right-char right-word scroll-down scroll-down-command scroll-up scroll-up-command sgml-skip-tag-backward sgml-skip-tag-forward up-list)","local":null,"default-type":"cons","var-docstring":"Non-Evil commands to initialize to motions.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-motion-loop":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Loop a certain number of times.\nEvaluate BODY repeatedly COUNT times with VAR bound to 1 or -1,\ndepending on the sign of COUNT. RESULT, if specified, holds\nthe number of unsuccessful iterations, which is 0 if the loop\ncompletes successfully. This is also the return value.\n\nEach iteration must move point; if point does not change,\nthe loop immediately quits. See also `evil-loop'.\n\n(fn (VAR COUNT [RESULT]) BODY...)","arglist":["spec","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-register-list":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns an alist of all registers, but only those named\nwith number or character. Registers with symbol or string in names are ignored\nto keep Vim compatibility with register jumps.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-make-overriding-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Give KEYMAP precedence over the global keymap of STATE.\nThe keymap will have lower precedence than custom STATE bindings.\nIf STATE is nil, give it precedence over all states.\nIf COPY is t, create a copy of KEYMAP and give that\nhigher precedence. See also `evil-make-intercept-map'.","arglist":["keymap","&optional","state","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-switch-to-windows-last-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to current windows last open buffer.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-interactive-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evaluate the interactive string STRING.\nThe string may contain extended interactive syntax.\nThe return value is a cons cell (FORM . PROPERTIES),\nwhere FORM is a single list-expression to be passed to\na standard `interactive' statement, and PROPERTIES is a\nlist of command properties as passed to `evil-define-command'.","arglist":["string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move COUNT - 1 lines down.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-sort-completions":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["completions"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-match":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Replace text match by last search with REPLACEMENT.\nIf REPLACEMENT is an expression it will be evaluated to compute\nthe replacement text, otherwise the function behaves as\n`replace-match'.","arglist":["replacement","&optional","fixedcase","string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-keybindings":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-sort":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Place the smallest value in MIN and the largest in MAX.\nIf three or more arguments are given, place the smallest\nvalue in the first argument and the largest in the last,\nsorting in between.","arglist":["min","max","&rest","vars"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-digraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Convert DIGRAPH to character or list representation.\nIf DIGRAPH is a list (CHAR1 CHAR2), return the corresponding character;\nif DIGRAPH is a character, return the corresponding list.\nSearches in `evil-digraphs-table-user' and `evil-digraphs-table'.","arglist":["digraph"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-filter-list":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete by side-effect all items satisfying PREDICATE in LIST.\nStop when reaching POINTER. If the first item satisfies PREDICATE,\nthere is no way to remove it by side-effect; therefore, write\n(setq foo (evil-filter-list 'predicate foo)) to be sure of\nchanging the value of `foo'.","arglist":["predicate","list","&optional","pointer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-show-files":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shows the file-list.\nThe same as `buffer-menu', but shows only buffers visiting\nfiles.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-types":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-previous":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Goes the the previous occurrence.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-increase-height":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Increase current window height by COUNT.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-bang":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The \"!\" argument of the current Ex command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-swap-out-markers":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Turn markers into file references when the buffer is killed.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-previous-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT lines up.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-invert-case":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Invert case of text.","arglist":["beg","end","&optional","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-write":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the current buffer, from BEG to END, to FILE-OR-APPEND.\nIf FILE-OR-APPEND is of the form \">> FILE\", append to FILE\ninstead of overwriting. The current buffer's filename is not\nchanged unless it has no associated file and no region is\nspecified. If the file already exists and the BANG argument is\nnon-nil, it is overwritten without confirmation.","arglist":["beg","end","&optional","type","file-or-append","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-activate-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Visual state if the region is activated.","arglist":["&optional","_command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-goto-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the last line of the Visual selection.\nThis position may differ from `evil-visual-end' depending on\nthe selection type, and is contained in the selection.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define a motion command MOTION.\nARGS is a list of arguments. Motions can have any number of\narguments, but the first (if any) has the predefined meaning of\ncount. BODY must execute the motion by moving point.\n\nOptional keyword arguments are:\n- `:type' - determines how the motion works after an operator (one of\n `inclusive', `line', `block' and `exclusive', or a self-defined\n motion type)\n- `:jump' - if non-nil, the previous position is stored in the jump\n list, so that it can be restored with \\<evil-motion-state-map>\\[evil-jump-backward]\n\n(fn MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)","arglist":["motion","args","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil--self-insert-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Insert STRING as if typed interactively.","arglist":["string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mouse--drag-set-mark-and-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["start","click","click-count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-up":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to new COUNT-th window above the current one.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-auto-balance-windows":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If non-nil window creation and deletion trigger rebalancing.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-edit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open FILE.\nIf no FILE is specified, reload the current buffer from disk.","arglist":["file","&optional","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-move-beginning":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the beginning of the COUNT next object.\nIf COUNT is negative, move to the COUNT previous object.\nFORWARD is a function which moves to the end of the object, and\nBACKWARD is a function which moves to the beginning.\nIf one is unspecified, the other is used with a negative argument.","arglist":["count","forward","&optional","backward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-line-to-top":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls line number COUNT (or the cursor line) to the top of the window.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-char-2-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-char-2-below'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-magic":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Meaning which characters in a pattern are magic.\nThe meaning of those values is the same as in Vim. Note that it\nonly has influence if the Evil search module is chosen in\n`evil-search-module'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-column":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the horizontal position of POS.\nPOS defaults to point.","arglist":["&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-compile-subreplacement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Convert a regexp replacement TO to Lisp from START until \\e or \\E.\nReturns a pair (RESULT . REST). RESULT is a list suitable for\n`perform-replace' if necessary, the original string if not.\nREST is the unparsed remainder of TO.","arglist":["to","&optional","start"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-copy-chars-from-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return N characters from line NUM, starting at column COL.\nNUM is relative to the current line and can be negative.\nCOL defaults to the current column.","arglist":["n","num","&optional","col"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-find-file-at-point-with-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Opens the file at point and goes to line-number.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-toggle-fold":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open or close a fold under point.\nSee also `evil-open-fold' and `evil-close-fold'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-with-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change to STATE and execute BODY without refreshing the display.\nRestore the previous state afterwards.","arglist":["state","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-set-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the contents of register REGISTER to TEXT.\nIf REGISTER is an upcase character then text is appended to that\nregister instead of replacing its content.","arglist":["register","text"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-abort":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Cancel ex state when another buffer is selected.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-make-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a new search pattern.\nREGEXP is the regular expression to be searched for. CASE should\nbe either 'sensitive, 'insensitive for case-sensitive and\ncase-insensitive search, respectively, or anything else. In the\nlatter case the pattern is smart-case, i.e. it is automatically\nsensitive of the pattern contains one upper case letter,\notherwise it is insensitive. The input REGEXP is considered a\nVim-style regular expression if `evil-ex-search-vim-style-regexp'\nis non-nil, in which case it is transformed to an Emacs style\nregular expression (i.e. certain backslash-codes are\ntransformed. Otherwise REGEXP must be an Emacs style regular\nexpression and is not transformed.","arglist":["regexp","case","whole-line"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-enclose-ace-jump-for-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enclose ace-jump to make it suitable for motions.\nThis includes restricting `ace-jump-mode' to the current window\nin visual and operator state, deactivating visual updates, saving\nthe mark and entering `recursive-edit'.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-paste-after":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Pastes the latest yanked text behind point.\nThe return value is the yanked text.","arglist":["count","&optional","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-range-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether OBJECT is a range.","arglist":["object"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-select-an-object":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return an outer text object range of COUNT objects.\nIf COUNT is positive, return objects following point; if COUNT is\nnegative, return objects preceding point. If one is unspecified,\nthe other is used with a negative argument. THING is a symbol\nunderstood by thing-at-point. BEG, END and TYPE specify the\ncurrent selection. If LINE is non-nil, the text object should be\nlinewise, otherwise it is character wise.","arglist":["thing","beg","end","type","count","&optional","line"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-char-2":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-char-2'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-initialize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Evil in the current buffer, if appropriate.\nTo enable Evil globally, do (evil-mode 1).","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-find-char-to-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move before the previous COUNT'th occurrence of CHAR.","arglist":["&optional","count","char"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hook run after entering or leaving `evil-mode'.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-select-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a range (BEG END) of COUNT quoted text objects.\nQUOTE specifies the quotation delimiter. BEG END TYPE are the\ncurrently selected (visual) range.\n\nIf INCLUSIVE is nil the previous selection is ignore. If there is\nquoted string at point this object will be selected, otherwise\nthe following (if (> COUNT 0)) or preceeding object (if (< COUNT\n0)) is selected. If (/= (abs COUNT) 2) the delimiting quotes are not\ncontained in the range, otherwise they are contained in the range.\n\nIf INCLUSIVE is non-nil the selection depends on the previous\nselection. If the currently selection contains at least one\ncharacter that is contained in a quoted string then the selection\nis extended, otherwise it is thrown away. If there is a\nnon-selected object at point then this object is added to the\nselection. Otherwise the selection is extended to the\nfollowing (if (> COUNT 0)) or preceeding object (if (< COUNT\n0)). Any whitespace following (or preceeding if (< COUNT 0)) the\nnew selection is added to the selection. If no such whitespace\nexists and the selection contains only one quoted string then the\npreceeding (or following) whitespace is added to the range. ","arglist":["quote","beg","end","type","count","&optional","inclusive"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-digraphs":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the next window in the cyclic order.\nWith COUNT go to the count-th window in the order starting from\ntop-left.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-start-undo-step":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Start a undo step.\nAll following buffer modifications are grouped together as a\nsingle action. If CONTINUE is non-nil, preceding modifications\nare included. The step is terminated with `evil-end-undo-step'.","arglist":["&optional","continue"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-word-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the COUNT-th next word.\nIf BIGWORD is non-nil, move by WORDS.\n\nIf this command is called in operator-pending state it behaves\ndifferently. If point reaches the beginning of a word on a new\nline point is moved back to the end of the previous line.\n\nIf called after a change operator, i.e. cw or cW,\n`evil-want-change-word-to-end' is non-nil and point is on a word,\nthen both behave like ce or cE.\n\nIf point is at the end of the buffer and cannot be moved signal\n'end-of-buffer is raised.\n","arglist":["&optional","count","bigword"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-previous-func":{"default":"(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (require 'dabbrev) (let ((dabbrev-search-these-buffers-only (if evil-complete-all-buffers nil (list (current-buffer)))) dabbrev-case-distinction) (dabbrev-expand arg)))","local":null,"default-type":"cons","var-docstring":"Completion function used by \\<evil-insert-state-map>\\[evil-complete-previous].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-default-cursor":{"default":"t","local":null,"default-type":"symbol","var-docstring":"The default cursor.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for window-related commands.","fn-docstring":"Prefix command (definition is a keymap associating keystrokes with commands).","arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"ffap-other-window":"C-f","evil-window-set-height":"C-_","evil-window-prev":"W","evil-window-next":"C-w","evil-window-vsplit":"C-v","evil-window-top-left":"C-t","evil-window-split":"C-s","evil-window-split":"C-s","evil-window-rotate-upwards":"R","evil-window-rotate-downwards":"C-r","evil-window-mru":"C-p","delete-other-windows":"C-o","evil-window-new":"C-n","evil-window-move-far-right":"L","evil-window-move-very-top":"K","evil-window-move-very-bottom":"J","evil-window-move-far-left":"H","evil-window-delete":"C-c","evil-window-bottom-right":"C-b","evil-window-set-width":"|","balance-windows":"=","evil-window-increase-width":">","evil-window-decrease-width":"<","evil-window-set-height":"C-_","evil-window-decrease-height":"-","evil-window-increase-height":"+","evil-window-prev":"W","evil-window-next":"C-w","evil-window-vsplit":"C-v","evil-window-top-left":"C-t","evil-window-split":"C-s","evil-window-split":"C-s","evil-window-rotate-upwards":"R","evil-window-rotate-downwards":"C-r","evil-quit":"q","evil-window-mru":"C-p","delete-other-windows":"C-o","evil-window-new":"C-n","evil-window-move-far-right":"L","evil-window-right":"l","evil-window-move-very-top":"K","evil-window-up":"k","evil-window-move-very-bottom":"J","evil-window-down":"j","evil-window-move-far-left":"H","evil-window-left":"h","evil-window-delete":"C-c","evil-window-bottom-right":"C-b"}},"evil-backward-WORD-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the COUNT-th previous WORD.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-state-modes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Modes that should come up in Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-argument":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The current argument of the Ex command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Visual state is enabled.\nUse the command `evil-visual-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ret-and-indent":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT lines down.\nIf point is on a widget or a button, click on it.\nIn Insert state, insert a newline and indent.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-apply-on-block":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Call FUNC for each line of a block selection.\nThe selection is specified by the region BEG and END. FUNC must\ntake at least two arguments, the beginning and end of each\nline. If PASS-COLUMNS is non-nil, these values are the columns,\notherwise tey are buffer positions. Extra arguments to FUNC may\nbe passed via ARGS.","arglist":["func","beg","end","pass-columns","&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-max":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the largest position in POSITIONS.\nNon-numerical elements are ignored.\nSee also `evil-goto-min'.","arglist":["&rest","positions"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the :repeat property of COMMAND.\nIf COMMAND doesn't have this property, return DEFAULT.","arglist":["command","&optional","default"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-bracket":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a square bracket.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-last-was-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Non-nil if the previous was a search.\nOtherwise the previous command is assumed as substitute.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-signal-without-movement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Catches errors provided point moves within this scope.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-next-close-paren":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to [count] next unmatched ')'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-C-w-delete":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether `C-w' deletes a word in Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-exclusive-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return size of exclusive from BEG to END with PROPERTIES.\n\nReturn the positions unchanged, with some exceptions.\nIf the end position is at the beginning of a line, then:\n\n* If the beginning position is at or before the first non-blank\n character on the line, return `line' (expanded).\n\n* Otherwise, move the end position to the end of the previous\n line and return `inclusive' (expanded).","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-insertion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last piece of inserted text.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-goto-min":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the smallest position in POSITIONS.\nNon-numerical elements are ignored.\nSee also `evil-goto-max'.","arglist":["&rest","positions"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank-rectangle":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves the rectangle defined by region BEG and END into the kill-ring.","arglist":["beg","end","&optional","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-without-display":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY without Evil displays.\nInhibits echo area messages, mode line updates and cursor changes.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-replace-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Replace state is enabled.\nUse the command `evil-replace-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-find-symbol":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return word near point as a string.\nIf FORWARD is nil, search backward, otherwise forward. Returns\nnil if nothing is found.","arglist":["forward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-parse-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse STRING as an Ex binding.","arglist":["string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-mru":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the previous (last accessed) buffer in another window.\nMore precisely, it selects the most recently used buffer that is\nshown in some other window, preferably of the current frame, and\nis different from the current one.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-on-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-set-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the type of OBJECT to TYPE.\nFor example, (evil-set-type 'next-line 'line)\nwill make `line' the type of the `next-line' command.","arglist":["object","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-full-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for a full search pattern PATTERN-STRING in DIRECTION.\nThis function split PATTERN-STRING in\npattern/offset/;next-pattern parts and performs the search in\nDIRECTION which must be either 'forward or 'backward. The first\nsearch is repeated COUNT times. If the pattern part of\nPATTERN-STRING is empty, the last global pattern stored in\n`evil-ex-search-pattern' is used instead if in addition the\noffset part is nil (i.e. no pattern/offset separator), the last\nglobal offset stored in `evil-ex-search-offset' is used as\noffset. The current match data will correspond to the last\nsuccessful match. This function returns a triple (RESULT PATTERN\nOFFSET) where RESULT is\n\n t the search has been successful without wrap\n 'wrap the search has been successful with wrap\n 'empty-pattern the last pattern has been empty\n nil the search has not been successful\n\nand PATTERN and OFFSET are the last pattern and offset this\nfunction searched for. Note that this function does not handle\nany error conditions.","arglist":["pattern-string","count","direction"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-new":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits the current window horizontally\nand opens a new buffer or edits a certain FILE.","arglist":["count","file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-marker":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Marker for storing the starting position of a motion.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-range-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Type of `evil-operator-range'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-previous-open-paren":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to [count] previous unmatched '('.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-C-u-delete":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether `C-u' deletes back to indentation in insert state.\nOtherwise, `C-u' applies a prefix argument. The binding of\n`C-u' mirrors Emacs behaviour by default due to the relative\nubiquity of prefix arguments.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--mode-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Determines whether any symbol in MODES represents the current\nbuffer's major mode or any of its minors.","arglist":["modes"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-interactive-form":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evaluate interactive forms ARGS.\nThe return value is a cons cell (FORM . PROPERTIES),\nwhere FORM is a single list-expression to be passed to\na standard `interactive' statement, and PROPERTIES is a\nlist of command properties as passed to `evil-define-command'.","arglist":["&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-jumping":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-exchange-point-and-mark":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exchange point and mark without activating the region.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-definition-functions":{"default":"(evil-goto-definition-imenu evil-goto-definition-semantic evil-goto-definition-xref evil-goto-definition-search)","local":null,"default-type":"cons","var-docstring":"List of functions run until success by `evil-goto-definition'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-with-undo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY with enabled undo.\nIf undo is disabled in the current buffer, the undo information\nis stored in `evil-temporary-undo' instead of `buffer-undo-list'.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-macro-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The buffer that has been active on macro recording.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-ignored-file-patterns":{"default":"(\"COMMIT_EDITMSG$\" \"TAGS$\")","local":null,"default-type":"cons","var-docstring":"A list of pattern regexps to match on the file path to exclude from being included in the jump list.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-goto-definition-xref":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find definition at POSITION with xref.","arglist":["_string","position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-track-eol":{"default":"t","local":null,"default-type":"symbol","var-docstring":"\\<evil-motion-state-map>\nWhether \\[evil-end-of-line] \"sticks\" the cursor to the end of the line.\nIf non-nil, vertical motions after \\[evil-end-of-line] maintain the cursor at the\nend of the line, even if the target line is longer. This is analogous\nto `track-eol', but respects Evil's interpretation of end-of-line.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-completion-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Completion keymap for Ex.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"exit-minibuffer":"RET","exit-minibuffer":"RET","next-history-element":"<next>","previous-history-element":"<prior>","next-complete-history-element":"C-n","previous-complete-history-element":"C-p","forward-word":"M-f","backward-word":"M-b","abort-recursive-edit":"C-g","backward-kill-word":"C-w","quoted-insert":"C-v","evil-delete-whole-line":"C-u","next-complete-history-element":"C-n","evil-paste-from-register":"C-r","previous-complete-history-element":"C-p","evil-ex-completion":"C-l","evil-insert-digraph":"C-k","abort-recursive-edit":"C-g","evil-ex-command-window":"C-f","evil-ex-completion":"C-l","abort-recursive-edit":"C-g","move-beginning-of-line":"C-b","evil-ex-completion":"C-l","evil-ex-completion":"C-l","evil-ex-completion":"C-l","evil-ex-completion":"C-l","evil-ex-delete-backward-char":"DEL"}},"evil-command-window-draw-prefix":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Display `evil-command-window-cmd-key' as a prefix to the current line.\nParameters passed in through IGNORED are ignored.","arglist":["&rest","ignored"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-state":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The current Evil state.\nTo change the state, use `evil-change-state'\nor call the state function (e.g., `evil-normal-state').","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-forward-not-thing":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of the complement of THING.","arglist":["thing","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-send-localleader":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Put symbol localleader in `unread-command-events' to trigger any\n<localleader> bindings.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-for-keymap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the minor mode associated with KEYMAP.\nReturns DEFAULT if no mode is found.\nSee also `evil-keymap-for-mode'.","arglist":["keymap","&optional","default"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-command-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Replace all of COMMAND's properties with PROPERTIES.\nPROPERTIES should be a property list.\nThis erases all previous properties; to only add properties,\nuse `evil-set-command-property'.","arglist":["command","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-concatenate-interactive-forms":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate interactive list expressions FORMS.\nReturns a single expression where successive expressions\nare joined, if possible.","arglist":["&rest","forms"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-signed-number":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a signed number like -3 and +1.\nNUMBER defaults to 1.","arglist":["sign","&optional","number"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-delimited-arguments":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse STRING as a sequence of delimited arguments.\nReturns a list of NUM strings, or as many arguments as\nthe string contains. The first non-blank character is\ntaken to be the delimiter. If some arguments are missing\nfrom STRING, the resulting list is padded with nil values.\nTwo delimiters following directly after each other gives\nan empty string.","arglist":["string","&optional","num"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-completion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Completes the current ex command or argument.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-use-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Use REGISTER for the next command.","arglist":["register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-modes":{"default":"(5x5-mode archive-mode bbdb-mode biblio-selection-mode blackbox-mode bookmark-bmenu-mode bookmark-edit-annotation-mode browse-kill-ring-mode bubbles-mode bzr-annotate-mode calc-mode cfw:calendar-mode completion-list-mode Custom-mode custom-theme-choose-mode debugger-mode delicious-search-mode desktop-menu-blist-mode desktop-menu-mode doc-view-mode dun-mode dvc-bookmarks-mode dvc-diff-mode dvc-info-buffer-mode dvc-log-buffer-mode dvc-revlist-mode dvc-revlog-mode dvc-status-mode dvc-tips-mode ediff-mode ediff-meta-mode efs-mode Electric-buffer-menu-mode emms-browser-mode emms-mark-mode emms-metaplaylist-mode emms-playlist-mode ess-help-mode etags-select-mode fj-mode gc-issues-mode gdb-breakpoints-mode gdb-disassembly-mode gdb-frames-mode gdb-locals-mode gdb-memory-mode gdb-registers-mode gdb-threads-mode gist-list-mode git-rebase-mode gnus-article-mode gnus-browse-mode gnus-group-mode gnus-server-mode gnus-summary-mode gomoku-mode google-maps-static-mode ibuffer-mode jde-javadoc-checker-report-mode magit-cherry-mode magit-diff-mode magit-log-mode magit-log-select-mode magit-popup-mode magit-popup-sequence-mode magit-process-mode magit-reflog-mode magit-refs-mode magit-revision-mode magit-stash-mode magit-stashes-mode magit-status-mode mh-folder-mode monky-mode mpuz-mode mu4e-main-mode mu4e-headers-mode mu4e-view-mode notmuch-hello-mode notmuch-search-mode notmuch-show-mode notmuch-tree-mode occur-mode org-agenda-mode package-menu-mode pdf-outline-buffer-mode pdf-view-mode proced-mode rcirc-mode rebase-mode recentf-dialog-mode reftex-select-bib-mode reftex-select-label-mode reftex-toc-mode sldb-mode slime-inspector-mode slime-thread-control-mode slime-xref-mode snake-mode solitaire-mode sr-buttons-mode sr-mode sr-tree-mode sr-virtual-mode tar-mode tetris-mode tla-annotate-mode tla-archive-list-mode tla-bconfig-mode tla-bookmarks-mode tla-branch-list-mode tla-browse-mode tla-category-list-mode tla-changelog-mode tla-follow-symlinks-mode tla-inventory-file-mode tla-inventory-mode tla-lint-mode tla-logs-mode tla-revision-list-mode tla-revlog-mode tla-tree-lint-mode tla-version-list-mode twittering-mode urlview-mode vc-annotate-mode vc-dir-mode vc-git-log-view-mode vc-hg-log-view-mode vc-svn-log-view-mode vm-mode vm-summary-mode w3m-mode wab-compilation-mode xgit-annotate-mode xgit-changelog-mode xgit-diff-mode xgit-revlog-mode xhg-annotate-mode xhg-log-mode xhg-mode xhg-mq-mode xhg-mq-sub-mode xhg-status-extra-mode)","local":null,"default-type":"cons","var-docstring":"Modes that should come up in Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-defun":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-commands":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-yank-lines":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves the lines in the region BEG and END into the kill-ring.","arglist":["beg","end","&optional","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-pre-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Remember the character under point.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-C-w-in-emacs-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether `C-w' prefixes windows commands in Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-incrementally":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search incrementally for user-entered text.","arglist":["forward","regexp-p"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-record-position":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set `evil-repeat-pos' to POS or point.","arglist":["&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-insert-at-point-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be repeatable by buffer changes.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-get-substitute-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns the substitution info of command line STRING.\nThis function returns a three-element list (PATTERN REPLACEMENT\nFLAGS) consisting of the substitution parts of STRING. PATTERN is\na ex-pattern (see `evil-ex-make-pattern') and REPLACEMENT in a\ncompiled replacement expression (see `evil-compile-replacement').\nThe information returned is the actual substitution information\nw.r.t. to special situations like empty patterns or repetition of\nprevious substitution commands. If IMPLICIT-R is non-nil, then\nthe flag 'r' is assumed, i.e. in the case of an empty pattern the\nlast search pattern is used. This will be used when called from\na :substitute command with arguments.","arglist":["string","&optional","implicit-r"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-WORD":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner WORD.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Visual state is enabled.\nUse the command `evil-visual-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-inner-symbol":"i o","evil-inner-tag":"i t","evil-inner-back-quote":"i `","evil-inner-double-quote":"i \"","evil-inner-single-quote":"i '","evil-inner-angle":"i >","evil-inner-angle":"i >","evil-inner-curly":"i }","evil-inner-curly":"i }","evil-inner-curly":"i }","evil-inner-bracket":"i ]","evil-inner-bracket":"i ]","evil-inner-paren":"i )","evil-inner-paren":"i )","evil-inner-paren":"i )","evil-inner-paragraph":"i p","evil-inner-sentence":"i s","evil-inner-WORD":"i W","evil-inner-word":"i w","evil-a-symbol":"a o","evil-a-tag":"a t","evil-a-back-quote":"a `","evil-a-double-quote":"a \"","evil-a-single-quote":"a '","evil-an-angle":"a >","evil-an-angle":"a >","evil-a-curly":"a }","evil-a-curly":"a }","evil-a-curly":"a }","evil-a-bracket":"a ]","evil-a-bracket":"a ]","evil-a-paren":"a )","evil-a-paren":"a )","evil-a-paren":"a )","evil-a-paragraph":"a p","evil-a-sentence":"a s","evil-a-WORD":"a W","evil-a-word":"a w"}},"evil-jump-backward-swap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the previous position in jump list.\nThe current position is placed in the jump list.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mouse-word":{"default":"evil-word","local":null,"default-type":"symbol","var-docstring":"The thing-at-point symbol for double click selection.\nThe double-click starts visual state in a special word selection\nmode. This symbol is used to determine the words to be\nselected. Possible values are `evil-word' or `evil-WORD'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-struct-p--cmacro":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"compiler-macro for inlining `evil-jumps-struct-p'.","arglist":["_cl-whole-arg","cl-x"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-paste-from-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Paste from REGISTER.","arglist":["register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-concat-plists":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate property lists, removing duplicates.\nA property list is a list (:KEYWORD1 VALUE1 :KEYWORD2 VALUE2...)\nwhere each keyword may occur only once. Later values overwrite\nearlier values.","arglist":["&rest","sequences"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-re-bwd":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search backward for PATTERN.\nReturns the line number of the match.","arglist":["pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-loop":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Loop with countdown variable.\nEvaluate BODY with VAR counting down from COUNT to 0.\nCOUNT can be negative, in which case VAR counts up instead.\nThe return value is the value of VAR when the loop\nterminates, which is 0 if the loop completes successfully.\nRESULT specifies a variable for storing this value.\n\n(fn (VAR COUNT [RESULT]) BODY...)","arglist":["spec","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-inner-symbol":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner symbol.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to POSITION in the buffer.\nDefault position is the beginning of the buffer.","arglist":["position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The current Ex command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-persistent-highlight":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If non-nil matches remain highlighted when the search ends.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-range-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"End of `evil-operator-range'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-set-initial-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the initial state for the current major mode to STATE.\nThis is the state the buffer comes up in. See `evil-set-initial-state'.","arglist":["state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-invert-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Invert case of character.","arglist":["beg","end","&optional","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-split":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits the current window horizontally, COUNT lines height,\nediting a certain FILE. The new window will be created below\nwhen `evil-split-window-below' is non-nil. If COUNT and\n`evil-auto-balance-windows' are both non-nil then all children\nof the parent of the splitted window are rebalanced.","arglist":["&optional","count","file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-paragraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the end of the COUNT-th next paragraph.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-backward-char-and-join":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete previous character and join lines.\nIf point is at the beginning of a line then the current line will\nbe joined with the previous line if and only if\n`evil-backspace-join-lines'.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normalize-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a buffer-local value for `evil-mode-map-alist'.\nThis is a keymap alist, determined by the current state\n(or by STATE if specified).","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-column":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to column COUNT on the current line.\nColumns are counted from zero.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search backward for user-entered text.\nSearches for regular expression if `evil-regexp-search' is t.\n\nBelow is the documentation string for `isearch-forward',\nwhich lists available keys:\n\nDo incremental search forward.\nWith a prefix argument, do an incremental regular expression search instead.\n\nAs you type characters, they add to the search string and are found.\nThe following non-printing keys are bound in ‘isearch-mode-map’.\n\nType DEL to cancel last input item from end of search string.\nType RET to exit, leaving point at location found.\nType LFD (C-j) to match end of line.\nType C-s to search again forward, C-r to search again backward.\nType M-s M-< to go to the first match, M-s M-> to go to the last match.\nType C-w to yank next word or character in buffer\n onto the end of the search string, and search for it.\nType C-M-d to delete character from end of search string.\nType C-M-y to yank char from buffer onto end of search string and search for it.\nType C-M-z to yank from point until the next instance of a\n specified character onto end of search string and search for it.\nType M-s C-e to yank rest of line onto end of search string and search for it.\nType C-y to yank the last string of killed text.\nType M-y to replace string just yanked into search prompt\n with string killed before it.\nType C-q to quote control character to search for it.\nType C-x 8 RET to add a character to search by Unicode name, with completion.\nC-g while searching or when search has failed cancels input back to what has\n been found successfully.\nC-g when search is successful aborts and moves point to starting point.\n\nIf you try to exit with the search string still empty, it invokes\n nonincremental search.\n\nType M-s c to toggle search case-sensitivity.\nType M-s i to toggle search in invisible text.\nType M-s r to toggle regular-expression mode.\nType M-s w to toggle word mode.\nType M-s _ to toggle symbol mode.\nType M-s ' to toggle character folding.\n\nType M-s SPC to toggle whitespace matching.\nIn incremental searches, a space or spaces normally matches any whitespace\ndefined by the variable ‘search-whitespace-regexp’; see also the variables\n‘isearch-lax-whitespace’ and ‘isearch-regexp-lax-whitespace’.\n\nType M-s e to edit the search string in the minibuffer.\n\nAlso supported is a search ring of the previous 16 search strings.\nType M-n to search for the next item in the search ring.\nType M-p to search for the previous item in the search ring.\nType C-M-i to complete the search string using the search ring.\n\nType M-% to run ‘query-replace’ with string to replace from last search string.\nType C-M-% to run ‘query-replace-regexp’ with the last search string.\nType M-s o to run ‘occur’ that shows the last search string.\nType M-s h r to run ‘highlight-regexp’ that highlights the last search string.\nType M-s h l to run ‘highlight-lines-matching-regexp’ that highlights lines\n matching the last search string.\n\nType C-h b to display all Isearch key bindings.\nType C-h k to display documentation of Isearch key.\nType C-h m to display documentation of Isearch mode.\n\nIf an input method is turned on in the current buffer, that input\nmethod is also active while you are typing characters to search.\nTo toggle the input method, type C-\\. It also toggles the input\nmethod in the current buffer.\n\nTo use a different input method for searching, type C-^,\nand specify an input method you want to use.\n\nThe above keys, bound in ‘isearch-mode-map’, are often controlled by\n options; do M-x apropos on search-.* to find them.\nOther control and meta characters terminate the search\n and are then executed normally (depending on ‘search-exit-option’).\nLikewise for function keys and mouse button events.\n\nIf this function is called non-interactively with a nil NO-RECURSIVE-EDIT,\nit does not return to the calling function until the search is done.\nSee the function ‘isearch-mode’ for more information.\n\n(fn &optional REGEXP-P NO-RECURSIVE-EDIT)","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank-line-handler":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Inserts the current text linewise.","arglist":["text"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-mode-abbrev-table":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Abbrev table for `evil-command-window-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-changes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Accumulated buffer changes for changed-based commands.","fn-docstring":"Repeation recording function for commands that are repeated by buffer changes.","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Read a motion from the keyboard and return its buffer positions.\nThe return value is a list (BEG END), or (BEG END TYPE) if\nRETURN-TYPE is non-nil.","arglist":["&optional","return-type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-previous-mark":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The position of mark before Visual state, a marker.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-get-auxiliary-keymap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Get the auxiliary keymap for MAP in STATE.\nIf CREATE is non-nil, create an auxiliary keymap\nif MAP does not have one. If CREATE and\nIGNORE-PARENT are non-nil then a new auxiliary\nkeymap is created even if the parent of MAP has\none already.","arglist":["map","state","&optional","create","ignore-parent"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-last-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-line-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Linewise selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-swap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Swap the values of variables THIS and THAT.\nIf three or more arguments are given, the values are rotated.\nE.g., (evil-swap A B C) sets A to B, B to C, and C to A.","arglist":["this","that","&rest","vars"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-operator-shortcut-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\".","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-with-restriction":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY with the buffer narrowed to BEG and END.\nBEG or END may be nil as passed to `evil-narrow'; this creates\na one-sided restriction.","arglist":["beg","end","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-get-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return property PROP for KEY in ALIST.\nALIST is an association list with entries of the form\n(KEY . PLIST), where PLIST is a property list.\nIf PROP is nil, return all properties for KEY.\nIf KEY is t, return an association list of keys\nand their PROP values.","arglist":["alist","key","&optional","prop"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-write-echo-area":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"If set to t inside `evil-save-echo-area', then the echo area\nis not restored.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-struct-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["cl-x"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-line-up":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT lines upwards.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-member-if":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find the first item satisfying PREDICATE in LIST.\nStop when reaching POINTER, which should point at a link\nin the list.","arglist":["predicate","list","&optional","pointer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-exit-visual-and-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exit insert state and repeat event.\nThis special command should be used if some command called from\nvisual state should actually be called in normal-state. The main\nreason for doing this is that the repeat system should *not*\nrecord the visual state information for some command. This\ncommand should be bound to exactly the same event in visual state\nas the original command is bound in normal state. EVENT is the\nevent that triggered the execution of this command.","arglist":["event"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-make":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Call a build command in the current directory.\nIf ARG is nil this function calls `recompile', otherwise it calls\n`compile' passing ARG as build command.","arglist":["arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-buffer-new":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Creates a new buffer replacing the current window, optionally\n editing a certain FILE","arglist":["count","file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-line-or-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move COUNT - 1 lines down.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-highlight":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Highlight Visual selection, depending on the Visual type.\nWith negative ARG, disable highlighting.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a tag block.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inhibit-operator":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Inhibit current operator.\nIf an operator calls a motion and the motion sets this variable\nto t, the operator code is not executed.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-command-window-search-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open a command line window for backward searches.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-list-view-mode-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hook run after entering Evil List View mode.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-revert-reveal":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Unconditionally close overlays in OPEN-SPOTS in current window.\nModified version of `reveal-close-old-overlays' from\nreveal.el. OPEN-SPOTS is a local version of `reveal-open-spots'.","arglist":["open-spots"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-deinit-esc":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restore `input-decode-map' in terminal.","arglist":["frame"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-maps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-unbounded-word-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search backward for symbol under point.\nThe search is unbounded, i.e., the pattern is not wrapped in\n\\<...\\>.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normalize-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Normalize RANGE according to its type.\nReturn a new range if COPY is non-nil.","arglist":["range","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-custom-motions":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Sets the list of motion commands.","arglist":["var","values"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Normal state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.\n\nAKA \"Command\" state.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jump-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"mouse-yank-primary":"<mouse-2>","evil-delete-backward-word":"C-w","evil-delete-backward-char-and-join":"DEL","evil-paste-last-insertion":"C-a","evil-shift-left-line":"C-d","evil-shift-right-line":"C-t","evil-complete-previous-line":"C-x C-p","evil-complete-next-line":"C-x C-n","evil-complete-previous":"C-p","evil-complete-next":"C-n","evil-copy-from-below":"C-e","evil-copy-from-above":"C-y","evil-paste-from-register":"C-r","evil-execute-in-normal-state":"C-o","evil-insert-digraph":"C-k","quoted-insert":"C-v","evil-emacs-state":"C-z","evil-normal-state":"<escape>","delete-char":"<delete>"}},"evil-looking-at-end-comment":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns t if point is at the end of a comment.\npoint must be on one of the opening characters of a block comment\naccording to the current syntax table. Futhermore these\ncharacters must been parsed as opening characters, i.e. they\nwon't be considered as comment starters inside a string or\npossibly another comment. Point is moved right after the comment\ncloser if MOVE is non-nil.","arglist":["&optional","move"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-interactive":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If t search is interactive.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-line-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Linewise selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-without-input-method-hooks":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute body with evil's activate/deactivate-input-method hooks deactivated.\n\nThis allows input methods to be used in normal-state.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-remove-yank-excluded-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Removes `yank-excluded-properties' from TEXT.","arglist":["text"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-page-up":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT pages upwards.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-repeat-substitute-with-search-and-flags":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat last substitute command with last search pattern and last flags.\nThis is the same as :s//~/&r","arglist":["beg","end","&optional","flags"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-max":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the maximal buffer position of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-exit-visual-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exit from Visual state to the previous state.\nIf LATER is non-nil, exit after the current command.","arglist":["&optional","later","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-shift-width":{"default":4,"local":true,"default-type":"integer","var-docstring":"\\<evil-normal-state-map>\nThe number of columns by which a line is shifted.\nThis applies to the shifting operators \\[evil-shift-right] and \\[evil-shift-left].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-middle":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the middle line in the window\non the first non-blank character.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-add-to-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Add the assocation of KEY and VAL to the value of LIST-VAR.\nIf the list already contains an entry for KEY, update that entry;\notherwise add at the end of the list.","arglist":["list-var","key","val","&rest","elements"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-digit-argument-or-evil-beginning-of-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-unquote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return EXP unquoted.","arglist":["exp"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-line-first-non-blank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT lines down on the first non-blank character.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-esc-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Original ESC prefix map in `input-decode-map'.\nUsed by `evil-esc-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inclusive-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return size of inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-function":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a search function.\nIf FORWARD is nil, search backward, otherwise forward.\nIf REGEXP-P is non-nil, the input is a regular expression.\nIf WRAP is non-nil, the search wraps around the top or bottom\nof the buffer.\nIf PREDICATE is non-nil, it must be a function accepting two\narguments: the bounds of a match, returning non-nil if that match is\nacceptable.","arglist":["&optional","forward","regexp-p","wrap","predicate"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-display-shell-error-in-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Show error output of a shell command in the error buffer.\nIf this variable is non-nil the error output of a shell command\ngoes to the messages buffer instead of being mixed with the\nregular output. This happens only if the exit status of the\ncommand is non-zero.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-selection-for-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a Visual selection for TYPE.","arglist":["type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-common":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-active-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Toggle active region.\nEnsure that Transient Mark mode is properly enabled.\nEnable with positive ARG, disable with negative ARG.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-min":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the minimal buffer position of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a word.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-count-lines":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return absolute line-number-difference betweeen `beg` and `end`.\nThis should give the same results no matter where on the line `beg`\nand `end` are.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-list-view-mode-syntax-table":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Syntax table for `evil-list-view-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-contract":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Contract BEG and END as TYPE with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list.","arglist":["beg","end","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-paste-count":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The count argument of the current paste command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-repeat-info":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Repeat information accumulated during an insertion.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-tree":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The syntax tree.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-eval":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-struct-idx--cmacro":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"compiler-macro for inlining `evil-jumps-struct-idx'.","arglist":["_cl-whole-arg","cl-x"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-column":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restores the column after execution of BODY.\nSee also `evil-save-goal-column'.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-hl-update-highlights-scroll":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update highlights after scrolling in some window.","arglist":["win","_beg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-transform":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Apply TRANSFORM on BEG and END with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list. If TRANSFORM is undefined,\nreturn positions unchanged.","arglist":["transform","beg","end","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for STRING and highlight matches.\nIf FORWARD is nil, search backward, otherwise forward.\nIf REGEXP-P is non-nil, STRING is taken to be a regular expression.\nSTART is the position to search from; if unspecified, it is\none more than the current position.","arglist":["string","forward","&optional","regexp-p","start"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-digraphs-table-user":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"List of user-defined digraphs.\nEntries have the form ((?CHAR1 ?CHAR2) . ?DIGRAPH). That is,\na cons cell of the digraph and its character replacement,\nwhere the digraph is a list of two characters.\nSee also `evil-digraphs-table'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-replace-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Replace state.\n(That is, whether `evil-state' is `replace'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-search-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open a command line window for forward searches.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create an echo area message for SELECTION.\nSELECTION is a kind of selection as defined by\n`evil-define-visual-selection', such as `char', `line'\nor `block'.","arglist":["&optional","selection"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-range-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return end of RANGE.","arglist":["range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-post-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Run after each COMMAND in Visual state.\nIf COMMAND is a motion, refresh the selection;\notherwise exit Visual state.","arglist":["&optional","command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-generate-mode-line-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Generate the evil mode-line tag for STATE.","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-completion-table-concat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["table1","table2","string","pred","flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delay":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute FORM when CONDITION becomes true, checking with HOOK.\nNAME specifies the name of the entry added to HOOK. If APPEND is\nnon-nil, the entry is appended to the hook. If LOCAL is non-nil,\nthe buffer-local value of HOOK is modified.","arglist":["condition","form","hook","&optional","append","local","name"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-re-fwd":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search forward for PATTERN.\nReturns the line number of the match.","arglist":["pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-modes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Modes that should come up in Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-close-fold":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Close fold at point.\nSee also `evil-open-fold'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-range-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set RANGE's type to TYPE.\nIf COPY is non-nil, return a copy of RANGE.","arglist":["range","type","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--flyspell-overlays-in-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-split-next-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits the window and goes to the COUNT-th next buffer in the buffer list.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-read-digraph-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Read two keys from keyboard forming a digraph.\nThis function creates an overlay at (point), hiding the next\nHIDE-CHARS characters. HIDE-CHARS defaults to 1.","arglist":["&optional","hide-chars"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-top":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to line COUNT from the top of the window\non the first non-blank character.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-downcase-first":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return STR with the first letter downcased.","arglist":["str"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-global-marker-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether CHAR denotes a global marker.","arglist":["char"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-beginning":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The beginning of the Visual selection, a marker.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-list-view-mode-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for `evil-list-view-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-list-view-goto-entry":"<return>","evil-list-view-goto-entry":"<return>","evil-list-view-quit":"q"}},"evil-avy-goto-symbol-1":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-symbol-1'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-upcase-first":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return STR with the first letter upcased.","arglist":["str"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-end-of-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the last character of the current screen line.\nIf COUNT is given, move COUNT - 1 screen lines downward first.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-update-timer":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Time used for updating highlights.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search forward for user-entered text.\nSearches for regular expression if `evil-regexp-search' is t.\n\nBelow is the documentation string for `isearch-forward',\nwhich lists available keys:\n\nDo incremental search forward.\nWith a prefix argument, do an incremental regular expression search instead.\n\nAs you type characters, they add to the search string and are found.\nThe following non-printing keys are bound in ‘isearch-mode-map’.\n\nType DEL to cancel last input item from end of search string.\nType RET to exit, leaving point at location found.\nType LFD (C-j) to match end of line.\nType C-s to search again forward, C-r to search again backward.\nType M-s M-< to go to the first match, M-s M-> to go to the last match.\nType C-w to yank next word or character in buffer\n onto the end of the search string, and search for it.\nType C-M-d to delete character from end of search string.\nType C-M-y to yank char from buffer onto end of search string and search for it.\nType C-M-z to yank from point until the next instance of a\n specified character onto end of search string and search for it.\nType M-s C-e to yank rest of line onto end of search string and search for it.\nType C-y to yank the last string of killed text.\nType M-y to replace string just yanked into search prompt\n with string killed before it.\nType C-q to quote control character to search for it.\nType C-x 8 RET to add a character to search by Unicode name, with completion.\nC-g while searching or when search has failed cancels input back to what has\n been found successfully.\nC-g when search is successful aborts and moves point to starting point.\n\nIf you try to exit with the search string still empty, it invokes\n nonincremental search.\n\nType M-s c to toggle search case-sensitivity.\nType M-s i to toggle search in invisible text.\nType M-s r to toggle regular-expression mode.\nType M-s w to toggle word mode.\nType M-s _ to toggle symbol mode.\nType M-s ' to toggle character folding.\n\nType M-s SPC to toggle whitespace matching.\nIn incremental searches, a space or spaces normally matches any whitespace\ndefined by the variable ‘search-whitespace-regexp’; see also the variables\n‘isearch-lax-whitespace’ and ‘isearch-regexp-lax-whitespace’.\n\nType M-s e to edit the search string in the minibuffer.\n\nAlso supported is a search ring of the previous 16 search strings.\nType M-n to search for the next item in the search ring.\nType M-p to search for the previous item in the search ring.\nType C-M-i to complete the search string using the search ring.\n\nType M-% to run ‘query-replace’ with string to replace from last search string.\nType C-M-% to run ‘query-replace-regexp’ with the last search string.\nType M-s o to run ‘occur’ that shows the last search string.\nType M-s h r to run ‘highlight-regexp’ that highlights the last search string.\nType M-s h l to run ‘highlight-lines-matching-regexp’ that highlights lines\n matching the last search string.\n\nType C-h b to display all Isearch key bindings.\nType C-h k to display documentation of Isearch key.\nType C-h m to display documentation of Isearch mode.\n\nIf an input method is turned on in the current buffer, that input\nmethod is also active while you are typing characters to search.\nTo toggle the input method, type C-\\. It also toggles the input\nmethod in the current buffer.\n\nTo use a different input method for searching, type C-^,\nand specify an input method you want to use.\n\nThe above keys, bound in ‘isearch-mode-map’, are often controlled by\n options; do M-x apropos on search-.* to find them.\nOther control and meta characters terminate the search\n and are then executed normally (depending on ‘search-exit-option’).\nLikewise for function keys and mouse button events.\n\nIf this function is called non-interactively with a nil NO-RECURSIVE-EDIT,\nit does not return to the calling function until the search is done.\nSee the function ‘isearch-mode’ for more information.\n\n(fn &optional REGEXP-P NO-RECURSIVE-EDIT)","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move forward to end of THING.\nThe motion is repeated COUNT times.","arglist":["thing","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-mark":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the current mark, including whether it is transient.\nSee also `evil-restore-mark'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-back-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a back-quoted expression.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normalize-position":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return POS if it does not exceed the buffer boundaries.\nIf POS is less than `point-min', return `point-min'.\nIs POS is more than `point-max', return `point-max'.\nIf POS is a marker, return its position.","arglist":["pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-match-beg":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The beginning position of the last match.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-teardown":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Deinitialize Ex minibuffer.\nClean up everything set up by `evil-ex-setup'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-resize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The ex :resize command.\n\nIf ARG is a signed positive integer, increase the current window\nheight by ARG.\n\nIf ARG is a signed negative integer, decrease the current window\nheight by ARG.\n\nIf ARG is a positive integer without explicit sign, set the current\nwindow height to ARG.\n\nIf ARG is empty, maximize the current window height.","arglist":["arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-get-magic":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns a regexp matching the magic characters according to MAGIC.\nDepending on the value of MAGIC the following characters are\nconsidered magic.\n t [][{}*+?.&~$^\n nil [][{}*+?$^\n 'very-magic not 0-9A-Za-z_\n 'very-nomagic empty.","arglist":["magic"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-change-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be repeatable by buffer changes rather than\nkeystrokes.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-add-command-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Add PROPERTIES to COMMAND.\nPROPERTIES should be a property list.\nTo replace all properties at once, use `evil-set-command-properties'.","arglist":["command","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-local-mode-on-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-set-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set minimal and maximal position of highlight NAME to BEG and END.","arglist":["name","beg","end","&optional","_type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-stop-session":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Stop interactive search.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-eobp":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether point is at end-of-buffer with regard to end-of-line.","arglist":["&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-current-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the line number of the current line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of a string.\nQUOTE is the character delimiting the string. If COUNT is greater\nthan zero point is moved forward otherwise it is moved\nbackwards.","arglist":["quote","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-argument-completion-at-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-char'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-lines":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if the current insertion command is a line-insertion\ncommand o or O.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-move-beginning-of-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the beginning of the line as displayed.\nLike `move-beginning-of-line', but retains the goal column.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-flyspell-error":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the COUNT'th spelling mistake after point.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-remove-command-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Remove PROPERTIES from COMMAND.\nPROPERTIES should be a list of properties (:PROP1 :PROP2 ...).\nIf PROPERTIES is the empty list, all properties are removed.","arglist":["command","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-update-insert-state-bindings":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update bindings in `evil-insert-state-map'.\nIf no arguments are given add the bindings specified in\n`evil-insert-state-bindings'. If REMOVE is non nil, remove only\nthese bindings. Unless FORCE is non nil, this will not\noverwriting existing bindings, which means bindings will not be\nadded if one already exists for a key and only default bindings\nare removed.\n\nNote that <delete>, <escape> and `evil-toggle-key' are not\nincluded in `evil-insert-state-bindings' by default.","arglist":["&optional","_option-name","remove","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-next-func":{"default":"(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (require 'dabbrev) (let ((dabbrev-search-these-buffers-only (if evil-complete-all-buffers nil (list (current-buffer)))) dabbrev-case-distinction) (condition-case nil (if (eq last-command this-command) (dabbrev-expand nil) (dabbrev-expand (- (abs (or arg 1))))) (error (dabbrev-expand nil)))))","local":null,"default-type":"cons","var-docstring":"Completion function used by \\<evil-insert-state-map>\\[evil-complete-next].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-transform-regexp":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["regexp","replacements-alist"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-symbol":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a symbol.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-split-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits window and switches to another buffer.","arglist":["buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-window-jumps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hashtable which stores all jumps on a per window basis.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-normal-post-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Reset command loop variables in Normal state.\nAlso prevent point from reaching the end of the line.\nIf the region is activated, enter Visual state.","arglist":["&optional","command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-pending-overriding-maps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"An alist of pending overriding maps.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-vcount":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The information about the number of following lines the\ninsertion should be repeated. This is list (LINE COLUMN COUNT)\nwhere LINE is the line-number where the original insertion\nstarted and COLUMN is either a number or function determining the\ncolumn where the repeated insertions should take place. COUNT is\nnumber of repeats (including the original insertion).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-shift-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shift text from BEG to END to the left.\nThe text is shifted to the nearest multiple of `evil-shift-width'\n(the rounding can be disabled by setting `evil-shift-round').\nIf PRESERVE-EMPTY is non-nil, lines that contain only spaces are\nindented, too, otherwise they are ignored. The relative column\nof point is preserved if this function is not called\ninteractively. Otherwise, if the function is called as an\noperator, point is moved to the first non-blank character.\nSee also `evil-shift-right'.","arglist":["beg","end","&optional","count","preserve-empty"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-states":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-avy-goto-char-timer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-char-timer'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-insert-commands":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Insert the commands in HIST.","arglist":["hist"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The buffer in which the repeat started.\nIf the buffer is changed, the repeat is cancelled.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Operator-Pending state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-this-operator":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Current operator.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-get-command-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the value of Evil PROPERTY of COMMAND.\nIf the command does not have the property, return DEFAULT.\nSee also `evil-get-command-properties'.","arglist":["command","property","&optional","default"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute a motion and return the buffer positions.\nThe return value is a list (BEG END TYPE).","arglist":["motion","&optional","count","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-initial-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the Evil state to use for MODE or its alias.\nReturns DEFAULT if no initial state is associated with MODE.\nThe initial state for a mode can be set with\n`evil-set-initial-state'.\n\nIf FOLLOW-PARENT is non-nil, also check parent modes of MODE and\nits alias. CHECKED-MODES is used internally and should not be set\ninitially.","arglist":["mode","&optional","default","follow-parent","checked-modes"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jump-item":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find the next item in this line after or under the cursor\nand jump to the corresponding one.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-execute-in-emacs-state-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The buffer of the latest `evil-execute-in-emacs-state'.\nWhen this command is being executed the current buffer is stored\nin this variable. This is necessary in case the Emacs-command to\nbe called changes the current buffer.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-scroll-column-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT columns to the left.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-previous-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT screen lines up.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-stop-execute-in-emacs-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-ring":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"A ring of repeat-informations to repeat the last command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-forward-history":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"History of forward searches.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-substitute-interactive-replace":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If t and substitute patterns are highlighted,\nthe replacement is shown interactively.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-force-normal-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to normal state without recording current command.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-move-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the end of the COUNT next object.\nIf COUNT is negative, move to the COUNT previous object.\nFORWARD is a function which moves to the end of the object, and\nBACKWARD is a function which moves to the beginning.\nIf one is unspecified, the other is used with a negative argument.\nIf INCLUSIVE is non-nil, then point is placed at the last character\nof the object; otherwise it is placed at the end of the object.","arglist":["count","forward","&optional","backward","inclusive"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-yank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex yank command.\n[BEG,END]yank [REGISTER] [COUNT]","arglist":["beg","end","&optional","type","register","count","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-first-non-blank-of-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the first non blank character\nof the current screen line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-jumps-post-jump-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run just after jumping to a location in the jump list.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jump-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to older position in jump list.\nTo go the other way, press \\<evil-motion-state-map>\\[evil-jump-forward].","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-global-inverted":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex vglobal command.\n[BEG,END]vglobal/PATTERN/COMMAND","arglist":["beg","end","&optional","pattern","command","invert"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-activate-input-method":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable input method in states with :input-method non-nil.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-newline-commands":{"default":"(LaTeX-section TeX-font)","local":null,"default-type":"cons","var-docstring":"Commands excluding the trailing newline of a Visual Line selection.\nThese commands work better without this newline.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-info-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-execute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute RESULT as an ex command on `evil-ex-current-buffer'.","arglist":["result"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-select-xml-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a range (BEG END) of COUNT matching XML tags.\nIf INCLUSIVE is non-nil, the tags themselves are included\nfrom the range.","arglist":["beg","end","type","&optional","count","inclusive"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-move-to-column":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to column COLUMN in the current line.\nPlaces point at left of the tab character (at the right if DIR\nis non-nil) and returns point.","arglist":["column","&optional","dir","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-match-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The end position of the last match.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-this-motion":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Current motion.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-avy-goto-word-1-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-word-1-above'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-execute-fn":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The command to execute when exiting the command line window.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-update-highlights":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update the overlays of all active highlights.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-set-overlays":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the list of active overlays of the highlight HL to OVERLAYS.","arglist":["hl","overlays"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-repeat-global-substitute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat last substitute command on the whole buffer.\nThis is the same as :%s//~/&","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-init-esc":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update `input-decode-map' in terminal.","arglist":["frame"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-shift-right-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shift the current line COUNT times to the right.\nThe text is shifted to the nearest multiple of\n`evil-shift-width'. Like `evil-shift-right' but always works on\nthe current line.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-concat-ranges":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate RANGES.\nRANGES must be a list of ranges. They must be ordered so that\nsuccessive ranges share their boundaries. The return value is a\nsingle range of disjoint union of the ranges or nil if the\ndisjoint union is not a single range.","arglist":["ranges"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-start-record-changes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Starts the recording of a new set of buffer changes.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Starts a forward search.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-pattern-update-replacement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update the replacement display.","arglist":["_hl","overlay"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-abort":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Abort current repeation.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-overlay":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-version":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The current version of Evil","fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves whole lines into the kill-ring.","arglist":["beg","end","&optional","type","register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-overlay":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The overlay for the current search result.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-block-corner":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Block corner corresponding to POINT, with MARK in opposite corner.\nDepending on POINT and MARK, the return value is `upper-left',\n`upper-right', `lower-left' or `lower-right':\n\n upper-left +---+ upper-right\n | |\n lower-left +---+ lower-right\n\nOne-column or one-row blocks are ambiguous. In such cases,\nthe horizontal or vertical component of CORNER is used.\nCORNER defaults to `upper-left'.","arglist":["&optional","corner","point","mark"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-find-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the next COUNT'th occurrence of CHAR.\nMovement is restricted to the current line unless `evil-cross-lines' is non-nil.","arglist":["&optional","count","char"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-line-format":{"default":"before","local":null,"default-type":"symbol","var-docstring":"The position of the state tag in the mode line.\nIf set to `before' or `after', the tag is placed at the beginning\nor the end of the mode-line, respectively. If nil, there is no\ntag. Otherwise it should be a cons cell (WHERE . WHICH), where\nWHERE is either `before' or `after', and WHICH is a symbol in\n`mode-line-format'. The tag is then placed before or after that\nsymbol, respectively.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-offset":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last search offset.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-change-to-initial-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change the state of BUFFER to its initial state.\nThis is the state the buffer came up in. If Evil is not activated\nthen this function does nothing.","arglist":["&optional","buffer","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-comment":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-get-max":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the maximal position of the highlight with name NAME.","arglist":["name"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-screen-line-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Linewise selection in `visual-line-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-match-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the match-hook of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-local-mode-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-backward-word-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the COUNT-th previous word.\nIf BIGWORD is non-nil, move by WORDS.","arglist":["&optional","count","bigword"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inhibit-esc":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"If non-nil, the \\e event will never be translated to 'escape.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-with-single-undo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY as a single undo step.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-avy-goto-subword-0":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-subword-0'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-subword-1":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-subword-1'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-complete-emacs-commands":{"default":"in-turn","local":null,"default-type":"symbol","var-docstring":"TAB-completion for Emacs commands in ex command line.\nThis variable determines when Emacs commands are considered for\ncompletion, always, never, or only if no Evil ex command is\navailable for completion.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeats the last ex command.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-current-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The buffer from which Ex was started.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-keys":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The keys that invoked the current command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-highlight-closing-paren-at-point-states":{"default":"(not emacs insert replace)","local":null,"default-type":"cons","var-docstring":"The states in which the closing parenthesis at point should be highlighted.\nAll states listed here highlight the closing parenthesis at\npoint (which is Vim's default behavior). All others highlight the\nparenthesis before point (which is Emacs default behavior). If\nthis list contains the symbol `not' then its meaning is inverted,\ni.e. all states listed here highlight the closing parenthesis\nbefore point.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-backward-WORD-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the COUNT-th previous WORD.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-case":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The case behaviour of the search command.\nSmart case means that the pattern is case sensitive if and only\nif it contains an upper case letter, otherwise it is case\ninsensitive. If nil then the setting of `evil-ex-search-case' is\nused.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-set-jump":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set jump point at POS.\nPOS defaults to point.","arglist":["&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-show-marks":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shows all marks.\nIf MRKS is non-nil it should be a string and only registers\ncorresponding to the characters of this string are shown.","arglist":["mrks"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jumps-struct-ring--cmacro":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"compiler-macro for inlining `evil-jumps-struct-ring'.","arglist":["_cl-whole-arg","cl-x"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-initial-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the initial state for major mode MODE to STATE.\nThis is the state the buffer comes up in.","arglist":["mode","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-refresh":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Refresh point, mark and Visual variables.\nRefreshes `evil-visual-beginning', `evil-visual-end',\n`evil-visual-mark', `evil-visual-point', `evil-visual-selection',\n`evil-visual-direction', `evil-visual-properties' and `evil-this-type'.","arglist":["&optional","mark","point","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-get-current":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["&optional","window"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-range-beginning":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return beginning of RANGE.","arglist":["range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether Ex is currently active.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-double-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner double-quoted expression.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-indent-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Indent the line.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-sentence-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the next COUNT-th beginning of a sentence or end of a paragraph.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-move-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the `selected-window' to SIDE.\nThe state of the `selected-window' is saved along with the state\nof the window tree consisting of all the other windows. Then, all\nwindows are deleted, the remaining window is split according to\nSIDE, the state of the window at SIDE is replaced with the saved\nstate of the `selected-window', and, finally, the state of the\nsaved window tree is reconstructed on the opposite side.\n\nSIDE has the same meaning as in `split-window'.\n\nNote, this function only operates on the window tree rooted in\nthe frame's main window and effectively preserves any side\nwindows (i.e. windows with a valid window-side window\nparameter).","arglist":["side"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Replace state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-update-pending-maps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Tries to set pending special keymaps.\nThis function should be called from an `after-load-functions'\nhook.","arglist":["&optional","_file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Goes to the `count'-th next buffer in the buffer list.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-goto-offset":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point according to search OFFSET and set `evil-this-type' accordingly.\nThis function assumes that the current match data represents the\ncurrent search result.","arglist":["offset"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether SYM is the name of a state.","arglist":["sym"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mouse-start-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a list of region bounds based on START and END according to MODE.\nIf MODE is not 1 then set point to (min START END), mark to (max\nSTART END). If MODE is 1 then set point to start of word at (min\nSTART END), mark to end of word at (max START END).","arglist":["start","end","mode"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-echo-area-save":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the current echo area in `evil-echo-area-message'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-describe-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return description of RANGE.\nIf no description is available, return the empty string.","arglist":["range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-rectangle-expand":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform expand transformation on rectangle from BEG to END with PROPERTIES.\n\nLike `exclusive', but for rectangles:\nthe last column is excluded.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-macros":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Insert state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-auxiliary-keymap-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether MAP is an auxiliary keymap.","arglist":["map"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-visual-selection":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define a Visual selection SELECTION.\nCreates a command evil-visual-SELECTION for enabling the selection.\nDOC is the function's documentation string. The following keywords\nmay be specified in BODY:\n\n:message STRING Status message when enabling the selection.\n:type TYPE Type to use (defaults to SELECTION).\n\nFollowing the keywords is optional code which is executed each time\nthe selection is enabled.\n\n(fn SELECTION DOC [[KEY VAL]...] BODY...)","arglist":["selection","doc","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-insert-digraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Insert COUNT digraphs.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Visual state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-select-paren":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a range (BEG END) of COUNT delimited text objects.\nOPEN and CLOSE specify the opening and closing delimiter,\nrespectively. BEG END TYPE are the currently selected (visual)\nrange. If INCLUSIVE is non-nil, OPEN and CLOSE are included in\nthe range; otherwise they are excluded.\n\nThe types of OPEN and CLOSE specify which kind of THING is used\nfor parsing with `evil-select-block'. If OPEN and CLOSE are\ncharacters `evil-up-paren' is used. Otherwise OPEN and CLOSE\nmust be regular expressions and `evil-up-block' is used.\n\nIf the selection is exclusive, whitespace at the end or at the\nbeginning of the selection until the end-of-line or beginning-of-line\nis ignored.","arglist":["open","close","beg","end","type","count","&optional","inclusive"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-lookup-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns non-nil value if KEY is bound in MAP.","arglist":["map","key"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-sentence":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-this-macro":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Current macro register.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-has-command-properties-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether Evil properties are defined for COMMAND.\nSee also `evil-has-command-property-p'.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-previous-state":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The Evil state being switched from.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-motion-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--jumps-buffer-targets":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Regexp to match against `buffer-name' to determine whether it's a valid jump target.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-indent":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Indent text.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-temporary-undo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"When undo is disabled in current buffer.\nCertain commands depending on undo use this variable\ninstead of `buffer-undo-list'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-setup":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Hook to initialize the minibuffer for ex search.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ac-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-select-search-module":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change the search module according to MODULE.\nIf MODULE is `isearch', then Emacs' isearch module is used.\nIf MODULE is `evil-search', then Evil's own interactive\nsearch module is used.","arglist":["option","module"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-with-predicate":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute a search with a predicate function.\nSEARCH-FUN is a search function (e.g. `re-search-forward') and\nPREDICATE is a two-argument function satisfying the interface of\n`isearch-filter-predicate', or `nil'. STRING, BOUND, NOERROR and\nCOUNT are passed unchanged to SEARCH-FUN. The first match\nsatisfying the predicate (or `nil') is returned.","arglist":["search-fun","pred","string","bound","noerror","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-backspace-join-lines":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether backward delete in insert state may join lines.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-list-view-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Major mode derived from `tabulated-list-mode' by `define-derived-mode'.\nIt inherits all of the parent's attributes, but has its own keymap,\nabbrev table and syntax table:\n\n `evil-list-view-mode-map', `evil-list-view-mode-abbrev-table' and `evil-list-view-mode-syntax-table'\n\nwhich more-or-less shadow tabulated-list-mode's corresponding tables.\n\nIn addition to any hooks its parent mode might have run,\nthis mode runs the hook `evil-list-view-mode-hook', as the final or penultimate step\nduring initialization.\n\n\\{evil-list-view-mode-map}","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-search-execute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for RESULT using FORWARD to determine direction.","arglist":["result","forward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-word-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the COUNT-th next word.\nIf BIGWORD is non-nil, move by WORDS.","arglist":["&optional","count","bigword"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the Visual selection as a range.\nThis is a list (BEG END TYPE PROPERTIES...), where BEG is the\nbeginning of the selection, END is the end of the selection,\nTYPE is the selection's type, and PROPERTIES is a property list\nof miscellaneous selection attributes.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-change":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the regular expression of highlight NAME to PATTERN.","arglist":["name","pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-cached-header-line-height":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cached height of the header line.\nUsed for fallback implementation on older Emacsen.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-declare-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a STATE binding from KEY to DEF for KEYMAP.\nSTATE is one of `normal', `insert', `visual', `replace',\n`operator', `motion', `emacs', or a list of one or more of\nthese. Omitting a state by using `nil' corresponds to a standard\nEmacs binding using `define-key'. The remaining arguments are\nlike those of `define-key'. For example:\n\n (evil-define-key 'normal foo-map \"a\" 'bar)\n\nThis creates a binding from `a' to `bar' in normal state, which\nis active whenever `foo-map' is active. Using nil for the state,\nthe following lead to identical bindings:\n\n (evil-define-key nil foo-map \"a\" 'bar)\n (define-key foo-map \"a\" 'bar)\n\nIt is possible to specify multiple states and/or bindings at\nonce:\n\n (evil-define-key '(normal visual) foo-map\n \"a\" 'bar\n \"b\" 'foo)\n\nIf `foo-map' has not been initialized yet, this macro adds an\nentry to `after-load-functions', delaying execution as necessary.\n\nKEYMAP may also be a quoted symbol. If the symbol is `global', the\nglobal evil keymap corresponding to the state(s) is used, meaning\nthe following lead to identical bindings:\n\n (evil-define-key 'normal 'global \"a\" 'bar)\n (evil-global-set-key 'normal \"a\" 'bar)\n\nThe symbol `local' may also be used, which corresponds to using\n`evil-local-set-key'. If a quoted symbol is used that is not\n`global' or `local', it is assumed to be the name of a minor\nmode, in which case `evil-define-minor-mode-key' is used.","arglist":["state","keymap","key","def","&rest","bindings"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-motion-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-avy-goto-word-or-subword-1":"","evil-avy-goto-word-1-below":"","evil-avy-goto-word-1-above":"","evil-avy-goto-word-1":"","evil-avy-goto-word-0":"","evil-avy-goto-symbol-1-below":"","evil-avy-goto-symbol-1-above":"","evil-avy-goto-symbol-1":"","evil-avy-goto-subword-1":"","evil-avy-goto-subword-0":"","evil-avy-goto-line-below":"","evil-avy-goto-line-above":"","evil-avy-goto-line":"","evil-avy-goto-char-timer":"","evil-avy-goto-char-in-line":"","evil-avy-goto-char-2-below":"","evil-avy-goto-char-2-above":"","evil-avy-goto-char-2":"","evil-avy-goto-char":"","evil-ace-jump-word-mode":"","evil-ace-jump-line-mode":"","evil-ace-jump-char-mode":"","evil-shell-command":"!","evil-ex":":","evil-mouse-drag-region":"<down-mouse-1>","evil-scroll-down":"C-d","evil-jump-forward":"TAB","evil-emacs-state":"C-z","evil-next-line":"j","evil-previous-line":"k","evil-forward-char":"SPC","evil-backward-char":"h","evil-buffer":"C-^","evil-visual-block":"C-v","evil-visual-line":"V","evil-visual-char":"v","evil-scroll-left":"z H","evil-scroll-right":"z L","evil-scroll-column-left":"z h","evil-scroll-column-right":"z l","evil-scroll-line-to-bottom":"z b","evil-scroll-line-to-center":"z z","evil-scroll-line-to-top":"z t","evil-scroll-bottom-line-to-top":"z +","evil-scroll-top-line-to-bottom":"z ^","evil-execute-in-emacs-state":"\\","evil-ret":"RET","evil-scroll-line-up":"C-y","evil-jump-backward":"C-o","evil-scroll-page-down":"C-f","evil-scroll-line-down":"C-e","evil-scroll-page-up":"C-b","evil-jump-to-tag":"C-]","evil-switch-to-windows-last-buffer":"C-6","evil-window-map":"C-w","evil-previous-line-first-non-blank":"-","evil-next-line-1-first-non-blank":"_","evil-next-line-first-non-blank":"+","evil-first-non-blank":"^","evil-goto-column":"|","evil-search-backward":"?","evil-repeat-find-char":";","evil-search-forward":"/","evil-repeat-find-char-reverse":",","evil-search-word-forward":"*","evil-prev-flyspell-error":"[ s","evil-previous-open-brace":"[ {","evil-previous-open-paren":"[ (","evil-backward-section-end":"[ ]","evil-backward-section-begin":"[ [","evil-next-flyspell-error":"] s","evil-next-close-brace":"] }","evil-next-close-paren":"] )","evil-forward-section-end":"] [","evil-forward-section-begin":"] ]","evil-forward-sentence-begin":")","evil-backward-sentence-begin":"(","evil-goto-mark-line":"'","evil-goto-mark":"`","evil-jump-item":"%","evil-end-of-line":"$","evil-search-word-backward":"#","evil-forward-paragraph":"}","evil-backward-paragraph":"{","evil-previous-match":"g N","evil-next-match":"g n","evil-visual-restore":"g v","evil-search-unbounded-word-forward":"g *","evil-search-unbounded-word-backward":"g #","evil-jump-to-tag":"C-]","evil-end-of-visual-line":"g $","evil-middle-of-visual-line":"g m","evil-first-non-blank-of-visual-line":"g ^","evil-last-non-blank":"g _","evil-beginning-of-visual-line":"g 0","evil-previous-visual-line":"g k","evil-next-visual-line":"g j","evil-goto-first-line":"g g","evil-backward-WORD-end":"g E","evil-backward-word-end":"g e","evil-goto-definition":"g d","evil-yank-line":"Y","evil-yank":"y","evil-forward-WORD-begin":"W","evil-forward-word-begin":"w","evil-find-char-to-backward":"T","evil-find-char-to":"t","evil-search-previous":"N","evil-search-next":"n","evil-window-middle":"M","evil-window-bottom":"L","evil-lookup":"K","evil-forward-char":"SPC","evil-forward-char":"SPC","evil-previous-line":"k","evil-next-line":"j","evil-window-top":"H","evil-backward-char":"h","evil-goto-line":"G","evil-find-char-backward":"F","evil-find-char":"f","evil-forward-WORD-end":"E","evil-forward-word-end":"e","evil-backward-WORD-begin":"B","evil-backward-word-begin":"b","digit-argument":"9","digit-argument":"9","digit-argument":"9","digit-argument":"9","digit-argument":"9","digit-argument":"9","digit-argument":"9","digit-argument":"9","digit-argument":"9","evil-digit-argument-or-evil-beginning-of-line":"0"}},"evil-ex-char-marker-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-error":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to error number COUNT.\n\nIf no COUNT supplied, move to the current error.\n\nActs like `first-error' other than when given no counts, goes\nto the current error instead of the first, like in Vim's :cc\ncommand.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-line-expand":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform expand transformation on line from BEG to END with PROPERTIES.\n\nInclude whole lines.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-a-double-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a double-quoted expression.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-respect-visual-line-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"\\<evil-motion-state-map>\nWhether movement commands respect `visual-line-mode'.\nIf non-nil, `visual-line-mode' is generally respected when it is\non. In this case, motions such as \\[evil-next-line] and\n\\[evil-previous-line] navigate by visual lines (on the screen) rather\nthan \"physical\" lines (defined by newline characters). If nil,\nthe setting of `visual-line-mode' is ignored.\n\nThis variable must be set before Evil is loaded.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-scroll-line-to-center":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls line number COUNT (or the cursor line) to the center of the window.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-set-width":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Sets the width of the current window to COUNT.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-start-word-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for the symbol under point.\nThe search matches the COUNT-th occurrence of the word. If the\nUNBOUNDED argument is nil, the search matches only at symbol\nboundaries, otherwise it matches anywhere. The DIRECTION\nargument should be either `forward' or `backward', determining\nthe search direction. If SYMBOL is non-nil then the functions\nsearches for the symbol at point, otherwise for the word at\npoint.","arglist":["unbounded","direction","count","&optional","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-vnew":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits the current window vertically\nand opens a new buffer name or edits a certain FILE.","arglist":["count","file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-goal-column":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restores the goal column after execution of BODY.\nSee also `evil-save-column'.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-search-history":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The history for the search command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-overlay":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Overlay for highlighting the Visual selection.\nNot used for blockwise selections, in which case\nsee `evil-visual-block-overlays'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-avy-goto-word-1-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-word-1-below'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"*Linewise selection.","fn-docstring":"Linewise selection.","arglist":["&optional","mark","point","type","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-deactivate-input-method":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Disable input method in all states.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-initial-state-for-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the initial Evil state to use for BUFFER.\nBUFFER defaults to the current buffer. Returns DEFAULT\nif no initial state is associated with BUFFER.\nSee also `evil-initial-state'.","arglist":["&optional","buffer","default"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Emacs state.\n(That is, whether `evil-state' is `emacs'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-restore":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restore previous selection.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Emacs state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-highlight-all":{"default":"t","local":null,"default-type":"symbol","var-docstring":"If t all matches for the substitute pattern are highlighted.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-plist-delete":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete by side effect the property PROP from PLIST.\nIf PROP is the first property in PLIST, there is no way\nto remove it by side-effect; therefore, write\n(setq foo (evil-plist-delete :prop foo)) to be sure of\nchanging the value of `foo'.","arglist":["prop","plist"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-signal-at-bob-or-eob":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Signals error if `point' is at boundaries.\nIf `point' is at bob and COUNT is negative this function signal\n'beginning-of-buffer. If `point' is at eob and COUNT is positive\nthis function singal 'end-of-buffer. This function should be used\nin motions. COUNT defaults to 1.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--flyspell-overlay-at":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["pos","forwardp"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-first-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the first non-blank character of line COUNT.\nBy default the first line.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-cmd":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The current Ex command string.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inner-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner word.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-block-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Blockwise selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-shell-argument-initialized":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"This variable is set to t if shell command completion has been initialized.\nSee `evil-ex-init-shell-argument-completion'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-command-window-cmd-key":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The key for the command that opened the command line window (:, /, or ?).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-lazy-highlight":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-a-paren":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a parenthesis.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-backward-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete previous word.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-backspace":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restore character under cursor.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-current-replacement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The actual replacement.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--preceding-sexp":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"In normal-state or motion-state, last sexp ends at point.","arglist":["command","&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move cursor to the right by COUNT characters.\nMovement is restricted to the current line unless CROSSLINES is non-nil.\nIf NOERROR is non-nil, don't signal an error upon reaching the end\nof the line or the buffer; just return nil.","arglist":["&optional","count","crosslines","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Operator-Pending state is enabled.\nUse the command `evil-operator-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-replace-special-filenames":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Replace special symbols in FILE-NAME.\nReplaces % by the current file-name,\nReplaces # by the alternate file-name in FILE-NAME.","arglist":["file-name"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Specifications made by `evil-define-command'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-state-minor-mode-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a keymap alist of minor-mode keymaps for STATE.","arglist":["state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Normal state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--jumps-savehist-load":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-direction":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Whether point follows mark in Visual state.\nNegative if point precedes mark, otherwise positive.\nSee also the function `evil-visual-direction'.","fn-docstring":"Return direction of Visual selection.\nThe direction is -1 if point precedes mark and 1 otherwise.\nSee also the variable `evil-visual-direction', which holds\nthe direction of the last selection.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-execute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute the command under the cursor in the appropriate buffer.\nThe local var `evil-command-window-execute-fn' determines which\nfunction to execute.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-quote-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The character to be used by `forward-evil-quote'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-pre-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Run before each COMMAND in Visual state.\nExpand the region to the selection unless COMMAND is a motion.","arglist":["&optional","command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-pop":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Replace the just repeated command with a previously executed command.\nOnly allowed after `evil-repeat', `evil-repeat-pop' or\n`evil-repeat-pop-next'. Uses the same repeat count that\nwas used for the first repeat.\n\nThe COUNT argument inserts the COUNT-th previous kill.\nIf COUNT is negative, this is a more recent kill.","arglist":["count","&optional","save-point"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-line-number":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Print the last line number.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-pos":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The position of point at the beginning of an change-tracking\n editing command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Non-nil if Evil mode is enabled.\nSee the `evil-mode' command\nfor a description of this minor mode.\nSetting this variable directly does not take effect;\neither customize it (see the info node `Easy Customization')\nor call the function `evil-mode'.","fn-docstring":"This function has :around advice: ‘ad-Advice-evil-mode’.\n\nToggle Evil-Local mode in all buffers.\nWith prefix ARG, enable Evil mode if ARG is positive;\notherwise, disable it. If called from Lisp, enable the mode if\nARG is omitted or nil.\n\nEvil-Local mode is enabled in all buffers where\n`evil-initialize' would do it.\nSee `evil-local-mode' for more information on Evil-Local mode.\n\n(fn &optional ARG)","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-text-objects-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for inner text objects.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-inner-symbol":"o","evil-inner-tag":"t","evil-inner-back-quote":"`","evil-inner-double-quote":"\"","evil-inner-single-quote":"'","evil-inner-angle":">","evil-inner-angle":">","evil-inner-curly":"}","evil-inner-curly":"}","evil-inner-curly":"}","evil-inner-bracket":"]","evil-inner-bracket":"]","evil-inner-paren":")","evil-inner-paren":")","evil-inner-paren":")","evil-inner-paragraph":"p","evil-inner-sentence":"s","evil-inner-WORD":"W","evil-inner-word":"w"}},"evil--next-flyspell-error":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["forwardp"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-marks":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete all marks.\nMARKS is a string denoting all marks to be deleted. Mark names are\neither single characters or a range of characters in the form A-Z.\n\nIf FORCE is non-nil all local marks except 0-9 are removed.\n","arglist":["marks","&optional","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-without-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-set-selection":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Make an X selection of type TYPE and value DATA.\nThe argument TYPE (nil means `PRIMARY') says which selection, and\nDATA specifies the contents. TYPE must be a symbol. (It can also\nbe a string, which stands for the symbol with that name, but this\nis considered obsolete.) DATA may be a string, a symbol, an\ninteger (or a cons of two integers or list of two integers).\n\nThe selection may also be a cons of two markers pointing to the same buffer,\nor an overlay. In these cases, the selection is considered to be the text\nbetween the markers *at whatever time the selection is examined*.\nThus, editing done in the buffer after you specify the selection\ncan alter the effective value of the selection.\n\nThe data may also be a vector of valid non-vector selection values.\n\nThe return value is DATA.\n\nInteractively, this command sets the primary selection. Without\nprefix argument, it reads the selection in the minibuffer. With\nprefix argument, it uses the text of the region as the selection value.\n\nNote that on MS-Windows, primary and secondary selections set by Emacs\nare not available to other programs.\n\n(fn TYPE DATA)","arglist":["arg1","arg2"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-command-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Start command window with ex history and current minibuffer content.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-auxiliary-keymap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the auxiliary keymap for MAP in STATE to AUX.\nIf AUX is nil, create a new auxiliary keymap.","arglist":["map","state","&optional","aux"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-quit-all-with-error-code":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exits Emacs without saving, returning an non-zero error code.\nThe FORCE argument is only there for compatibility and is ignored.\nThis function fails with an error if Emacs is run in server mode.","arglist":["&optional","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-type-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Specifications made by `evil-define-type'.\nEntries have the form (TYPE . PLIST), where PLIST is a property\nlist specifying functions for handling the type: expanding it,\ndescribing it, etc.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-start-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The point where the search started.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-char-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Characterwise selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-want-C-u-scroll":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether `C-u' scrolls up (like Vim).\nOtherwise, `C-u' applies a prefix argument. The binding of\n`C-u' mirrors Emacs behaviour by default due to the relative\nubiquity of prefix arguments.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-set-marker":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the marker denoted by CHAR to position POS.\nPOS defaults to the current position of point.\nIf ADVANCE is t, the marker advances when inserting text at it;\notherwise, it stays behind.","arglist":["char","&optional","pos","advance"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-block-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Blockwise selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-stop-track-last-insertion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Stop tracking the last insertion.\nThe tracked insertion is set to `evil-last-insertion'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Replace state is enabled.\nUse the command `evil-replace-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-normal-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Normal state is enabled.\nUse the command `evil-normal-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-scroll-top-line-to-bottom":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the line right below the window,\nor line COUNT to the top of the window.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-small-deletion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last piece of deleted text.\nThe text should be less than a line.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-fill":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Fill text.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-syntactic-context":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the syntactical context of the character at POS.\nPOS defaults to the current position of point.","arglist":["&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-direction":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The direction of the current search, either 'forward or 'backward.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-last-non-blank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the last non-blank character of the current line.\nIf COUNT is given, move COUNT - 1 lines downward first.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-insert-at-point-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["beg","end","_length"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-delete":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex delete command.\n[BEG,END]delete [REGISTER] [COUNT]","arglist":["beg","end","&optional","type","register","count","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-point":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The position of point in Visual state, a marker.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-screen-line-expand":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform expand transformation on screen-line from BEG to END with PROPERTIES.\n\nInclude whole lines, being aware of `visual-line-mode'\nwhen `evil-respect-visual-line-mode' is non-nil.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-list-view-goto-entry":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-move":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move lines in BEG END below line given by ADDRESS.","arglist":["beg","end","address"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-unbounded-word-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for the next occurrence of word under the cursor.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-keymap-prompt":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the prompt-string of MAP to PROMPT.","arglist":["map","prompt"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-ex-execute":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute RESULT as an ex command in the appropriate buffer.","arglist":["result"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves the characters in motion into the kill-ring.","arglist":["beg","end","&optional","type","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-shift-round":{"default":"t","local":true,"default-type":"symbol","var-docstring":"\\<evil-normal-state-map>\nWhether shifting rounds to the nearest multiple.\nIf non-nil, \\[evil-shift-right] and \\[evil-shift-left] adjust line\nindentation to the nearest multiple of `evil-shift-width'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-read-key-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap active during `evil-read-key'.\nThis keymap can be used to bind some commands during the\nexecution of `evil-read-key' which is usually used to read a\ncharacter argument for some commands, e.g. `evil-replace'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-read-digraph-char":"C-k","evil-read-quoted-char":"C-v","evil-read-quoted-char":"C-v","keyboard-quit":"C-g","keyboard-quit":"C-g","keyboard-quit":"C-g"}},"evil-block-rotate":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform rotate transformation on block from BEG to END with PROPERTIES.\n\nRotate block according to :corner property.\n:corner can be one of `upper-left',``upper-right', `lower-left'\nand `lower-right'.\n\nLike `inclusive', but for rectangles:\nthe last column is included.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-minor-mode-keymaps-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of Evil states to minor-mode keymap alists.\nEntries have the form (STATE . MODE-MAP-ALIST), where\nMODE-MAP-ALIST is an alist taking the form of\n`minor-mode-map-alist'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-define-keymap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define a keymap KEYMAP listed in `evil-mode-map-alist'.\nThat means it will have precedence over regular keymaps.\n\nDOC is the documentation for the variable. BODY, if specified,\nis executed after toggling the mode. Optional keyword arguments\nmay be specified before the body code:\n\n:mode VAR Mode variable. If unspecified, the variable\n is based on the keymap name.\n:local BOOLEAN Whether the keymap should be buffer-local, that is,\n reinitialized for each buffer.\n:func BOOLEAN Create a toggle function even if BODY is empty.\n\n(fn KEYMAP DOC [[KEY VAL]...] BODY...)","arglist":["keymap","doc","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-append-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to Insert state at the end of the current line.\nThe insertion will be repeated COUNT times. If VCOUNT is non nil\nit should be number > 0. The insertion will be repeated in the\nnext VCOUNT - 1 lines below the current one.","arglist":["count","&optional","vcount"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-toggle-key":{"default":"C-z","local":null,"default-type":"string","var-docstring":"The key used to change to and from Emacs state.\nMust be readable by `read-kbd-macro'. For example: \"C-z\".","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to Insert state just before point.\nThe insertion will be repeated COUNT times and repeated once for\nthe next VCOUNT - 1 lines starting at the same column.\nIf SKIP-EMPTY-LINES is non-nil, the insertion will not be performed\non lines on which the insertion point would be after the end of the\nlines. This is the default behaviour for Visual-state insertion.","arglist":["count","&optional","vcount","skip-empty-lines"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-paste-last-insertion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Paste last insertion.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Operator-Pending state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-visual-char-semi-exclusive":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Visual character selection to beginning/end of line is exclusive.\nIf non nil then an inclusive visual character selection which\nends at the beginning or end of a line is turned into an\nexclusive selection. Thus if the selected (inclusive) range ends\nat the beginning of a line it is changed to not include the first\ncharacter of that line, and if the selected range ends at the end\nof a line it is changed to not include the newline character of\nthat line.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inner-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner tag block.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Motion state is enabled.\nUse the command `evil-motion-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-backward-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move backward to end of THING.\nThe motion is repeated COUNT times. This is the same as calling\n`evil-backward-end' with -COUNT.","arglist":["thing","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-initialize-local-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Initialize a buffer-local value for local keymaps as necessary.\nThe initial value is that of `make-sparse-keymap'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-activate-highlight":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Activate highlighting of the search pattern set to PATTERN.\nThis function does nothing if `evil-ex-search-interactive' or\n`evil-ex-search-highlight-all' is nil. ","arglist":["pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-paren":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner parenthesis.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-restore-mark":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restore the mark, including whether it was transient.\nSee also `evil-save-mark'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-with-hproject-point-on-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Project point after BODY to current window.\nIf point is on a position left or right of the current window\nthen it is moved to the left and right boundary of the window,\nrespectively. If `auto-hscroll-mode' is non-nil then the left and\nright positions are increased or decreased, respectively, by\n`horizontal-margin' so that no automatic scrolling occurs.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-local":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-pending-intercept-maps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"An alist of pending intercept maps.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-move-far-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Closes the current window, splits the lower-right one vertically\nand redisplays the current buffer there.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-outer-text-objects-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for outer text objects.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-a-symbol":"o","evil-a-tag":"t","evil-a-back-quote":"`","evil-a-double-quote":"\"","evil-a-single-quote":"'","evil-an-angle":">","evil-an-angle":">","evil-a-curly":"}","evil-a-curly":"}","evil-a-curly":"}","evil-a-bracket":"]","evil-a-bracket":"]","evil-a-paren":")","evil-a-paren":")","evil-a-paren":")","evil-a-paragraph":"p","evil-a-sentence":"s","evil-a-WORD":"W","evil-a-word":"w"}},"evil-keymap-for-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the keymap associated with MODE.\nReturn the keymap variable if VARIABLE is non-nil.\nSee also `evil-mode-for-keymap'.","arglist":["mode","&optional","variable"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Insert state is enabled.\nUse the command `evil-insert-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-force-abort-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns non-nil iff the current command should abort the recording of repeat information.","arglist":["repeat-type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-repeat-substitute-with-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat last substitute command with last search pattern.\nThis is the same as :s//~/r","arglist":["beg","end","&optional","flags"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The current range of the Ex command.","fn-docstring":"Returns the first and last position of the current range.","arglist":["beg-line","&optional","end-line"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-up":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window and the cursor COUNT lines upwards.\nIf COUNT is not specified the function scrolls down\n`evil-scroll-count', which is the last used count.\nIf the scroll count is zero the command scrolls half the screen.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-this-motion-count":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Current motion count.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-join":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Join the selected lines with optional COUNT and BANG.","arglist":["beg","end","&optional","count","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-exit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Exit interactive search, keeping lazy highlighting active.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-abort":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Abort interactive search, disabling lazy highlighting.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-cjk-word-combining-categories":{"default":"((nil . 94) (94) (114 . 107) (114 . 65) (114 . 71) (107 . 114) (107 . 65) (107 . 71) (65 . 114) (65 . 107) (65 . 71) (71 . 114) (71 . 107) (71 . 65))","local":null,"default-type":"cons","var-docstring":"List of pair (cons) of categories to determine word boundary\nused in `evil-cjk-word-boundary-p'. See the documentation of\n`word-combining-categories'. Use `describe-categories' to see the\nlist of categories.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-delete-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete next character.","arglist":["beg","end","&optional","type","register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-delete-hl":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Remove the highlighting object with a certain NAME.","arglist":["name"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-with-view-list":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Opens new list view buffer.\n\nPROPERTIES is a property-list which supports the following properties:\n\n:name (required) The name of the buffer.\n:mode-name (required) The name for the mode line.\n:format (required) The value for `tabulated-list-format'.\n:entries (required) The value for `tabulated-list-entries'.\n:select-action (optional) A function for row selection.\n It takes in a single parameter, which is the selected row's\n vector value that is passed into `:entries'.\n","arglist":["&rest","properties"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-this-register":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Current register.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-set-custom-state-maps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Changes the list of special keymaps.\nVAR is the variable containing the list of keymaps.\nPENDING-VAR is the variable containing the list of the currently pending\n keymaps.\nKEY the special symbol to be stored in the keymaps.\nMAKE the creation function of the special keymaps.\nNEWLIST the list of new special keymaps.","arglist":["var","pending-var","key","_make","newlist"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-type-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return property PROP for TYPE.","arglist":["type","prop"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-word":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for word near point.\nIf FORWARD is nil, search backward, otherwise forward. If SYMBOL\nis non-nil then the functions searches for the symbol at point,\notherwise for the word at point.","arglist":["forward","unbounded","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-map-alist":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Association list of keymaps to use for Evil modes.\nElements have the form (MODE . KEYMAP), with the first keymaps\nhaving higher priority.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-local-mode-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hook run after entering or leaving `evil-local-mode'.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-parser":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse STRING as a SYMBOL in GRAMMAR.\nIf GREEDY is non-nil, the whole of STRING must match.\nIf the parse succeeds, the return value is a cons cell\n(RESULT . TAIL), where RESULT is a parse tree and TAIL is\nthe remainder of STRING. Otherwise, the return value is nil.\n\nGRAMMAR is an association list of symbols and their definitions.\nA definition is either a list of production rules, which are\ntried in succession, or a #'-quoted function, which is called\nto parse the input.\n\nA production rule can be one of the following:\n\n nil matches the empty string.\n A regular expression matches a substring.\n A symbol matches a production for that symbol.\n (X Y) matches X followed by Y.\n (\\? X) matches zero or one of X.\n (* X) matches zero or more of X.\n (+ X) matches one or more of X.\n (& X) matches X, but does not consume.\n (! X) matches anything but X, but does not consume.\n\nThus, a simple grammar may look like:\n\n ((plus \"\\\\+\") ; plus <- \"+\"\n (minus \"-\") ; minus <- \"-\"\n (operator plus minus)) ; operator <- plus / minus\n\nAll input-consuming rules have a value. A regular expression evaluates\nto the text matched, while a list evaluates to a list of values.\nThe value of a list may be overridden with a semantic action, which is\nspecified with a #'-quoted expression at the end:\n\n (X Y #'foo)\n\nThe value of this rule is the result of calling foo with the values\nof X and Y as arguments. Alternatively, the function call may be\nspecified explicitly:\n\n (X Y #'(foo $1 $2))\n\nHere, $1 refers to X and $2 refers to Y. $0 refers to the whole list.\nDollar expressions can also be used directly:\n\n (X Y #'$1)\n\nThis matches X followed by Y, but ignores the value of Y;\nthe value of the list is the same as the value of X.\n\nIf the SYNTAX argument is non-nil, then all semantic actions\nare ignored, and a syntax tree is constructed instead. The\nsyntax tree obeys the property that all the leave nodes are\nparts of the input string. Thus, by traversing the syntax tree,\none can determine how each character was parsed.\n\nThe following symbols have reserved meanings within a grammar:\n`\\?', `*', `+', `&', `!', `function', `alt', `seq' and nil.","arglist":["string","symbol","grammar","&optional","greedy","syntax"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-open-fold":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open fold at point.\nSee also `evil-close-fold'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-inhibit-operator-value":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"This variable is used to transfer the value\nof `evil-inhibit-operator' from one local scope to another.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-replace-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-normal-state":"<escape>","evil-replace-backspace":"DEL"}},"evil-replace":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Replace text from BEG to END with CHAR.","arglist":["beg","end","&optional","type","char"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enter an Ex command.\nThe ex command line is initialized with the value of\nINITIAL-INPUT. If the command is called interactively the initial\ninput depends on the current state. If the current state is\nnormal state and no count argument is given then the initial\ninput is empty. If a prefix count is given the initial input is\n.,.+count. If the current state is visual state then the initial\ninput is the visual region '<,'> or `<,`>. If the value of the\nglobal variable `evil-ex-initial-input' is non-nil, its content\nis appended to the line.","arglist":["&optional","initial-input"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-beginning-of-line-or-digit-argument":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the current line.\nThis function passes its command to `digit-argument' (usually a 0)\nif it is not the first event.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-pattern-update-ex-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update the Ex info string.","arglist":["_hl","result"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-show-registers":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shows the contents of all registers.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-state-overriding-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a keymap alist of overriding keymaps for STATE.","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-nearest":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Moves point forward to the first of several motions.\nFORWARDS is a list of forward motion functions (i.e. each moves\npoint forward to the next end of a text object (if passed a +1)\nor backward to the preceeding beginning of a text object (if\npassed a -1)). This function calls each of these functions once\nand moves point to the nearest of the resulting positions. If\nCOUNT is positive point is moved forward COUNT times, if negative\npoint is moved backward -COUNT times.","arglist":["count","&rest","forwards"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jumps-struct-idx":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Access slot \"idx\" of `evil-jumps-struct' struct CL-X.","arglist":["cl-x"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-word-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for the next occurrence of word under the cursor.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-highlight-block":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Highlight rectangular region from BEG to END.\nDo this by putting an overlay on each line within the rectangle.\nEach overlay extends across all the columns of the rectangle.\nReuse overlays where possible to prevent flicker.","arglist":["beg","end","&optional","overlays"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Emacs state is enabled.\nUse the command `evil-emacs-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-pattern-ignore-case":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return t if and only if PATTERN should ignore case.","arglist":["pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-update-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update the current search pattern.","arglist":["_beg","_end","_range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-expression":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The evaluation tree.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-esc-delay":{"default":0.01,"local":null,"default-type":"float","var-docstring":"The time, in seconds, to wait for another key after escape.\nIf no further event arrives during this time, the event is\ntranslated to `ESC'. Otherwise, it is translated according to\n`input-decode-map'. This does not apply in Emacs state, and may\nalso be inhibited by setting `evil-inhibit-esc'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-a-curly":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a curly bracket (\"brace\").","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-input-method":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Input method used in Insert state and Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-face":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the face of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-flash-timer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Timer for flashing search results.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-end-of-line-or-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the last character of the current screen\nline if `visual-line-mode' is active and\n`evil-respect-visual-line-mode' is non-nil. If COUNT is given,\nmove COUNT - 1 screen lines downward first.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restores a character visual selection.\nIf the selection is in a single line, the restored visual\nselection covers the same number of characters. If the selection\ncovers several lines, the restored selection covers the same\nnumber of lines and the same number of characters in the last\nline as the original selection.","arglist":["nfwdlines"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-savehist-sync":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Updates the printable value of window jumps for `savehist'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Complete to the nearest following word.\nSearch backward if a match isn't found.\nCalls `evil-complete-next-func'.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-with-transient-mark-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY with Transient Mark mode.\nThen restore Transient Mark mode to its previous setting.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-inner-single-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner single-quoted expression.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the type of OBJECT, or DEFAULT if none.","arglist":["object","&optional","default"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-expand-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Expand RANGE according to its type.\nReturn a new range if COPY is non-nil.","arglist":["range","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-ex-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Called to record a search command.\nFLAG is either 'pre or 'post if the function is called before\nresp. after executing the command.","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-list-view-mode-abbrev-table":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Abbrev table for `evil-list-view-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-delete-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Deletes a buffer.\nAll windows currently showing this buffer will be closed except\nfor the last window in each frame.","arglist":["buffer","&optional","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-pop-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Same as `evil-repeat-pop', but with negative COUNT.","arglist":["count","&optional","save-point"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-send-leader":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Put symbol leader in `unread-command-events' to trigger any\n<leader> bindings.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-sentence":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--jumps-get-window-jump-list":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-select":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create a Visual selection of type TYPE from BEG to END.\nPoint and mark are positioned so that the resulting selection\nhas the specified boundaries. If DIR is negative, point precedes mark,\notherwise it succedes it. To specify point and mark directly,\nuse `evil-visual-make-selection'.","arglist":["beg","end","&optional","type","dir","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-interactive-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of Evil-specific interactive codes.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-motion-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-grammar":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Grammar for Ex.\nAn association list of syntactic symbols and their definitions.\nThe first entry is the start symbol. A symbol's definition may\nreference other symbols, but the grammar cannot contain\nleft recursion. See `evil-parser' for a detailed explanation\nof the syntax.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-wrap":{"default":"t","local":null,"default-type":"symbol","var-docstring":"\\<evil-motion-state-map>\nWhether search with \\[evil-search-forward] and \\[evil-search-backward] wraps around the buffer.\nIf this is non-nil, search stops at the buffer boundaries.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-full-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a range encompassing the whole buffer.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-push":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Pushes the current cursor/file position to the jump list.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-setup-and-update":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Initialize Ex minibuffer with `evil-ex-setup', then call `evil-ex-update'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-auto-indent":{"default":"t","local":true,"default-type":"symbol","var-docstring":"\\<evil-normal-state-map>\nWhether to auto-indent when opening lines with \\[evil-open-below] and \\[evil-open-above].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The position of `point' when the ex command has been called.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-up-paren":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of balanced parentheses.\nOPEN and CLOSE should be characters identifying the opening and\nclosing parenthesis, respectively. If COUNT is greater than zero\npoint is moved forward otherwise it is moved backwards. Whenever\nan opening delimiter is found the COUNT is increased by one, if a\nclosing delimiter is found the COUNT is decreased by one. The\nmotion stops when COUNT reaches zero. The match-data reflects the\nlast successful match (that caused COUNT to reach zero).","arglist":["open","close","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-next-line-func":{"default":"(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (let ((hippie-expand-try-functions-list '(try-expand-line try-expand-line-all-buffers))) (hippie-expand arg)))","local":null,"default-type":"cons","var-docstring":"Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-next-line].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-concat-keymap-alists":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate keymap association lists, removing duplicates.\nA keymap alist is a list of cons cells (VAR . MAP) where each keymap\nmay occur only once, but where the variables may be repeated\n(e.g., (VAR . MAP1) (VAR . MAP2) is allowed). The order matters,\nwith the highest priority keymaps being listed first.","arglist":["&rest","sequences"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-overriding-keymap-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether MAP is an overriding keymap for STATE.\nIf STATE is nil, it means any state.","arglist":["map","&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-make-search-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Creates a PATTERN for search.\nThis function respects the values of `evil-ex-search-case'.","arglist":["regexp"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-screen-line-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Linewise selection in `visual-line-mode'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-command-force-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether COMMAND accepts the bang argument.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-expand":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Expand BEG and END as TYPE with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list.","arglist":["beg","end","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-previous-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Complete a whole line.\nCalls `evil-complete-previous-line-func'.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-bottom-line-to-top":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the line right below the window,\nor line COUNT to the top of the window.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-overriding-keymap-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the state for the overriding keymap MAP.\nA return value of t means all states.","arglist":["map"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-command-collection":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Called to complete a command.","arglist":["cmd","predicate","flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-transform-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Apply TRANSFORM to RANGE according to its type.\nReturn a new range if COPY is non-nil.","arglist":["transform","range","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT half-screenwidths to the left.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-skip-empty-lines":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Non-nil of the current insertion should not take place on\n lines at which the insertion point is behind the end of the\n line.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-goto-definition-semantic":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find definition for POSITION with semantic.","arglist":["_string","position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-previous-match":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select next match.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-append":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to Insert state just after point.\nThe insertion will be repeated COUNT times and repeated once for\nthe next VCOUNT - 1 lines starting at the same column. If\nSKIP-EMPTY-LINES is non-nil, the insertion will not be performed\non lines on which the insertion point would be after the end of\nthe lines.","arglist":["count","&optional","vcount","skip-empty-lines"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-find-char-reverse":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat the last find COUNT times in the opposite direction.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-command-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set PROPERTY to VALUE for COMMAND.\nTo set multiple properties at once, see\n`evil-set-command-properties' and `evil-add-command-properties'.","arglist":["command","property","value"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-update-x-selection":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update the X selection with the current visual region.","arglist":["&optional","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-check-buffers":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-transient-mark":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Toggle Transient Mark mode.\nEnsure that the region is properly deactivated.\nEnable with positive ARG, disable with negative ARG.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jump-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to new COUNT-th window left of the current one.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-count":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Holds last used prefix for `evil-scroll-up'\nand `evil-scroll-down'.\nDetermines how many lines should be scrolled.\nDefault value is 0 - scroll half the screen.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-vim-style-regexp":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"If non-nil Vim-style backslash codes are supported in search patterns.\nSee `evil-transform-vim-style-regexp' for the supported backslash\ncodes. Note that this only affects the search command if\n`evil-search-module' is set to 'evil-search. The isearch module\nalways uses plain Emacs regular expressions.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-mark":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The position of mark in Visual state, a marker.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ace-jump-word-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Jump visually to the beginning of a word using ace-jump.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-curly":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner curly bracket (\"brace\").","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-visual-block":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restores a character visual selection.\nIf the selection is in a single line, the restored visual\nselection covers the same number of characters. If the selection\ncovers several lines, the restored selection covers the same\nnumber of lines and the same number of characters in the last\nline as the original selection.","arglist":["nfwdlines","nfwdchars"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-state":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The Evil state being switched to.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-a-single-quote":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select a single-quoted expression.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--find-thing":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a cons of THING near point as a string and its position.\nTHING should be a symbol understood by `thing-at-point',\ne.g. 'symbol or 'word. If FORWARD is nil, search backward,\notherwise forward. Returns nil if nothing is found.","arglist":["forward","thing"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-match-interactive-code":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Match an interactive code at position POS in string INTERACTIVE.\nReturns the first matching entry in `evil-interactive-alist', or nil.","arglist":["interactive","&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-case":{"default":"smart","local":null,"default-type":"symbol","var-docstring":"The case behaviour of the search command.\nSmart case means that the pattern is case sensitive if and only\nif it contains an upper case letter, otherwise it is case\ninsensitive.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-scroll-down":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window and the cursor COUNT lines downwards.\nIf COUNT is not specified the function scrolls down\n`evil-scroll-count', which is the last used count.\nIf the scroll count is zero the command scrolls half the screen.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-paragraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner paragraph.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-parse-global":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse STRING as a global argument.","arglist":["string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normalize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Normalize BEG and END as TYPE with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list.","arglist":["beg","end","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-x-select-timeout":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Time in seconds for the update of the X selection.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-scroll-count-reset":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Sets `evil-scroll-count' to 0.\n`evil-scroll-up' and `evil-scroll-down' will scroll\nfor a half of the screen(default).","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-global":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The Ex global command.\n[BEG,END]global[!]/PATTERN/COMMAND","arglist":["beg","end","&optional","pattern","command","invert"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Major mode for the Evil command line window.\n\nThis mode runs the hook `evil-command-window-mode-hook', as the final or penultimate step\nduring initialization.\n\n\\{evil-command-window-mode-map}","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-down":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to new COUNT-th window below the current one.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-C-i-jump":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether `C-i' jumps forward in the jump list (like Vim).\nOtherwise, `C-i' inserts a tab character.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-motion-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Motion state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-delete-or-yank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute evil-delete or evil-yank on the given region.\nIf SHOULD-DELETE is t, evil-delete will be executed, otherwise\nevil-yank.\nThe region specified by BEG and END will be adjusted if COUNT is\ngiven.","arglist":["should-delete","beg","end","type","register","count","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-prompt":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"String to use for search prompt.","fn-docstring":"Return the search prompt for the given direction.","arglist":["forward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Information about the latest repeat command.\nThis is a list of three elements (POINT COUNT UNDO-POINTER),\nwhere POINT is the position of point before the latest repeat,\nCOUNT the count-argument of the latest repeat command and\nUNDO-POINTER the head of the undo-list before the last command\nhas been repeated.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Ex.\nKey sequences bound in this map are immediately executed.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-want-Y-yank-to-eol":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether `Y' yanks to the end of the line.\nThe default behavior is to yank the whole line, like Vim.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-regex-case":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the case as implied by \\c or \\C in regular expression RE.\nIf \\c appears anywhere in the pattern, the pattern is case\ninsensitive. If \\C appears, the pattern is case sensitive.\nOnly the first occurrence of \\c or \\C is used, all others are\nignored. If neither \\c nor \\C appears in the pattern, the case\nspecified by DEFAULT-CASE is used. DEFAULT-CASE should be either\n`sensitive', `insensitive' or `smart'. In the latter case, the pattern\nwill be case-sensitive if and only if it contains an upper-case\nletter, otherwise it will be case-insensitive.","arglist":["re","default-case"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-quote-simple":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Insert state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-define-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define a command COMMAND.\n\n(fn COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)","arglist":["command","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-window-move-very-top":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Closes the current window, splits the upper-left one horizontally\nand redisplays the current buffer there.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-restore-transient-mark-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restore Transient Mark mode.\nThis presupposes that `evil-save-transient-mark-mode' has been\ncalled earlier. If Transient Mark mode was disabled before but\nenabled in the meantime, this function disables it; if it was\nenabled before but disabled in the meantime, this function\nenables it.\n\nThe earlier settings of Transient Mark mode are stored in\n`evil-transient-vals'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-open-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Insert a new line above point and switch to Insert state.\nThe insertion will be repeated COUNT times.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-initializing-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether Evil is in the process of being initialized.","arglist":["&optional","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-called-interactively-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Wrapper for `called-interactively-p'.\nIn older versions of Emacs, `called-interactively-p' takes\nno arguments. In Emacs 23.2 and newer, it takes one argument.","arglist":null,"functionp":null,"macrop":true,"keymap-inv":null},"evil-range-union":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the union of the ranges RANGE1 and RANGE2.\nIf the ranges have conflicting types, use RANGE1's type.\nThis can be overridden with TYPE.","arglist":["range1","range2","&optional","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-command-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Start command window with search history and current minibuffer content.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-line-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return size of line from BEG to END with PROPERTIES.\n\nInclude whole lines.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-all-buffers":{"default":"t","local":null,"default-type":"symbol","var-docstring":"\\<evil-insert-state-map>\nWhether completion looks for matches in all buffers.\nThis applies to \\[evil-complete-next] and \\[evil-complete-previous] in insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-list-view-quit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-modes":{"default":"(apropos-mode Buffer-menu-mode calendar-mode color-theme-mode command-history-mode compilation-mode dictionary-mode ert-results-mode help-mode Info-mode Man-mode speedbar-mode undo-tree-visualizer-mode woman-mode)","local":null,"default-type":"cons","var-docstring":"Modes that should come up in Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inclusive-contract":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform contract transformation on inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-select-inner-object":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return an inner text object range of COUNT objects.\nIf COUNT is positive, return objects following point; if COUNT is\nnegative, return objects preceding point. If one is unspecified,\nthe other is used with a negative argument. THING is a symbol\nunderstood by thing-at-point. BEG, END and TYPE specify the\ncurrent selection. If LINE is non-nil, the text object should be\nlinewise, otherwise it is character wise.","arglist":["thing","beg","end","type","&optional","count","line"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-shift-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shift text from BEG to END to the right.\nThe text is shifted to the nearest multiple of `evil-shift-width'\n(the rounding can be disabled by setting `evil-shift-round').\nIf PRESERVE-EMPTY is non-nil, lines that contain only spaces are\nindented, too, otherwise they are ignored. The relative column\nof point is preserved if this function is not called\ninteractively. Otherwise, if the function is called as an\noperator, point is moved to the first non-blank character.\nSee also `evil-shift-left'.","arglist":["beg","end","&optional","count","preserve-empty"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-parser--dexp":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse a numerical dollar-sign symbol.\nGiven e.g. $4, return 4.","arglist":["obj"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-yanked-rectangle":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Special function to delete the block yanked by a previous paste command.","arglist":["nrows","ncols"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-inner-bracket":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner square bracket.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-replacement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last substitute replacement.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-init-shell-argument-completion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Prepares the current minibuffer for completion of shell commands.\nThis function must be called from the :runner function of some\nargument handler that requires shell completion.","arglist":["flag","&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mouse-events-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns non-nil iff KEYS contains a mouse event.","arglist":["keys"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-describe":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return description of BEG and END with PROPERTIES.\nIf no description is available, return the empty string.","arglist":["beg","end","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-run-pending-custom-initialize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Executes the pending initializations.\nSee `evil-pending-custom-initialize'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-execute-in-normal-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute the next command in Normal state.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-post-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Finish recording of repeat-information for the current-command.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-regexp-search":{"default":"t","local":null,"default-type":"symbol","var-docstring":"\\<evil-motion-state-map>\nWhether to use regular expressions for searching in \\[evil-search-forward] and \\[evil-search-backward].","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-end":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The end of the Visual selection, a marker.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-justify-lines":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Justifes all lines in a range.\nBEG and END specify the range of those lines to be\njustified. JUSTIFY is either 'left, 'right or 'center according\nto the justification type. POSITION is the maximal text width for\nright and center justification or the column at which the lines\nshould be left-aligned for left justification.","arglist":["beg","end","justify","position"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-move-very-bottom":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Closes the current window, splits the lower-right one horizontally\nand redisplays the current buffer there.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-shell-command-completion-at-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-range-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return properties of RANGE.","arglist":["range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-binding":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns the final binding of COMMAND.","arglist":["command","&optional","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-subrange-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether RANGE1 is contained within RANGE2.","arglist":["range1","range2"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-flags":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last substitute flags.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-replacement-magic":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"All magic characters in a replacement string","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-get-minor-mode-keymap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Get the auxiliary keymap for MODE in STATE, creating one if it\ndoes not already exist.","arglist":["state","mode"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-bigword":{"default":"^ \t\r\n","local":true,"default-type":"string","var-docstring":"The set of characters to be interpreted as WORD boundaries.\nThis is enclosed with square brackets and used as a regular\nexpression. By default, whitespace characters are considered\nWORD boundaries.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-replace-state-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Mode line tag for Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Goes to the next occurrence.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank-handler":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the yank handler for MOTION.\nMOTION defaults to the current motion.","arglist":["&optional","motion"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-refresh-mode-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Refresh mode line tag.","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jumps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-enclose-avy-for-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enclose avy to make it suitable for motions.\nBased on `evil-enclose-ace-jump-for-motion'.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-repeat-count":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The explicit count when repeating a command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-read":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Inserts the contents of FILE below the current line or line COUNT.","arglist":["count","file"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-narrow-to-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Narrow BODY to the current line.\nBODY will signal the errors 'beginning-of-line or 'end-of-line\nupon reaching the beginning or end of the current line.\n\n(fn [[KEY VAL]...] BODY...)","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-scroll-page-down":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT pages downwards.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-undo-list-pointer":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Everything up to this mark is united in the undo-list.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-copy-from-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Copy characters from preceding non-blank line.\nThe copied text is inserted before point.\nARG is the number of lines to move backward.\nSee also \\<evil-insert-state-map>\\[evil-copy-from-below].","arglist":["arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-unbounded-word-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for the next occurrence of word under the cursor.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mouse-drag-track":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Track mouse drags by highlighting area between point and cursor.\nThe region will be defined with mark and point.\nDO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by\n`mouse-drag-region'.","arglist":["start-event","&optional","do-mouse-drag-region-post-process"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-backward-section-begin":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the beginning of the COUNT-th previous section.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-contract-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Contract RANGE according to its type.\nReturn a new range if COPY is non-nil.","arglist":["range","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-change-to-previous-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change the state of BUFFER to its previous state.","arglist":["&optional","buffer","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-line-1-first-non-blank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT-1 lines down on the first non-blank character.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-quit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Closes the current window, current frame, Emacs.\nIf the current frame belongs to some client the client connection\nis closed.","arglist":["&optional","force"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-transform-vim-style-regexp":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Transforms vim-style backslash codes to Emacs regexp.\nThis includes the backslash codes \\d, \\D, \\s, \\S, \\x, \\X,\n\\o, \\O, \\a, \\A, \\l, \\L, \\u, \\U and \\w, \\W. The new\ncodes \\y and \\Y can be used instead of the Emacs code \\s and\n\\S which have a different meaning in Vim-style.","arglist":["regexp"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-join":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Join the selected lines.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-current-insertion":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Information about the latest insertion in insert state.\nThis should be a pair (BEG . END) that describes the\nbuffer-region of the newly inserted text.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of Visual selection functions.\nElements have the form (NAME . FUNCTION).","fn-docstring":"Return an association list from types to selection symbols.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-screen-line-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return size of screen-line from BEG to END with PROPERTIES.\n\nInclude whole lines, being aware of `visual-line-mode'\nwhen `evil-respect-visual-line-mode' is non-nil.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-yank-block-handler":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Inserts the current text as block.","arglist":["lines"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-rotate":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"In Visual Block selection, put point in CORNER.\nCorner may be one of `upper-left', `upper-right', `lower-left'\nand `lower-right':\n\n upper-left +---+ upper-right\n | |\n lower-left +---+ lower-right\n\nWhen called interactively, the selection is rotated blockwise.","arglist":["corner","&optional","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Motion state.\n(That is, whether `evil-state' is `motion'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-local-var":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define SYMBOL as permanent buffer local variable, and return SYMBOL.\nThe parameters are the same as for `defvar', but the variable\nSYMBOL is made permanent buffer local.","arglist":["symbol","&optional","initvalue","docstring"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-this-command-keys":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Version of `this-command-keys' with finer control over prefix args.","arglist":["&optional","post-cmd"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-normal-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-forward-section-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the COUNT-th next section.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-select-quote-thing":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Selection THING as if it described a quoted object.\nTHING is typically either 'evil-quote or 'evil-chars. This\nfunction is called from `evil-select-quote'.","arglist":["thing","beg","end","_type","count","&optional","inclusive"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-increase-width":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Increase current window width by COUNT.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-select-block":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a range (BEG END) of COUNT delimited text objects.\nBEG END TYPE are the currently selected (visual) range. The\ndelimited object must be given by THING-up function (see\n`evil-up-block').\n\nSELECTION-TYPE is symbol that determines which parts of the block\nare selected. If it is 'inclusive or t OPEN and CLOSE are\nincluded in the range. If it is 'exclusive or nil the delimiters\nare not contained. If it is 'exclusive-line the delimiters are\nnot included as well as adjacent whitespace until the beginning\nof the next line or the end of the previous line. If the\nresulting selection consists of complete lines only and visual\nstate is not active, the returned selection is linewise.\n\nIf COUNTCURRENT is non-nil an objected is counted if the current\nselection matches that object exactly.\n\nUsually scanning for the surrounding block starts at (1+ beg)\nand (1- end). If this might fail due to the behavior of THING\nthen FIXEDSCAN can be set to t. In this case the scan starts at\nBEG and END. One example where this might fail is if BEG and END\nare the delimiters of a string or comment.","arglist":["thing","beg","end","type","count","&optional","selection-type","countcurrent","fixedscan"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-execute-repeat-info-with-count":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat the repeat-information REPEAT-INFO with the count of\nthe first command replaced by COUNT. The count is replaced if\nand only if COUNT is non-nil.","arglist":["count","repeat-info"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-jump-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to newer position in jump list.\nTo go the other way, press \\<evil-motion-state-map>\\[evil-jump-backward].","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-pattern-whole-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return t if and only if PATTERN should match all occurences of a line.\nOtherwise PATTERN matches only the first occurence.","arglist":["pattern"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-restriction-stack":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"List of previous restrictions.\nUsing `evil-with-restriction' stores the previous values of\n`point-min' and `point-max' as a pair in this list.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-change":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change text from BEG to END with TYPE.\nSave in REGISTER or the kill-ring with YANK-HANDLER.\nDELETE-FUNC is a function for deleting text, default `evil-delete'.\nIf TYPE is `line', insertion starts on an empty line.\nIf TYPE is `block', the inserted text in inserted at each line\nof the block.","arglist":["beg","end","&optional","type","register","yank-handler","delete-func"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-range-beginning":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Beginning of `evil-operator-range'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-goto-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the first non-blank character of line COUNT.\nBy default the last line.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-newline-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Inserts a new line above point and places point in that line\nwith regard to indentation.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-nohighlight":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Disable the active search highlightings.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-vars":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-find-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for the next occurrence of the PATTERN in DIRECTION.\nPATTERN must be created using `evil-ex-make-pattern', DIRECTION\nis either 'forward or 'backward. If NOWRAP is non nil, the search\ndoes not wrap at buffer boundaries. Furthermore this function\nonly searches invisible text if `search-invisible' is t. If\nPATTERN is not specified the current global pattern\n`evil-ex-search-pattern' and if DIRECTION is not specified the\ncurrent global direction `evil-ex-search-direction' is used.\nThis function returns t if the search was successful, nil if it\nwas unsuccessful and 'wrapped if the search was successful but\nhas been wrapped at the buffer boundaries.","arglist":["&optional","pattern","direction","nowrap"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-resume":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switch to Insert state at previous insertion point.\nThe insertion will be repeated COUNT times. If called from visual\nstate, only place point at the previous insertion position but do not\nswitch to insert state.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-mode-line-tag":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Mode-Line indicator for the current state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-split-prev-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits window and goes to the COUNT-th prev buffer in the buffer list.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-keymap":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap used in ex-search-mode.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"previous-history-element":"C-p","next-history-element":"C-n","evil-paste-from-register":"C-r","evil-ex-search-command-window":"C-f","evil-ex-delete-backward-char":"DEL","abort-recursive-edit":"C-g","exit-minibuffer":"C-j","exit-minibuffer":"C-j","abort-recursive-edit":"C-g","file-cache-minibuffer-complete":"<C-tab>","self-insert-command":"TAB","previous-history-element":"C-p","previous-line-or-history-element":"<up>","previous-history-element":"C-p","next-history-element":"C-n","next-line-or-history-element":"<down>","next-history-element":"C-n","minibuffer-beginning-of-buffer":"M-<","previous-matching-history-element":"M-r","next-matching-history-element":"M-s","previous-history-element":"C-p","next-history-element":"C-n"}},"evil-visual-expand-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Expand the region to the Visual selection.\nIf EXCLUDE-NEWLINE is non-nil and the selection ends with a newline,\nexclude that newline from the region.","arglist":["&optional","exclude-newline"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-apply-on-rectangle":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Like `apply-on-rectangle' but maybe extends to eol.\nIf `temporary-goal-column' is set to a big number, then the\nregion of each line is extended to the end of each line. The end\ncolumn is set to the maximal column in all covered lines.","arglist":["function","start","end","&rest","args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-concat-lists":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate lists, removing duplicates.\nElements are compared with `eq'.","arglist":["&rest","sequences"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-make-substitute-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Creates a PATTERN for substitution with FLAGS.\nThis function respects the values of `evil-ex-substitute-case'\nand `evil-ex-substitute-global'.","arglist":["regexp","flags"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-argument-handler-completer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["arg-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Starts a forward search.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-record-change":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Record the current buffer changes during a repeat.\nIf CHANGE is specified, it is added to `evil-repeat-changes'.","arglist":["relpos","ins","ndel"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-digraphs-table":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Table of default digraphs.\nThis includes all digraphs defined in RFC 1345,\nas well as miscellaneous digraphs for multi-byte characters.\nSee also `evil-digraphs-table-user'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Called to record a search command.\nFLAG is either 'pre or 'post if the function is called before resp.\nafter executing the command.","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Cursor for Motion state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-state-intercept-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a keymap alist of intercept keymaps for STATE.","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-text-object-make-linewise":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Turn the text object selection RANGE to linewise.\nThe selection is adjusted in a sensible way so that the selected\nlines match the user intent. In particular, whitespace-only parts\nat the first and last lines are omitted. This function returns\nthe new range.","arglist":["range"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-default-state":{"default":"normal","local":null,"default-type":"symbol","var-docstring":"The default Evil state.\nThis is the state a buffer starts in when it is not otherwise\nconfigured (see `evil-set-initial-state' and\n`evil-buffer-regexps'). The value may be one of `normal',\n`insert', `visual', `replace', `operator', `motion' and `emacs'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-max-length":{"default":100,"local":null,"default-type":"integer","var-docstring":"The maximum number of jumps to keep track of.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-search-word-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search for the next occurrence of word under the cursor.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-open-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Insert a new line below point and switch to Insert state.\nThe insertion will be repeated COUNT times.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Enable Visual state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-block-contract":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform contract transformation on block from BEG to END with PROPERTIES.\n\nLike `inclusive', but for rectangles:\nthe last column is included.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-header-line-height":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the height of the header line.\nIf there is no header line, return 0.\nUsed as a fallback implementation of `window-header-line-height' on\nolder Emacsen.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-keypress-parser":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Read from keyboard or INPUT and build a command description.\nReturns (CMD COUNT), where COUNT is the numeric prefix argument.\nBoth COUNT and CMD may be nil.","arglist":["&optional","input"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-state-auxiliary-keymaps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a keymap alist of auxiliary keymaps for STATE.","arglist":["state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-keystrokes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeation recording function for commands that are repeated by keystrokes.","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normalize-repeat-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Concatenate consecutive arrays in REPEAT-INFO.\nReturns a single array.","arglist":["repeat-info"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-command-completion-at-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-module":{"default":"isearch","local":null,"default-type":"symbol","var-docstring":"The search module to be used.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inner-sentence":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner sentence.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-exclusive-normalize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform normalize transformation on exclusive from BEG to END with PROPERTIES.\n\nReturn the positions unchanged, with some exceptions.\nIf the end position is at the beginning of a line, then:\n\n* If the beginning position is at or before the first non-blank\n character on the line, return `line' (expanded).\n\n* Otherwise, move the end position to the end of the previous\n line and return `inclusive' (expanded).","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-name":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the name of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-line-contract":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform contract transformation on line from BEG to END with PROPERTIES.\n\nInclude whole lines.","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Operator-Pending state.\n(That is, whether `evil-state' is `operator'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-range-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set RANGE's end to END.\nIf COPY is non-nil, return a copy of RANGE.","arglist":["range","end","&optional","copy"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-flatten-syntax-tree":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Find all paths from the root of TREE to its leaves.\nTREE is a syntax tree, i.e., all its leave nodes are strings.\nThe `nth' element in the result is the syntactic context\nfor the corresponding string index (counted from zero).","arglist":["tree"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Insert state.\n(That is, whether `evil-state' is `insert'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-mode-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hook run after entering Evil-cmd mode.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-recording-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether we are recording a repeat.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-struct-ring":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Access slot \"ring\" of `evil-jumps-struct' struct CL-X.","arglist":["cl-x"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-argument-handler-runner":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["arg-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-contract-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"The inverse of `evil-visual-expand-region'.\nCreate a Visual selection that expands to the current region.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-line-down":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT lines downwards.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-entry-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when entering Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-scroll-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT half-screenwidths to the right.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-show-jumps":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Display the contents of the jump list.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-jumps-pre-jump-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run just before jumping to a location in the jump list.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--jumps-window-configuration-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["&rest","_args"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-abort-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be nonrepeatable.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-block-overlays":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Overlays for Visual Block selection, one for each line.\nThey are reused to minimize flicker.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-mode-enable-in-buffers":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-vsplit-window-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"If non-nil vertically split windows with are created to the right.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-esc-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Non-nil if `evil-esc-mode' is enabled.","fn-docstring":"Toggle interception of \\e (escape).\nEnable with positive ARG and disable with negative ARG.\n\nWhen enabled, `evil-esc-mode' modifies the entry of \\e in\n`input-decode-map'. If such an event arrives, it is translated to\na plain 'escape event if no further event occurs within\n`evil-esc-delay' seconds. Otherwise no translation happens and\nthe ESC prefix map (i.e. the map originally bound to \\e in\n`input-decode-map`) is returned.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-complete-next-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Complete a whole line.\nCalls `evil-complete-next-line-func'.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-initial-state-for-buffer-name":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the initial Evil state to use for a buffer with name NAME.\nMatches the name against the regular expressions in\n`evil-buffer-regexps'. If none matches, returns DEFAULT.","arglist":["&optional","name","default"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Echo area message for Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-update-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the update-hook of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-backward-beginning":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move backward to beginning of THING.\nThe motion is repeated COUNT times. This is the same as calling\n`evil-backward-beginning' with -COUNT.","arglist":["thing","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-open-folds":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open all folds.\nSee also `evil-close-folds'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-fold-list":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Actions to be performed for various folding operations.\n\nThe value should be a list of fold handlers, were a fold handler has\nthe format:\n\n ((MODES) PROPERTIES)\n\nMODES acts as a predicate, containing the symbols of all major or\nminor modes for which the handler should match. For example:\n\n '((outline-minor-mode org-mode) ...)\n\nwould match for either outline-minor-mode or org-mode, even though the\nformer is a minor mode and the latter is a major.\n\nPROPERTIES specifies possible folding actions and the functions to be\napplied in the event of a match on one (or more) of the MODES; the\nsupported properties are:\n\n - `:open-all'\n Open all folds.\n - `:close-all'\n Close all folds.\n - `:toggle'\n Toggle the display of the fold at point.\n - `:open'\n Open the fold at point.\n - `:open-rec'\n Open the fold at point recursively.\n - `:close'\n Close the fold at point.\n\nEach value must be a function. A value of `nil' will cause the action\nto be ignored for that respective handler. For example:\n\n `((org-mode)\n :close-all nil\n :open ,(lambda ()\n (show-entry)\n (show-children))\n :close hide-subtree)\n\nwould ignore `:close-all' actions and invoke the provided functions on\n`:open' or `:close'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-goto-mark-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the line of the marker specified by CHAR.","arglist":["char","&optional","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-match":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select next match.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-operator":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define an operator command OPERATOR.\nThe operator acts on the range of characters BEG through\nEND. BODY must execute the operator by potentially manipulating\nthe buffer contents, or otherwise causing side effects to happen.\n\nOptional keyword arguments are:\n- `:type' - force the input range to be of a given type (`inclusive',\n `line', `block', and `exclusive', or a self-defined motion type).\n- `:motion' - use a predetermined motion instead of waiting for one\n from the keyboard. This does not affect the behavior in visual\n state, where selection boundaries are always used.\n- `:repeat' - if non-nil (default), then \\<evil-normal-state-map>\\[evil-repeat] will repeat the\n operator.\n- `:move-point' - if non-nil (default), the cursor will be moved to\n the beginning of the range before the body executes\n- `:keep-visual' - if non-nil, the selection is not disabled when the\n operator is executed in visual state. By default, visual state is\n exited automatically.\n\n(fn OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)","arglist":["operator","args","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-mode-cmhh":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-rot13":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"ROT13 encrypt text.","arglist":["beg","end","&optional","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-leader":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set KEY to trigger leader bindings in STATE.\nKEY should be in the form produced by `kbd'. STATE is one of\n`normal', `insert', `visual', `replace', `operator', `motion',\n`emacs', a list of one or more of these, or `nil', which means\nall of the above. If LOCALLEADER is non-nil, set the local leader\ninstead.","arglist":["state","key","&optional","localleader"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-copy-from-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Copy characters from following non-blank line.\nThe copied text is inserted before point.\nARG is the number of lines to move forward.\nSee also \\<evil-insert-state-map>\\[evil-copy-from-above].","arglist":["arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-execute-in-emacs-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute the next command in Emacs state.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-state-properties":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Specifications made by `evil-define-state'.\nEntries have the form (STATE . PLIST), where PLIST is a property\nlist specifying various aspects of the state. To access a property,\nuse `evil-state-property'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-save-repeat-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY, protecting the values of repeat variables.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-hl-set-max":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the minimal buffer position of the highlight HL to MAX.","arglist":["hl","max"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-show-digraphs":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shows a list of all available digraphs.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-operator-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Operator-Pending state is enabled.\nUse the command `evil-operator-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-string":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-local-set-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Bind KEY to DEF in STATE in the current buffer.","arglist":["state","key","def"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-set-min":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the minimal buffer position of the highlight HL to MIN.","arglist":["hl","min"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-word-0":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-word-0'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-word-1":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-word-1'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-delete-backward-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Close the minibuffer if it is empty.\nOtherwise behaves like `delete-backward-char'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-extract-count":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Splits the key-sequence KEYS into prefix-argument and the rest.\nReturns the list (PREFIX CMD SEQ REST), where PREFIX is the\nprefix count, CMD the command to be executed, SEQ the subsequence\ncalling CMD, and REST is all remaining events in the\nkey-sequence. PREFIX and REST may be nil if they do not exist.\nIf a command is bound to some keyboard macro, it is expanded\nrecursively.","arglist":["keys"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-first-non-blank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the first non-blank character of the current line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-visual-newline-commands":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the value of `evil-visual-newline-commands'.\nSetting this variable changes the properties of the appropriate\ncommands.","arglist":["var","value"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-define-cmd":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Binds the function FUNCTION to the command CMD.","arglist":["cmd","function"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-completion-table":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-align-center":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Centers lines in the region between WIDTH columns.\nThe default for width is the value of `fill-column'.","arglist":["beg","end","&optional","type","width"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Repeat the last editing command with count replaced by COUNT.\nIf SAVE-POINT is non-nil, do not move point.","arglist":["count","&optional","save-point"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-get-selection":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the value of an X Windows selection.\nThe argument TYPE (default `PRIMARY') says which selection,\nand the argument DATA-TYPE (default `STRING') says\nhow to convert the data.\n\nTYPE may be any symbol (but nil stands for `PRIMARY'). However,\nonly a few symbols are commonly used. They conventionally have\nall upper-case names. The most often used ones, in addition to\n`PRIMARY', are `SECONDARY' and `CLIPBOARD'.\n\nDATA-TYPE is usually `STRING', but can also be one of the symbols\nin `selection-converter-alist', which see. Window systems other\nthan X usually support only a small subset of these symbols, in\naddition to `STRING'; MS-Windows supports `TARGETS', which reports\nthe formats available in the clipboard if TYPE is `CLIPBOARD'.\n\n(fn &optional TYPE DATA-TYPE)","arglist":["&optional","arg1","arg2"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-cjk":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-motion-state-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Motion state is enabled.\nUse the command `evil-motion-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-insert-newline-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Inserts a new line below point and places point in that line\nwith regard to indentation.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-line'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-selection":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"The kind of Visual selection.\nThis is a selection as defined by `evil-define-visual-selection'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-move-end-of-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move to the end of the line as displayed.\nLike `move-end-of-line', but retains the goal column.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-copy":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Copy lines in BEG END below line given by ADDRESS.","arglist":["beg","end","address"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-narrow-to-field":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Narrow to the current field.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-completed-binding":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns the final binding of the completion of COMMAND.","arglist":["command","&optional","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-show-file-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Shows basic file information.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-core":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inclusive-normalize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Perform normalize transformation on inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).","arglist":["beg","end","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-align-left":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Right-align lines in the region at WIDTH columns.\nThe default for width is the value of `fill-column'.","arglist":["beg","end","&optional","type","width"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-update-highlights-resize":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update highlights after resizing a window.","arglist":["frame"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-bounds-of-not-thing-at-point":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns the bounds of a complement of THING at point.\nIf there is a THING at point nil is returned. Otherwise if WHICH\nis nil or 0 a cons cell (BEG . END) is returned. If WHICH is\nnegative the beginning is returned. If WHICH is positive the END\nis returned.","arglist":["thing","&optional","which"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define an Evil state STATE.\nDOC is a general description and shows up in all docstrings;\nthe first line of the string should be the full name of the state.\n\nBODY is executed each time the state is enabled or disabled.\n\nOptional keyword arguments:\n- `:tag' - the mode line indicator, e.g. \"<T>\".\n- `:message' - string shown in the echo area when the state is\n activated.\n- `:cursor' - default cursor specification.\n- `:enable' - list of other state keymaps to enable when in this\n state.\n- `:entry-hook' - list of functions to run when entering this state.\n- `:exit-hook' - list of functions to run when exiting this state.\n- `:suppress-keymap' - if non-nil, effectively disables bindings to\n `self-insert-command' by making `evil-suppress-map' the parent of\n the global state keymap.\n\nThe global keymap of this state will be `evil-test-state-map',\nthe local keymap will be `evil-test-state-local-map', and so on.\n\n(fn STATE DOC [[KEY VAL]...] BODY...)","arglist":["state","doc","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-set-toggle-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set `evil-toggle-key' to KEY.\nKEY must be readable by `read-kbd-macro'.","arglist":["key"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-join-whitespace":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Join the selected lines without changing whitespace.\n\\<evil-normal-state-map>Like \\[evil-join], but doesn't insert or remove any spaces.","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-set-cursor-color":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the cursor color to COLOR.","arglist":["color"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-start-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Start a new search in a certain DIRECTION.","arglist":["direction","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-transform-magic":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Transforms STR with magic characters.\nMAGIC is a regexp that matches all potential magic\ncharacters. Each occurence of CHAR as magic character within str\nis replaced by the result of calling the associated TRANSFORM\nfunction. TRANSFORM is a function taking two arguments, the\ncharacter to be transformed and the rest of string after the\ncharacter. The function should return a triple (REPLACEMENT REST\n. STOP) where REPLACEMENT is the replacement and REST is the rest\nof the string that has not been transformed. If STOP is non-nil\nthen the substitution stops immediately. The replacement starts\nat position START, everything before that position is returned\nliterally. The result is a pair (RESULT . REST). RESULT is a\nlist containing the transformed parts in order. If two\nsubsequents parts are both strings, they are concatenated. REST\nis the untransformed rest string (usually \"\" but may be more if\nTRANSFORM stopped the substitution). Which characters are\nconsidered as magic characters (i.e. the transformation happens\nif the character is NOT preceeded by a backslash) is determined\nby `evil-magic'. The special tokens \\v, \\V, \\m and \\M have\nalways a special meaning (like in Vim) and should not be\ncontained in TRANSFORMS, otherwise their meaning is overwritten.\n\nThe parameter QUOTE is a quoting function applied to literal\ntransformations, usually `regexp-quote' or `replace-quote'.","arglist":["str","magic","quote","transform","&optional","_start"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jumps-debug":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-change-commands":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Commands that wrap or replace `evil-change'.\nThis list exists to apply an inconsistency with vim's change command\nto commands that wrap or redefine it. See emacs-evil/evil#916.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-move-beyond-eol":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether the cursor can move past the end of the line.\nIf non-nil, the cursor is allowed to move one character past the\nend of the line, as in Emacs.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-search-message":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Prefix STRING with the search prompt.","arglist":["string","forward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Normal state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-visual-char-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Type of default ex range in visual char state.\nIf non-nil the default range when starting an ex command from\ncharacter visual state is `<,`> otherwise it is '<,'>. In the\nfirst case the ex command will be passed a region covering only\nthe visual selection. In the second case the passed region will\nbe extended to contain full lines.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-window-rotate-upwards":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Rotates the windows according to the current cyclic ordering.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-text-object-change-visual-type":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Text objects change the current visual state type.\nIf non-nil then a text-object changes the type of the visual state to\nits default selection type (e.g. a word object always changes to\ncharwise visual state). Otherwise the current visual state type is\npreserved.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-in-single-undo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Set to non-nil if the current undo steps are connected.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-custom-initialize-pending-reset":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Add a pending customization with `custom-initialize-reset'.","arglist":["var","value"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-start-track-last-insertion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Start tracking the last insertion.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-close-brace":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to [count] next unmatched '}'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-map":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Keymap for Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":{"evil-exit-emacs-state":"C-z"}},"evil-repeat-stop":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Stop recording a repeat.\nUpdate `evil-repeat-ring' with the accumulated changes\nin `evil-repeat-info' and clear variables.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-intercept-keymap-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the state for the intercept keymap MAP.\nA return value of t means all states.","arglist":["map"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-modes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Modes that should come up in Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-local-mode-set-explicitly":{"default":"nil","local":true,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-change-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change the state to STATE.\nIf STATE is nil, disable all states.","arglist":["state","&optional","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-define-argument-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Defines a new handler for argument-type ARG-TYPE.\nDOC is the documentation string. It is followed by a list of\nkeywords and function:\n\n:collection COLLECTION\n\n A collection for completion as required by `all-completions'.\n\n:completion-at-point FUNC\n\n Function to be called to initialize a potential\n completion. FUNC must match the requirements as described for\n the variable `completion-at-point-functions'. When FUNC is\n called the minibuffer content is narrowed to exactly match the\n argument.\n\n:runner FUNC\n\n Function to be called when the type of the current argument\n changes or when the content of this argument changes. This\n function should take one obligatory argument FLAG followed by\n an optional argument ARG. FLAG is one of three symbol 'start,\n 'stop or 'update. When the argument type is recognized for the\n first time and this handler is started the FLAG is 'start. If\n the argument type changes to something else or ex state\n finished the handler FLAG is 'stop. If the content of the\n argument has changed FLAG is 'update. If FLAG is either 'start\n or 'update then ARG is the current value of this argument. If\n FLAG is 'stop then arg is nil.","arglist":["arg-type","doc","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-ex-update":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Update Ex variables when the minibuffer changes.\nThis function is usually called from `after-change-functions'\nhook. If BEG is non-nil (which is the case when called from\n`after-change-functions'), then an error description is shown\nin case of incomplete or unknown commands.","arglist":["&optional","beg","end","len","string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search-count":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The count if the current search.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--flyspell-overlay-after":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["pos","limit","forwardp"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-deactivate-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Deactivate the region and restore Transient Mark mode.","arglist":["&optional","command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-resize-window":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set the current window's width or height to NEW-SIZE.\nIf HORIZONTAL is non-nil the width of the window is changed,\notherwise its height is changed.","arglist":["new-size","&optional","horizontal"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-replace-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Replace state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ace-jump-active":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-show-paren-range":{"default":0,"local":null,"default-type":"integer","var-docstring":"The minimal distance between point and a parenthesis\nwhich causes the parenthesis to be highlighted.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-previous-open-brace":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to [count] previous unmatched '{'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-up-block":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of text enclosed by BEG and END.\nBEG and END should be regular expressions matching the opening\nand closing delimiters, respectively. If COUNT is greater than\nzero point is moved forward otherwise it is moved\nbackwards. Whenever an opening delimiter is found the COUNT is\nincreased by one, if a closing delimiter is found the COUNT is\ndecreased by one. The motion stops when COUNT reaches zero. The\nmatch-data reflects the last successful match (that caused COUNT\nto reach zero). The behaviour of this functions is similar to\n`up-list'.","arglist":["beg","end","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be a movement function.\nThis ensures that it behaves correctly in visual state.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-declare-ignore-repeat":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Declare COMMAND to be nonrepeatable.","arglist":["command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-esc":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Translate \\e to 'escape if no further event arrives.\nThis function is used to translate a \\e event either to 'escape\nor to the standard ESC prefix translation map. If \\e arrives,\nthis function waits for `evil-esc-delay' seconds for another\nevent. If no other event arrives, the event is translated to\n'escape, otherwise it is translated to the standard ESC prefix\nmap stored in `input-decode-map'. If `evil-inhibit-esc' is\nnon-nil or if evil is in emacs state, the event is always\ntranslated to the ESC prefix.\n\nThe translation to 'escape happens only if the current command\nhas indeed been triggered by \\e. In other words, this will only\nhappen when the keymap is accessed from `read-key-sequence'. In\nparticular, if it is access from `define-key' the returned\nmapping will always be the ESC prefix map.","arglist":["map"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-extract-append":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return an (APPEND . FILENAME) pair based on FILE-OR-APPEND.\nFILE-OR-APPEND should either be a filename or a \">> FILE\"\ndirective. APPEND will be t if FILE-OR-APPEND is an append\ndirective and nil otherwise. FILENAME will be the extracted\nfilename.","arglist":["file-or-append"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-move-mark":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set buffer's mark to POS.\nIf POS is nil, delete the mark.","arglist":["pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-paste-pop":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Replace the just-yanked stretch of killed text with a different stretch.\nThis command is allowed only immediatly after a `yank',\n`evil-paste-before', `evil-paste-after' or `evil-paste-pop'.\nThis command uses the same paste command as before, i.e., when\nused after `evil-paste-after' the new text is also yanked using\n`evil-paste-after', used with the same paste-count argument.\n\nThe COUNT argument inserts the COUNTth previous kill. If COUNT\nis negative this is a more recent kill.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-prev-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Goes to the `count'-th prev buffer in the buffer list.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-execute-change":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Executes as list of changes.\n\nCHANGES is a list of triples (REL-BEG INSERT-TEXT NDEL).\nREL-BEG is the relative position (to point) where the change\ntakes place. INSERT-TEXT is the text to be inserted at that\nposition and NDEL the number of characters to be deleted at that\nposition before insertion.\n\nREL-POINT is the relative position to point before the changed\nwhere point should be placed after all changes.","arglist":["changes","rel-point"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-after-load-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Functions to be run when loading of Evil is finished.\nThis hook can be used the execute some initialization routines\nwhen Evil is completely loaded.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-define-minor-mode-key":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Similar to `evil-define-key' but the bindings are associated\nwith the minor-mode symbol MODE instead of a particular map.\nAssociating bindings with a mode symbol instead of a map allows\nevil to use Emacs' built-in mechanisms to enable the bindings\nautomatically when MODE is active without relying on calling\n`evil-normalize-keymaps'. Another less significant difference is\nthat the bindings can be created immediately, because this\nfunction only uses the symbol MODE and does not rely on its\nvalue.\n\nSee `evil-define-key' for the usage of STATE, KEY, DEF and\nBINDINGS.","arglist":["state","mode","key","def","&rest","bindings"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-find-to-skip-next":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether a repeat of t or T should skip an adjacent character.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-make-argument-handler":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["runner","completer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-downcase":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Convert text to lower case.","arglist":["beg","end","&optional","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-paste-pop-next":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Same as `evil-paste-pop' but with negative argument.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ace-jump-char-to-mode":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Jump visually to the char in front of a char using ace-jump.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-intercept-keymap-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether MAP is an intercept keymap for STATE.\nIf STATE is nil, it means any state.","arglist":["map","&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-paragraph":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-execute-repeat-info":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Executes a repeat-information REPEAT-INFO.","arglist":["repeat-info"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-goto-mark":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Go to the marker specified by CHAR.","arglist":["char","&optional","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-global-keymaps-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of keymap variables.\nEntries have the form (MODE . KEYMAP), where KEYMAP\nis the variable containing the keymap for MODE.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--show-marks-select-action":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["entry"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-put-property":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set PROP to VAL for KEY in ALIST-VAR.\nALIST-VAR points to an association list with entries of the form\n(KEY . PLIST), where PLIST is a property list storing PROP and VAL.","arglist":["alist-var","key","prop","val","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-motion-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Motion state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-file-arg":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Returns the current Ex argument as a file name.\nThis function interprets special file names like # and %.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-force-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Overwrite the current states default cursor.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-last-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the line number of the last line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-narrow":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Restrict the buffer to BEG and END.\nBEG or END may be nil, specifying a one-sided restriction including\n`point-min' or `point-max'. See also `evil-with-restriction.'","arglist":["beg","end"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-call-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute the given command COMMAND.","arglist":["range","command","argument"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define type TYPE.\nDOC is a general description and shows up in all docstrings.\n\nOptional keyword arguments:\n- `:expand' - expansion function. This function should accept two\n positions in the current buffer, BEG and END,and return a pair of\n expanded buffer positions.\n- `:contract' - the opposite of `:expand'. Optional.\n- `:one-to-one' - non-nil if expansion is one-to-one. This means that\n `:expand' followed by `:contract' always return the original range.\n- `:normalize' - normalization function. This function should accept\n two unexpanded positions and adjust them before expansion. May be\n used to deal with buffer boundaries.\n- `:string' - description function. Takes two buffer positions and\n returns a human-readable string. For example \"2 lines\"\n\nIf further keywords and functions are specified, they are assumed to\nbe transformations on buffer positions, like `:expand' and `:contract'.\n\n(fn TYPE DOC [[KEY FUNC]...])","arglist":["type","doc","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-window-decrease-height":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Decrease current window height by COUNT.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-get-optional-register-and-count":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Parse STRING as an ex arg with both optional REGISTER and COUNT.\nReturns a list (REGISTER COUNT).","arglist":["string"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--jump-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set jump point if COMMAND has a non-nil :jump property.","arglist":["&optional","command"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-this-type-modified":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil iff current motion type has been modified by the user.\nIf the type has been modified, this variable contains the new\ntype.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-beginning-of-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the first character of the current screen line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-last-find":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"A pair (FUNCTION . CHAR) describing the lastest character\n search command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-previous-line-first-non-blank":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT lines up on the first non-blank character.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-normal-state-local-minor-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Non-nil if Normal state is enabled.\nUse the command `evil-normal-state' to change this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-visual-selection-function":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a selection function for TYPE.\nDefault to `evil-visual-make-region'.","arglist":["selection"],"functionp":true,"macrop":null,"keymap-inv":null},"evil--add-to-alist":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Add the assocation of KEY and VAL to the value of LIST-VAR.\nIf the list already contains an entry for KEY, update that entry;\notherwise add at the end of the list.\n\n(fn LIST-VAR KEY VAL &rest ELEMENTS)","arglist":["list-var","&rest","elements"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-was-yanked-without-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether text being saved to the numbered-register ring was\nnot deleted and not yanked to a specific register.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-inner-angle":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Select inner angle bracket.","arglist":["&optional","count","beg","end","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-split-window-below":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"If non-nil split windows are created below.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-commands":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of command bindings and functions.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-adjust-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point one character back if at the end of a non-empty line.\nThis behavior is controled by `evil-move-beyond-eol'.","arglist":["&optional","_"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-avy-goto-line-above":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Evil motion for `avy-goto-line-above'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-hl-update-delay":{"default":0.02,"local":null,"default-type":"float","var-docstring":"Time in seconds of idle before updating search highlighting.\nSetting this to a period shorter than that of keyboard's repeat\nrate allows highlights to update while scrolling.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-previous-shell-command":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The last shell command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-cjk-word-separating-categories":{"default":"((67 . 72) (67 . 75) (67 . 107) (67 . 65) (67 . 71) (72 . 67) (72 . 75) (72 . 107) (72 . 65) (72 . 71) (75 . 67) (75 . 72) (75 . 107) (75 . 65) (75 . 71) (107 . 67) (107 . 72) (107 . 75) (65 . 67) (65 . 72) (65 . 75) (71 . 67) (71 . 72) (71 . 75))","local":null,"default-type":"cons","var-docstring":"List of pair (cons) of categories to determine word boundary\nused in `evil-cjk-word-boundary-p'. See the documentation of\n`word-separating-categories'. Use `describe-categories' to see\nthe list of categories.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-kill-on-visual-paste":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether pasting in visual state adds the replaced text to the\nkill ring, making it the default for the next paste. The default,\nreplicates the default Vim behavior.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-want-fine-undo":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether actions are undone in several steps.\nThere are two possible choices: nil (\"no\") means that all\nchanges made during insert state, including a possible delete\nafter a change operation, are collected in a single undo step.\nNon-nil (\"yes\") means that undo steps are determined according\nto Emacs heuristics, and no attempt is made to aggregate changes.\n\nFor backward compatibility purposes, the value `fine' is\ninterpreted as `nil'. This option was removed because it did not\nwork consistently.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-want-keybinding":{"default":"t","local":null,"default-type":"symbol","var-docstring":"Whether to load evil-keybindings.el.\n\nThis loads a set of keybindings for evil in other modes as well as\nsetting the initial evil state in those modes.\n\nThis variable must be set before evil is loaded.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-alternate-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the last buffer WINDOW has displayed other than the\ncurrent one (equivalent to Vim's alternate buffer).\n\nReturns the first item in `window-prev-buffers' that isn't\n`window-buffer' of WINDOW.","arglist":["&optional","window"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-set-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change the cursor's apperance according to SPECS.\nSPECS may be a cursor type as per `cursor-type', a color\nstring as passed to `set-cursor-color', a zero-argument\nfunction for changing the cursor, or a list of the above.","arglist":["specs"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-middle-of-visual-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the middle of the current visual line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-initialize-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set up the initial state for BUFFER.\nBUFFER defaults to the current buffer.\nUses STATE if specified, or calls `evil-initial-state-for-buffer'.\nSee also `evil-set-initial-state'.","arglist":["&optional","state","buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-argument-handler":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"The argument handler for the current Ex command.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-read-quoted-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Command that calls `read-quoted-char'.\nThis command can be used wherever `read-quoted-char' is required\nas a command. Its main use is in the `evil-read-key-map'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-first-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the line number of the first line.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-set-height":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Sets the height of the current window to COUNT.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-previous-state-alist":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"For Each evil state the Evil state being switched from.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-without-restriction":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Execute BODY with the top-most narrowing removed.\nThis works only if the previous narrowing has been generated by\n`evil-with-restriction'.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-search-word-forward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search forward for symbol under point.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-substitute-regex":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-vim-regexp-replacements":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-in-comment-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Checks if POS is within a comment according to current syntax.\nIf POS is nil, (point) is used. The return value is the beginning\nposition of the comment.","arglist":["&optional","pos"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-active-highlights-alist":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"An alist of currently active highlights.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-append-register":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Append TEXT to the contents of register REGISTER.","arglist":["register","text"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-search-word-backward":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search backward for symbol under point.","arglist":["&optional","count","symbol"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-want-minibuffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Whether to enable Evil in minibuffer(s).","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-set-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Set RANGE to have beginning BEG and end END.\nThe TYPE and additional PROPERTIES may also be specified.\nIf an argument is nil, it's not used; the previous value is retained.\nSee also `evil-set-range-beginning', `evil-set-range-end',\n`evil-set-range-type' and `evil-set-range-properties'.","arglist":["range","&optional","beg","end","type","&rest","properties"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-regex-without-case":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the regular expression without all occurrences of \\c and \\C.","arglist":["re"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-clear-command-keys":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Clear `this-command-keys' and all information about the current command keys.\nCalling this function prevents further recording of the keys that\ninvoked the current command","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-define-text-object":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Define a text object command OBJECT.\nBODY should return a range (BEG END) to the right of point\nif COUNT is positive, and to the left of it if negative.\n\nOptional keyword arguments:\n- `:type' - determines how the range applies after an operator\n (`inclusive', `line', `block', and `exclusive', or a self-defined\n motion type).\n- `:extend-selection' - if non-nil (default), the text object always\n enlarges the current selection. Otherwise, it replaces the current\n selection.\n\n(fn OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)","arglist":["object","args","&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-repeat-record":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Add INFO to the end of `evil-repeat-info'.","arglist":["info"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-buffer-regexps":{"default":"((\"^ \\\\*load\\\\*\"))","local":null,"default-type":"cons","var-docstring":"Regular expressions determining the initial state for a buffer.\nEntries have the form (REGEXP . STATE), where REGEXP is a regular\nexpression matching the buffer's name and STATE is one of `normal',\n`insert', `visual', `replace', `operator', `motion', `emacs' and\n`nil'. If STATE is `nil', Evil is disabled in the buffer.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-repeat-start-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Record a new repeat when exiting Normal state.\nDoes not record in Emacs state or if the current command\nhas :repeat nil.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-cleanup-insert-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Called when Insert state is about to be exited.\nHandles the repeat-count of the insertion command.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete text from BEG to END with TYPE.\nSave in REGISTER or in the kill-ring with YANK-HANDLER.","arglist":["beg","end","&optional","type","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-chars":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move point to the end or beginning of a sequence of CHARS.\nCHARS is a character set as inside [...] in a regular expression.","arglist":["chars","&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-paste":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Paste over Visual selection.","arglist":["count","&optional","register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-end-undo-step":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"End a undo step started with `evil-start-undo-step'.\nAdds an undo boundary unless CONTINUE is specified.","arglist":["&optional","continue"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-save-cursor":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the current cursor; execute BODY; restore the cursor.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-refresh-undo-step":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Refresh `buffer-undo-list' entries for current undo step.\nUndo boundaries until `evil-undo-list-pointer' are removed to\nmake the entries undoable as a single action. See\n`evil-start-undo-step'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-close-folds":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Close all folds.\nSee also `evil-open-folds'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-emacs-state-exit-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Hooks to run when exiting Emacs state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-save-and-close":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Saves the current buffer and closes the window.","arglist":["file","&optional","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-compile-replacement":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Maybe convert a regexp replacement TO to Lisp.\nReturns a list suitable for `perform-replace' if necessary, the\noriginal string if not. Currently the following magic characters\nin replacements are supported: 0-9&#lLuUrnbt,\nThe magic character , (comma) start an Emacs-lisp expression.","arglist":["to"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-push-search-history":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Push STRING into the appropriate search history (determined by FORWARD).","arglist":["string","forward"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-pre-hook":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Prepare the current command for recording the repeation.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-redirect-digit-argument":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Bind a wrapper function calling TARGET or `digit-argument'.\nMAP is a keymap for binding KEYS to the wrapper for TARGET.\nThe wrapper only calls `digit-argument' if a prefix-argument\nhas already been started; otherwise TARGET is called.","arglist":["map","keys","target"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-save":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the current buffer to FILENAME.\nChanges the file name of the current buffer to FILENAME. If no\nFILENAME is given, the current file name is used.","arglist":["filename","&optional","bang"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-no-display":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"If non-nil, various Evil displays are inhibited.\nUse the macro `evil-without-display' to set this variable.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-save-state":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save the current state; execute BODY; restore the state.","arglist":["&rest","body"],"functionp":null,"macrop":true,"keymap-inv":null},"evil-line-position":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the position of LINE.\nIf COLUMN is specified, return its position on the line.\nA negative number means the end of the line.","arglist":["line","&optional","column"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-tag":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return a mode-line tag for SELECTION.\nSELECTION is a kind of selection as defined by\n`evil-define-visual-selection', such as `char', `line'\nor `block'.","arglist":["&optional","selection"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-insert-state-local-map":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Buffer-local keymap for Insert state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-operator-range-motion":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Motion of `evil-operator-range'.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-this-type":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Current motion type.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil--get-block-range":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the exclusive range of a visual selection.\nOP and CL are pairs of buffer positions for the opening and\nclosing delimiter of a range. SELECTION-TYPE is the desired type\nof selection. It is a symbol that determines which parts of the\nblock are selected. If it is 'inclusive or t the returned range\nis (cons (car OP) (cdr CL)). If it is 'exclusive or nil the\nreturned range is (cons (cdr OP) (car CL)). If it is\n'exclusive-line the returned range will skip whitespace at the\nend of the line of OP and at the beginning of the line of CL.","arglist":["op","cl","selection-type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-next-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor COUNT lines down.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-x-select-timer":{"default":"nil","local":true,"default-type":"symbol","var-docstring":"Timer for updating the X selection in visual state.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-jumps-cross-buffers":{"default":"t","local":null,"default-type":"symbol","var-docstring":"When non-nil, the jump commands can cross borders between buffers, otherwise the jump commands act only within the current buffer.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-local-mode-major-mode":{"default":"nil","local":true,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-ex-hl-pattern":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the pattern of the highlight HL.","arglist":["hl"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-back-to-indentation":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete back to the first non-whitespace character.\nIf point is before the first non-whitespace character of a\ncurrent line then delete from the point to the beginning of the\ncurrent line. If point is on the beginning of the line, behave\naccording to `evil-backspace-join-lines'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-type":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Return the type of the Visual selection.\nIf SELECTION is specified, return the type of that instead.","arglist":["&optional","selection"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-prev":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the previous window in the cyclic order.\nWith COUNT go to the count-th window in the order starting from\ntop-left.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-lookup":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Look up the keyword at point.\nCalls `evil-lookup-func'.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-argument-types":{"default":"nil","local":null,"default-type":"symbol","var-docstring":"Association list of argument handlers.","fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-complete-previous":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Complete to the nearest preceding word.\nSearch forward if a match isn't found.\nCalls `evil-complete-previous-func'.","arglist":["&optional","arg"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-change-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Change to end of line.","arglist":["beg","end","&optional","type","register","yank-handler"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-scroll-column-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Scrolls the window COUNT columns to the right.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-regexp-magic":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-backward-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move cursor to the left by COUNT characters.\nMovement is restricted to the current line unless CROSSLINES is non-nil.\nIf NOERROR is non-nil, don't signal an error upon reaching the beginning\nof the line or the buffer; just return nil.","arglist":["&optional","count","crosslines","noerror"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-parser--dval":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Substitute all dollar-sign symbols in OBJ.\nEach dollar-sign symbol is replaced with the corresponding\nelement in RESULT, so that $1 becomes the first element, etc.\nThe special value $0 is substituted with the whole list RESULT.\nIf RESULT is not a list, all dollar-sign symbols are substituted with\nRESULT.","arglist":["obj","result"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ex-search":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Search forward or backward COUNT times for the current ex search pattern.\nThe search pattern is determined by `evil-ex-search-pattern' and\nthe direcion is determined by `evil-ex-search-direction'.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-buffer":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Switches to another buffer.","arglist":["buffer"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-finish-record-changes":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Finishes the recording of buffer changes and records them as repeat.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-forward-WORD-end":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to the end of the COUNT-th next WORD.","arglist":["&optional","count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-integration":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":true,"functionp":null,"macrop":null,"keymap-inv":null},"evil-save-and-quit":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Save all buffers and exit Emacs.","arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-window-right":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Move the cursor to new COUNT-th window right of the current one.","arglist":["count"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-make-region":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Create an active region from MARK to POINT.\nIf TYPE is given, also set the Visual type.\nIf MESSAGE is given, display it in the echo area.","arglist":["mark","point","&optional","type","message"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-ret-gen":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":["count","indent?"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-digit-argument-or-evil-beginning-of-line":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":null,"arglist":null,"functionp":true,"macrop":null,"keymap-inv":null},"evil-delete-backward-char":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Delete previous character.","arglist":["beg","end","&optional","type","register"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-command-window-ex":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Open a command line window for editing and executing ex commands.\nIf CURRENT-COMMAND is present, it will be inserted under the\ncursor as the current command to be edited. If EXECUTE-FN is given,\nit will be used as the function to execute instead of\n`evil-command-window-ex-execute', the default.","arglist":["&optional","current-command","execute-fn"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-visual-state-p":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Whether the current state is Visual state.\n(That is, whether `evil-state' is `visual'.)","arglist":["&optional","state"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-upcase":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Convert text to upper case.","arglist":["beg","end","&optional","type"],"functionp":true,"macrop":null,"keymap-inv":null},"evil-repeat-reset":{"default":"nil","local":null,"default-type":"symbol","var-docstring":null,"fn-docstring":"Clear all repeat recording variables.\nSet `evil-recording-repeat' to FLAG.","arglist":["flag"],"functionp":true,"macrop":null,"keymap-inv":null}} \ No newline at end of file
diff --git a/doc/evil.pdf b/doc/evil.pdf
deleted file mode 100644
index db9296e..0000000
--- a/doc/evil.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/evil.texi b/doc/evil.texi
deleted file mode 100644
index 9722f32..0000000
--- a/doc/evil.texi
+++ /dev/null
@@ -1,769 +0,0 @@
-\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{<N>} 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{<E>}) 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{<N>}), Insert state
-(@code{<I>}), Visual state (@code{<V>}), Replace state (@code{<R>}),
-Operator-Pending state (@code{<O>}), Motion state (@code{<M>}) and Emacs
-state (@code{<E>}). 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{"<T>"}.
-@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:
diff --git a/doc/fdl-1.3.texi b/doc/fdl-1.3.texi
deleted file mode 100644
index fc19ddd..0000000
--- a/doc/fdl-1.3.texi
+++ /dev/null
@@ -1,506 +0,0 @@
-@c The GNU Free Documentation License.
-@center Version 1.3, 3 November 2008
-
-@c This file is intended to be included within another document,
-@c hence no sectioning command or @node.
-
-@display
-Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-@uref{http://fsf.org/}
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@enumerate 0
-@item
-PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document @dfn{free} in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of ``copyleft'', which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-@item
-APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein. The ``Document'', below,
-refers to any such manual or work. Any member of the public is a
-licensee, and is addressed as ``you''. You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A ``Modified Version'' of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A ``Secondary Section'' is a named appendix or a front-matter section
-of the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall
-subject (or to related matters) and contains nothing that could fall
-directly within that overall subject. (Thus, if the Document is in
-part a textbook of mathematics, a Secondary Section may not explain
-any mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The ``Invariant Sections'' are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License. If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant. The Document may contain zero
-Invariant Sections. If the Document does not identify any Invariant
-Sections then there are none.
-
-The ``Cover Texts'' are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License. A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A ``Transparent'' copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text. A copy that is not ``Transparent'' is called ``Opaque''.
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, La@TeX{} input
-format, SGML or XML using a publicly available
-DTD, and standard-conforming simple HTML,
-PostScript or PDF designed for human modification. Examples
-of transparent image formats include PNG, XCF and
-JPG. Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, SGML or
-XML for which the DTD and/or processing tools are
-not generally available, and the machine-generated HTML,
-PostScript or PDF produced by some word processors for
-output purposes only.
-
-The ``Title Page'' means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, ``Title Page'' means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-The ``publisher'' means any person or entity that distributes copies
-of the Document to the public.
-
-A section ``Entitled XYZ'' means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language. (Here XYZ stands for a
-specific section name mentioned below, such as ``Acknowledgements'',
-``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
-of such a section when you modify the Document means that it remains a
-section ``Entitled XYZ'' according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document. These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-@item
-VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-@item
-COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-@item
-MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-@enumerate A
-@item
-Use in the Title Page (and on the covers, if any) a title distinct
-from that of the Document, and from those of previous versions
-(which should, if there were any, be listed in the History section
-of the Document). You may use the same title as a previous version
-if the original publisher of that version gives permission.
-
-@item
-List on the Title Page, as authors, one or more persons or entities
-responsible for authorship of the modifications in the Modified
-Version, together with at least five of the principal authors of the
-Document (all of its principal authors, if it has fewer than five),
-unless they release you from this requirement.
-
-@item
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-@item
-Preserve all the copyright notices of the Document.
-
-@item
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-@item
-Include, immediately after the copyright notices, a license notice
-giving the public permission to use the Modified Version under the
-terms of this License, in the form shown in the Addendum below.
-
-@item
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document's license notice.
-
-@item
-Include an unaltered copy of this License.
-
-@item
-Preserve the section Entitled ``History'', Preserve its Title, and add
-to it an item stating at least the title, year, new authors, and
-publisher of the Modified Version as given on the Title Page. If
-there is no section Entitled ``History'' in the Document, create one
-stating the title, year, authors, and publisher of the Document as
-given on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-@item
-Preserve the network location, if any, given in the Document for
-public access to a Transparent copy of the Document, and likewise
-the network locations given in the Document for previous versions
-it was based on. These may be placed in the ``History'' section.
-You may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-@item
-For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
-the Title of the section, and preserve in the section all the
-substance and tone of each of the contributor acknowledgements and/or
-dedications given therein.
-
-@item
-Preserve all the Invariant Sections of the Document,
-unaltered in their text and in their titles. Section numbers
-or the equivalent are not considered part of the section titles.
-
-@item
-Delete any section Entitled ``Endorsements''. Such a section
-may not be included in the Modified Version.
-
-@item
-Do not retitle any existing section to be Entitled ``Endorsements'' or
-to conflict in title with any Invariant Section.
-
-@item
-Preserve any Warranty Disclaimers.
-@end enumerate
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled ``Endorsements'', provided it contains
-nothing but endorsements of your Modified Version by various
-parties---for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-@item
-COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled ``History''
-in the various original documents, forming one section Entitled
-``History''; likewise combine any sections Entitled ``Acknowledgements'',
-and any sections Entitled ``Dedications''. You must delete all
-sections Entitled ``Endorsements.''
-
-@item
-COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-@item
-AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an ``aggregate'' if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-@item
-TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers. In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled ``Acknowledgements'',
-``Dedications'', or ``History'', the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-@item
-TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense, or distribute it is void, and
-will automatically terminate your rights under this License.
-
-However, if you cease all violation of this License, then your license
-from a particular copyright holder is reinstated (a) provisionally,
-unless and until the copyright holder explicitly and finally
-terminates your license, and (b) permanently, if the copyright holder
-fails to notify you of the violation by some reasonable means prior to
-60 days after the cessation.
-
-Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, receipt of a copy of some or all of the same material does
-not give you any rights to use it.
-
-@item
-FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns. See
-@uref{http://www.gnu.org/copyleft/}.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License ``or any later version'' applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation. If the Document
-specifies that a proxy can decide which future versions of this
-License can be used, that proxy's public statement of acceptance of a
-version permanently authorizes you to choose that version for the
-Document.
-
-@item
-RELICENSING
-
-``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
-World Wide Web server that publishes copyrightable works and also
-provides prominent facilities for anybody to edit those works. A
-public wiki that anybody can edit is an example of such a server. A
-``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
-site means any set of copyrightable works thus published on the MMC
-site.
-
-``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
-license published by Creative Commons Corporation, a not-for-profit
-corporation with a principal place of business in San Francisco,
-California, as well as future copyleft versions of that license
-published by that same organization.
-
-``Incorporate'' means to publish or republish a Document, in whole or
-in part, as part of another Document.
-
-An MMC is ``eligible for relicensing'' if it is licensed under this
-License, and if all works that were first published under this License
-somewhere other than this MMC, and subsequently incorporated in whole
-or in part into the MMC, (1) had no cover texts or invariant sections,
-and (2) were thus incorporated prior to November 1, 2008.
-
-The operator of an MMC Site may republish an MMC contained in the site
-under CC-BY-SA on the same site at any time before August 1, 2009,
-provided the MMC is eligible for relicensing.
-
-@end enumerate
-
-@page
-@heading ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-@smallexample
-@group
- Copyright (C) @var{year} @var{your name}.
- 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 group
-@end smallexample
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with@dots{}Texts.'' line with this:
-
-@smallexample
-@group
- with the Invariant Sections being @var{list their titles}, with
- the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
- being @var{list}.
-@end group
-@end smallexample
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
-
-@c Local Variables:
-@c ispell-local-pdict: "ispell-dict"
-@c End:
-
diff --git a/doc/macros.texi b/doc/macros.texi
deleted file mode 100644
index 90eb1b3..0000000
--- a/doc/macros.texi
+++ /dev/null
@@ -1,13 +0,0 @@
-@c -*-texinfo-*-
-@c This is part of the Evil manual.
-@c Copyright (C) 2011 Frank Fischer and Vegard Øye.
-@c See the file evil.texi for copying conditions.
-
-@ifclear macros
-@set macros
-
-@macro authors {}
-Frank Fischer and Vegard Øye
-@end macro
-
-@end ifclear
diff --git a/doc/make.bat b/doc/make.bat
new file mode 100644
index 0000000..6247f7e
--- /dev/null
+++ b/doc/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/doc/source/_ext/elisp.py b/doc/source/_ext/elisp.py
new file mode 100644
index 0000000..924d026
--- /dev/null
+++ b/doc/source/_ext/elisp.py
@@ -0,0 +1,309 @@
+import re
+from os import path
+import json
+
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+from sphinx import addnodes
+from sphinx.domains import Domain, ObjType, Index
+from sphinx.domains.std import StandardDomain
+from sphinx.directives import ObjectDescription
+from sphinx.roles import XRefRole
+from sphinx.util.docfields import Field
+from sphinx.util.nodes import make_refnode
+
+
+with open(path.join(path.dirname(__file__), '..', '..', 'docstringdb.json')) as f:
+ DATA = json.load(f)
+
+
+re_evilcode = re.compile(r"`(evil-[^']*)'")
+re_code = re.compile(r"`([^:][^ ']*)'")
+re_kwd = re.compile(r"`(:[^']*)'")
+re_item = re.compile(r"([^\n])\n- ")
+re_sexp = re.compile(r"\([A-Z \-\.'`\[\]]+\)|[A-Z\-]+")
+re_capitals = re.compile(r"[A-Z\-]+")
+re_nonspace = re.compile(r"[^ ]")
+re_signature = re.compile(r'\(fn (.*)\)')
+re_keymap_or_kbd = re.compile(r"\\[\[<]([^\]>]*)[\]>]")
+
+emphasis = [
+ 'thing-at-point',
+]
+
+def emacs_is_local(var):
+ return DATA[var]['local']
+
+def emacs_default_value(var):
+ default = DATA[var]['default']
+ tp = DATA[var]['default-type']
+ if tp == 'string':
+ rep = repr(default)[1:-1]
+ return f'"{rep}"'
+ return str(default)
+
+def process_docstring(docstring, capitals=None):
+ # Remove explicit signature
+ docstring = re_signature.sub('', docstring)
+
+ # Add code blocks to indented sections
+ def blockified_lines(lines):
+ in_block = False
+ for line in lines:
+ try:
+ indented = next(re_nonspace.finditer(line)).start(0) > 3
+ except StopIteration:
+ indented = None
+ if indented is True and not in_block:
+ yield '.. code-block:: elisp'
+ yield ''
+ in_block = True
+ elif indented is False:
+ in_block = False
+ yield line
+ docstring = '\n'.join(blockified_lines(docstring.split('\n')))
+
+ # Substitute `evil-alpha' with :elisp:ref:`evil-alpha`
+ docstring = re_evilcode.sub(r':elisp:ref:`\1`', docstring)
+
+ # Substitute `alpha' with ``alpha``
+ docstring = re_code.sub(r'``\1``', docstring)
+
+ # Substitute `:alpha' with ``alpha``
+ docstring = re_kwd.sub(r'``\1``', docstring)
+
+ # Translate key bindings
+ keymap = None
+ def substitute_binding(match):
+ nonlocal keymap
+ if match.group(0)[1] == '<':
+ keymap = match.group(1)
+ return ''
+ if keymap is None:
+ print(docstring)
+ assert False
+ return '???'
+ key = DATA[keymap]['keymap-inv'][match.group(1)]
+ return f':kbd:`{key}`'
+ docstring = re_keymap_or_kbd.sub(substitute_binding, docstring)
+
+ # Add empty line between list items
+ docstring = re_item.sub(r'\1\n\n- ', docstring)
+
+ if capitals is None:
+ capitals = []
+ else:
+ capitals = list(capitals)
+
+ # Find things that look like sexps
+ def substitute_sexp(match):
+ s = match.group(0)
+ if re_capitals.match(s):
+ if s in capitals:
+ return f'*{s}*'
+ return s
+ else:
+ capitals.extend(re_capitals.findall(s))
+ return f'``{s}``'
+ docstring = re_sexp.sub(substitute_sexp, docstring)
+
+ # Italicize some words
+ for s in emphasis:
+ docstring = docstring.replace(s, f'*{s}*')
+
+ return docstring
+
+def emacs_variable_docstring(var):
+ docstring = DATA[var]['var-docstring']
+ return process_docstring(docstring)
+
+def emacs_function_docstring(var):
+ docstring = DATA[var]['fn-docstring']
+ return process_docstring(docstring, capitals=emacs_argnames(var))
+
+def emacs_argnames(var):
+ arglist = emacs_arglist(var)
+ return re_capitals.findall(arglist)
+
+def emacs_arglist(var):
+ docstring = DATA[var]['fn-docstring']
+ match = re_signature.search(docstring)
+ if match:
+ return match.group(1)
+
+ arglist = [arg.upper() for arg in DATA[var]['arglist']]
+ state = None
+ ret = ''
+ for arg in arglist:
+ if arg in ('&REST', '&OPTIONAL'):
+ if state == '&OPTIONAL':
+ ret += ']'
+ state = arg
+ ret += ' ['
+ continue
+ ret += ('' if state in ('&REST', '&OPTIONAL') else ' ') + arg
+ if state == '&OPTIONAL':
+ state += '-CONT'
+ if state is not None and state.startswith('&OPTIONAL'):
+ ret += ']'
+ if state == '&REST':
+ ret += '...]'
+ return ret
+
+
+class AbstractElisp(ObjectDescription):
+
+ def add_target_and_index(self, name, sig, signode):
+ anchor = f'elispobj-{sig}'
+ signode['ids'].append(anchor)
+
+ objs = self.env.domaindata['elisp']['objects']
+ objs[sig] = {
+ 'docname': self.env.docname,
+ 'anchor': f'elispobj-{sig}',
+ 'type': self.object_type,
+ }
+
+
+class AbstractVariable(AbstractElisp):
+ object_type = 'variable'
+
+ def handle_signature(self, sig, signode):
+ signode += addnodes.desc_annotation(sig, sig)
+ return sig
+
+ def run(self):
+ extra = []
+
+ default = self.default_value()
+ if default:
+ extra.append(f'Default: ``{default}``')
+ if self.is_buffer_local():
+ extra.append('buffer-local')
+
+ self.content.data.extend(['', ', '.join(extra)])
+ retval = super().run()
+ return retval
+
+
+class Variable(AbstractVariable):
+ required_arguments = 1
+ optional_arguments = 2
+
+ def default_value(self):
+ try:
+ return self.arguments[1]
+ except IndexError:
+ return None
+
+ def is_buffer_local(self):
+ return 'bufloc' in self.arguments[1:]
+
+
+class AutoVariable(AbstractVariable):
+ required_arguments = 1
+
+ def is_buffer_local(self):
+ return emacs_is_local(self.arguments[0])
+
+ def default_value(self):
+ return emacs_default_value(self.arguments[0])
+
+ def run(self):
+ docstring = emacs_variable_docstring(self.arguments[0])
+ self.content.data.extend(docstring.split('\n'))
+ return super().run()
+
+
+class AutoFunction(AbstractElisp):
+ required_arguments = 1
+
+ @property
+ def object_type(self):
+ return 'macro' if DATA[self.arguments[0]]['macrop'] else 'function'
+
+ def handle_signature(self, sig, signode):
+ args = emacs_arglist(sig)
+ signode += addnodes.desc_annotation(sig, f'({sig} {args})')
+ return sig
+
+ def run(self):
+ docstring = emacs_function_docstring(self.arguments[0])
+ self.content.data.extend(docstring.split('\n'))
+ return super().run()
+
+
+class ElispIndex(Index):
+ name = 'index'
+ localname = 'Emacs lisp functions and variables'
+ shortname = 'Elisp'
+
+ def generate(self, docnames=None):
+ index = {}
+ for name, item in self.domain.data['objects'].items():
+ if name.startswith('evil-'):
+ letter = name[5].upper()
+ else:
+ letter = name[0].upper()
+ index.setdefault(letter, []).append((
+ name,
+ 0,
+ item['docname'],
+ item['anchor'],
+ item['type'],
+ '',
+ '',
+ ))
+
+ index = {k: sorted(v, key=lambda k: k[0].lower()) for k, v in index.items()}
+ index = list(index.items())
+ index = sorted(index, key=lambda k: k[0])
+ return index, True
+
+
+class Elisp(Domain):
+ name = 'elisp'
+ label = 'Emacs lisp'
+
+ object_types = {
+ 'variable': ObjType('variable', 'variable', 'obj'),
+ 'autovariable': ObjType('autovariable', 'autovariable', 'obj'),
+ 'autofunction': ObjType('autofunction', 'autofunction', 'obj'),
+ }
+
+ directives = {
+ 'variable': Variable,
+ 'autovariable': AutoVariable,
+ 'autofunction': AutoFunction,
+ }
+
+ roles = {
+ 'ref': XRefRole(),
+ }
+
+ initial_data = {
+ 'objects': {},
+ }
+
+ indices = {
+ ElispIndex,
+ }
+
+ def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
+ obj = self.data['objects'].get(target, None)
+ if obj is None:
+ return None
+ return make_refnode(builder, fromdocname, obj['docname'], obj['anchor'], contnode, obj['anchor'])
+
+
+def setup(app):
+ app.add_domain(Elisp)
+ StandardDomain.initial_data['labels']['elispindex'] = ('elisp-index', '', 'Emacs lisp functions and variables')
+ StandardDomain.initial_data['anonlabels']['elispindex'] = ('elisp-index', '')
+
+ return {
+ 'version': '0.1',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100644
index 0000000..3898194
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,90 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+#
+
+import os, sys
+sys.path.append(os.path.abspath("./_ext"))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'Evil'
+copyright = '2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye'
+author = 'Eivind Fonn, Frank Fischer, Vegard Øye'
+
+# The full version, including alpha/beta/rc tags
+release = '1.14.0'
+
+master_doc = 'index'
+
+
+latex_elements = {
+ 'fontpkg': r'\usepackage{palatino} \usepackage{inconsolata}',
+ 'maketitle': r"""
+ \newcommand\sphinxbackoftitlepage{{
+ Copyright {copyright}.
+
+ \begin{{quote}}
+ 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{{quote}}
+
+ The Evil team thanks everyone at gmane.emacs.vim-emulation for
+ their feedback and contributions.
+ }}
+ \sphinxmaketitle
+ """.format(copyright=copyright),
+}
+
+
+texinfo_documents = [
+ (master_doc, 'evil', 'Evil documentation', author, 'evil',
+ 'Extensible vi layer for Emacs', 'Emacs'),
+]
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'elisp',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'sphinx_rtd_theme'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
diff --git a/doc/source/extension.rst b/doc/source/extension.rst
new file mode 100644
index 0000000..9cae483
--- /dev/null
+++ b/doc/source/extension.rst
@@ -0,0 +1,146 @@
+Extension
+=========
+
+The main functionality of Evil is implemented in terms of reusable
+macros. Package writers can use these to define new commands.
+
+
+Motions
+-------
+
+A *motion* is a command which moves the cursor, such as :kbd:`w` or
+:kbd:`e`. Motions are defined with the macro
+:elisp:ref:`evil-define-motion`. Motions not defined in this way
+should be declared with :elisp:ref:`evil-declare-motion`.
+
+.. elisp:autofunction:: evil-declare-motion
+
+.. elisp:autofunction:: evil-define-motion
+
+For example, this is a motion that moves the cursor forward by a
+number of characters:
+
+.. code-block:: elisp
+
+ (evil-define-motion foo-forward (count)
+ "Move to the right by COUNT characters."
+ :type inclusive
+ (forward-char (or count 1)))
+
+The *type* of a motion determines how it works when used together with
+an operator. Inclusive motions include the endpoint in the range
+being operated on, while exclusive motions do not. Line motions
+extend the whole range to linewise positions, effectively behaving as
+if the endpoint were really at the end of the line. Blockwise ranges
+behave as a "rectangle" on screen rather than a contiguous range of
+characters.
+
+
+Operators
+---------
+
+An operator is a command that acts on the text moved over by a motion,
+such as :kbd:`c` (change), :kbd:`d` (delete) or :kbd:`y` (yank or
+copy, not to be confused with "yank" in Emacs terminology which means
+*paste*).
+
+.. elisp:autofunction:: evil-define-operator
+
+For example, this is an operator that performs ROT13 encryption on the
+text under consideration:
+
+.. code-block:: elisp
+
+ (evil-define-operator evil-rot13 (beg end)
+ "ROT13 encrypt text."
+ (rot13-region beg end))
+
+Binding this to :kbd:`g?` (where it is by default) will cause a key
+sequence such as :kbd:`g?w` to encrypt from the current cursor to the
+end of the word.
+
+
+Text objects
+------------
+
+Text objects are like motions in that they define a range over which
+an operator may act. Unlike motions, text objects can set both a
+beginning and an endpoint. In visual state, text objects alter both
+ends of the selection.
+
+Text objects are not directly usable in normal state. Instead, they
+are bound in the two keymaps ``evil-inner-text-ojects-map`` and
+``evil-outer-text-objects-map``, which are available in visual and
+operator-pending state under the keys :kbd:`i` and :kbd:`a`
+respectively.
+
+.. elisp:autofunction:: evil-define-text-object
+
+For eample, this is a text object which selects the next three
+characters after the current location:
+
+.. code-block:: elisp
+
+ (evil-define-text-object foo (count)
+ "Select three characters."
+ (list (point) (+ 3 (point))))
+
+For convenience, Evil provides several functions returning a list of
+positions which can be used for defining text objects. All of them
+follow the convention that a positive *count* selects text after the
+current location, while negative *count* selects text before it.
+
+.. note::
+
+ The *thingatpt* library is used quite extensively in Evil to define
+ text objects, and this dependency leaks through in the following
+ functions. A *thing* in this context is any symbol for which there
+ is a function called ``forward-THING`` [#thing]_ which moves past a
+ number of *things*.
+
+.. elisp:autofunction:: evil-select-inner-object
+
+.. elisp:autofunction:: evil-select-an-object
+
+.. elisp:autofunction:: evil-select-paren
+
+
+Range types
+-----------
+
+A *type* is a transformation acting on a pair of buffer positions.
+Evil defines the types ``inclusive``, ``line``, ``block`` and
+``exclusive``, which are used for motion ranges and visual selection.
+New types may be defined with the macro *evil-define-type*.
+
+.. elisp:autofunction:: evil-define-type
+
+
+States
+------
+
+States are defined with the macro :elisp:ref:`evil-define-state`,
+which takes care to define the necessary hooks, keymaps and variables,
+as well as a toggle function ``evil-NAME-state`` and a predicate
+function ``evil-NAME-state-p`` for checking whether the state is
+active.
+
+.. elisp:autofunction:: evil-define-state
+
+For example:
+
+.. code-block:: elisp
+
+ (evil-define-state test
+ "Test state."
+ :tag " <T> "
+ (message (if (evil-test-state-p)
+ "Enabling test state."
+ "Disabling test state.")))
+
+
+.. rubric:: Footnotes
+
+.. [#thing] There are many more ways that a *thing* can be defined,
+ but the definition of ``forward-THING`` is perhaps the most
+ straightforward way to go about it.
diff --git a/doc/source/faq.rst b/doc/source/faq.rst
new file mode 100644
index 0000000..9ef2419
--- /dev/null
+++ b/doc/source/faq.rst
@@ -0,0 +1,102 @@
+Frequently Asked Questions
+==========================
+
+Problems with the escape key in the terminal
+--------------------------------------------
+
+A common problem when using Evil in terminal mode is a certain delay
+after pressing the escape key. Even more, when pressing the escape key
+followed quickly by another key the command is recognized as
+:kbd:`M-<key>` instead of two separate keys: :kbd:`ESC` followed by
+:kbd:`<key>`. In fact, it is perfectly valid to simulate
+:kbd:`M-<key>` by pressing :kbd:`ESC <key>` quickly (but see below).
+
+The reason for this is that in terminal mode a key sequence involving
+the meta key (or alt key) always generates a so called "escape
+sequence", i.e. a sequence of two events sent to Emacs, the first
+being :kbd:`ESC` and the second the key pressed simultaneously. The
+problem is that pressing the escape key itself also generates the
+:kbd:`ESC` event. Thus, if Emacs (and therefore Evil) receives an
+:kbd:`ESC` event there is no way to tell whether the escape key has
+been pressed (and no further event will arrive) or a :kbd:`M-<key>`
+combination has been pressed (and the :kbd:`<key>` event will arrive
+soon). In order to distinguish both situations Evil does the
+following. After receiving an :kbd:`ESC` event Evil waits for a short
+time period (specified by the variable :elisp:ref:`evil-esc-delay`
+which defaults to 0.01 seconds) for another event. If no other event
+arrives Evil assumes that the plain escape key has been pressed,
+otherwise it assumes a :kbd:`M-<key>` combination has been pressed and
+combines the :kbd:`ESC` event with the second one. Because a
+:kbd:`M-<key>` sequence usually generates both events in very quick
+succession, 0.01 seconds are usually enough and the delay is hardly
+noticeable by the user.
+
+If you use a terminal multiplexer like *tmux* or *screen* the
+situation may be worse. These multiplexers have exactly the same
+problem recognizing :kbd:`M-<key>` sequences and often introduce their
+own delay for the :kbd:`ESC` key. There is no way for Evil to
+influence this delay. In order to reduce it you must reconfigure your
+terminal multiplexer.
+
+Note that this problem should not arise when using Evil in graphical
+mode. The reason is that in this case the escape key itself generates
+a different command, namely ``escape`` (a symbol) and hence Evil can
+distinguish whether the escape key or a :kbd:`M-<key>` combination has
+been pressed. But this also implies that pressing :kbd:`ESC` followed
+by <key> cannot be used to simulate :kbd:`M-<key>` in graphical mode!
+
+
+Underscore is not a word character
+----------------------------------
+
+An underscore ``_`` is a word character in Vim. This means that word
+motions like :kbd:`w` skip over underlines in a sequence of letters as
+if it was a letter itself. In contrast, in Evil the underscore is
+often a non-word character like operators, e.g. ``+``.
+
+The reason is that Evil uses Emacs' definition of a word and this
+definition does often not include the underscore. In Emacs word
+characters are determined by the syntax-class of the buffer. The
+syntax-class usually depends on the major-mode of this buffer. This
+has the advantage that the definition of a "word" may be adapted to
+the particular type of document being edited. Evil uses Emacs'
+definition and does not simply use Vim's definition in order to be
+consistent with other Emacs functions. For example, word characters
+are exactly those characters that are matched by the regular
+expression character class ``[:word:]``.
+
+If you want the underscore to be recognised as word character, you can
+modify its entry in the syntax-table:
+
+.. code-block:: elisp
+
+ (modify-syntax-entry ?_ "w")
+
+This gives the underscore the 'word' syntax class. You can use a
+mode-hook to modify the syntax-table in all buffers of some mode,
+e.g.:
+
+.. code-block:: elisp
+
+ (add-hook 'c-mode-common-hook
+ (lambda () (modify-syntax-entry ?_ "w")))
+
+This gives the underscore the word syntax-class in all C-like buffers.
+
+Alternatively, many find that motion by *symbols* is more convenient
+than motion by *words*. One way to make word motions operate as
+symbol motions is to alias the ``evil-word`` *thing* [#thingatpt]_ to
+the ``evil-symbol`` thing:
+
+.. code-block:: elisp
+
+ (defalias 'forward-evil-word 'forward-evil-symbol)
+
+
+.. rubric:: Footnotes
+
+.. [#thingatpt] Many of Evil's text objects and motions are defined in
+ terms of the *thingatpt* library, which in this case are defined
+ entirely in terms of ``forward-THING`` functions. Thus aliasing
+ one to another should make all motions and text objects implemented
+ in terms of that *thing* behave the same.
diff --git a/doc/source/hooks.rst b/doc/source/hooks.rst
new file mode 100644
index 0000000..28ade72
--- /dev/null
+++ b/doc/source/hooks.rst
@@ -0,0 +1,16 @@
+Hooks
+=====
+
+A *hook* is a list of functions that are executed when certain events
+happen. Hooks are modified with the Emacs function ``add-hook``.
+Evil provides entry and exit hooks for all its states. For example,
+when switching from normal state to insert state, all functions in
+``evil-normal-state-exit-hook`` and ``evil-insert-state-entry-hook``
+are executed.
+
+It is guaranteed that the exit hook will be executed before the entry
+hook on all state switches.
+
+During the hook execution, the variables ``evil-next-state`` and
+``evil-previous-state`` contain information about the states being
+switched to and from, respectively.
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 0000000..95da7b7
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1,21 @@
+.. Evil documentation master file, created by
+ sphinx-quickstart on Thu Dec 12 10:34:49 2019.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Evil
+====
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents
+
+ overview
+ settings
+ keymaps
+ hooks
+ extension
+ faq
+ internals
+ license
+ indices
diff --git a/doc/source/indices.rst b/doc/source/indices.rst
new file mode 100644
index 0000000..46f687e
--- /dev/null
+++ b/doc/source/indices.rst
@@ -0,0 +1,6 @@
+.. only:: html
+
+ Index
+ =====
+
+ - :ref:`elispindex`
diff --git a/doc/source/internals.rst b/doc/source/internals.rst
new file mode 100644
index 0000000..9984f7c
--- /dev/null
+++ b/doc/source/internals.rst
@@ -0,0 +1,36 @@
+Internals
+=========
+
+Command properties
+------------------
+
+Evil defines *command properties* to store information about commands
+[#command]_, such as whether they should be repeated. A command
+property is a ``:keyword`` with an associated value, e.g.
+``:repeat nil``.
+
+.. elisp:autofunction:: evil-add-command-properties
+
+.. elisp:autofunction:: evil-set-command-properties
+
+.. elisp:autofunction:: evil-get-command-properties
+
+.. elisp:autofunction:: evil-get-command-property
+
+.. elisp:autofunction:: evil-define-command
+
+
+For setting repeat properties, use the following functions:
+
+.. elisp:autofunction:: evil-declare-repeat
+
+.. elisp:autofunction:: evil-declare-not-repeat
+
+.. elisp:autofunction:: evil-declare-change-repeat
+
+
+.. rubric:: Footnotes
+
+.. [#command] In this context, a *command* may mean any Evil motion,
+ text object, operator or indeed other Emacs commands, which have
+ not been defined through the Evil machinery.
diff --git a/doc/source/keymaps.rst b/doc/source/keymaps.rst
new file mode 100644
index 0000000..36f8141
--- /dev/null
+++ b/doc/source/keymaps.rst
@@ -0,0 +1,145 @@
+.. _chapter-keymaps:
+
+Keymaps
+=======
+
+Evil's key bindings are stored in a number of different keymaps. Each
+state has a *global keymap*, where the default bindings for that state
+are stored. They are named ``evil-normal-state-map``,
+``evil-insert-state-map``, and so on. The bindings in these maps are
+visible in all buffers currently in the corresponding state.
+
+These keymaps function like ordinary Emacs keymaps and may be modified
+using the Emacs function ``define-key``:
+
+.. code-block:: elisp
+
+ (define-key evil-normal-state-map (kbd "w") 'some-function)
+
+This binds the key :kbd:`w` to the command ``some-function`` in normal
+state. The use of ``kbd`` is optional for simple key sequences, like
+this one, but recommended in general.
+
+Most of Evil's bindings are defined in the file ``evil-maps.el``.
+
+To facilitate shared keybindings between states, some states may
+activate keybindings from other states as well. For example, motion
+state bindings are visible in normal and visual state, and normal
+state bindings are also visible in visual state.
+
+Each state also has a *buffer-local keymap* which is specific to the
+current buffer, and which takes precedence over the global keymap.
+These maps are most suitably modified by a mode hook. They are named
+``evil-normal-state-local-map``, ``evil-insert-state-local-map``, and
+so on.
+
+.. code-block:: elisp
+
+ (add-hook 'some-mode-hook
+ (lambda ()
+ (define-key evil-normal-state-local-map
+ (kbd "w") 'some-function)))
+
+For convenience, the functions :elisp:ref:`evil-global-set-key` and
+:elisp:ref:`evil-local-set-key` are available for setting global and
+local state keys.
+
+.. elisp:autofunction:: evil-global-set-key
+
+.. elisp:autofunction:: evil-local-set-key
+
+The above examples could therefore have been written as follows:
+
+.. code-block:: elisp
+
+ (evil-global-set-key 'normal (kbd "w") 'some-function)
+
+ (add-hook 'some-mode-hook
+ (lambda ()
+ (evil-local-set-key 'normal (kbd "w") 'some-function)))
+
+
+evil-define-key
+---------------
+
+Evil provides the macro :elisp:ref:`evil-define-key` for adding state
+bindings to ordinary keymaps. It is quite powerful, and is the
+preferred method for fine-tuning bindings to activate in specific
+circumstances.
+
+.. elisp:autofunction:: evil-define-key
+
+There follows a brief overview of the main functions of this macro.
+
+- Define a binding in a given state
+
+ .. code-block:: elisp
+
+ (evil-define-key 'state 'global (kbd "key") 'target)
+
+- Define a binding in a given state in the current buffer
+
+ .. code-block:: elisp
+
+ (evil-define-key 'state 'local (kbd "key") 'target)
+
+- Define a binding in a given state under the *foo-mode* major mode.
+
+ .. code-block:: elisp
+
+ (evil-define-key 'state foo-mode-map (kbd "key") 'target)
+
+ Note that ``foo-mode-map`` is unquoted, and that this form is safe
+ before ``foo-mode-map`` is loaded.
+
+- Define a binding in a given state under the *bar-mode* minor mode.
+
+ .. code-block:: elisp
+
+ (evil-define-key 'state 'bar-mode (kbd "key") 'target)
+
+ Note that ``bar-mode`` is quoted, and that this form is safe before
+ ``bar-mode`` is loaded.
+
+
+The macro :elisp:ref:`evil-define-key` can be used to augment existing
+modes with state bindings, as well as creating packages with custom
+bindings. For example, the following will create a minor mode
+``foo-mode`` with normal state bindings for the keys :kbd:`w` and
+:kbd:`e`:
+
+.. code-block:: elisp
+
+ (define-minor-mode foo-mode
+ "Foo mode."
+ :keymap (make-sparse-keymap))
+
+ (evil-define-key 'normal 'foo-mode "w" 'bar)
+ (evil-define-key 'normal 'foo-mode "e" 'baz)
+
+This minor mode can then be enabled in any buffers where the custom
+bindings are desired:
+
+.. code-block:: elisp
+
+ (add-hook 'text-mode-hook 'foo-mode) ; enable alongside text-mode
+
+
+Leader keys
+-----------
+
+Evil supports a simple implementation of Vim's *leader* keys. To bind
+a function to a leader key you can use the expression ``<leader>`` in
+a key mapping, e.g.
+
+.. code-block:: elisp
+
+ (evil-define-key 'normal 'global (kbd "<leader>fs") 'save-buffer)
+
+Likewise, you can use the expression ``<localleader>`` to mimic Vim's
+local leader, which is designed for mode-specific key bindings.
+
+You can use the function :elisp:ref:`evil-set-leader` to designate
+which key acts as the leader and the local leader.
+
+.. elisp:autofunction:: evil-set-leader
diff --git a/doc/source/license.rst b/doc/source/license.rst
new file mode 100644
index 0000000..39d6701
--- /dev/null
+++ b/doc/source/license.rst
@@ -0,0 +1,447 @@
+The GNU Free Documentation License
+==================================
+
+Version 1.3, 3 November 2008
+
+ Copyright (c) 2000, 2001, 2002, 2007, 2008 Free Software
+ Foundation, Inc. http://fsf.org/
+
+ Everyone is permitted to copy and distribute verbatim copies of
+ this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document *free* in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book. We
+ recommend this License principally for works whose purpose is
+ instruction or reference.
+
+1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it can
+ be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You accept
+ the license if you copy, modify or distribute the work in a way
+ requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in the
+ notice that says that the Document is released under this License.
+ If a section does not fit the above definition of Secondary then it
+ is not allowed to be designated as Invariant. The Document may
+ contain zero Invariant Sections. If the Document does not identify
+ any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images composed
+ of pixels) generic paint programs or (for drawings) some widely
+ available drawing editor, and that is suitable for input to text
+ formatters or for automatic translation to a variety of formats
+ suitable for input to text formatters. A copy made in an otherwise
+ Transparent file format whose markup, or absence of markup, has
+ been arranged to thwart or discourage subsequent modification by
+ readers is not Transparent. An image format is not Transparent if
+ used for any substantial amount of text. A copy that is not
+ "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and standard-conforming
+ simple HTML, PostScript or PDF designed for human modification.
+ Examples of transparent image formats include PNG, XCF and JPG.
+ Opaque formats include proprietary formats that can be read and
+ edited only by proprietary word processors, SGML or XML for which
+ the DTD and/or processing tools are not generally available, and
+ the machine-generated HTML, PostScript or PDF produced by some word
+ processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow the
+ conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the title
+ equally prominent and visible. You may add other material on the
+ covers in addition. Copying with changes limited to the covers, as
+ long as they preserve the title of the Document and satisfy these
+ conditions, can be treated as verbatim copying in other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a machine-readable
+ Transparent copy along with each Opaque copy, or state in or with
+ each Opaque copy a computer-network location from which the general
+ network-using public has access to download using public-standard
+ network protocols a complete Transparent copy of the Document, free
+ of added material. If you use the latter option, you must take
+ reasonably prudent steps, when you begin distribution of Opaque
+ copies in quantity, to ensure that this Transparent copy will
+ remain thus accessible at the stated location until at least one
+ year after the last time you distribute an Opaque copy (directly or
+ through your agents or retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of copies,
+ to give them a chance to provide you with an updated version of the
+ Document.
+
+4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with the
+ Modified Version filling the role of the Document, thus licensing
+ distribution and modification of the Modified Version to whoever
+ possesses a copy of it. In addition, you must do these things in
+ the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the
+ History section of the Document). You may use the same title as
+ a previous version if the original publisher of that version
+ gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in the
+ Modified Version, together with at least five of the principal
+ authors of the Document (all of its principal authors, if it has
+ fewer than five), unless they release you from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified Version
+ under the terms of this License, in the form shown in the
+ Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title, and
+ add to it an item stating at least the title, year, new authors,
+ and publisher of the Modified Version as given on the Title
+ Page. If there is no section Entitled "History" in the
+ Document, create one stating the title, year, authors, and
+ publisher of the Document as given on its Title Page, then add
+ an item describing the Modified Version as stated in the
+ previous sentence.
+
+ J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in the
+ "History" section. You may omit a network location for a work
+ that was published at least four years before the Document
+ itself, or if the original publisher of the version it refers to
+ gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section
+ all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the
+ equivalent are not considered part of the section titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section may
+ not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option designate
+ some or all of these sections as invariant. To do this, add their
+ titles to the list of Invariant Sections in the Modified Version's
+ license notice. These titles must be distinct from any other
+ section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties---for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end of
+ the list of Cover Texts in the Modified Version. Only one passage
+ of Front-Cover Text and one of Back-Cover Text may be added by (or
+ through arrangements made by) any one entity. If the Document
+ already includes a cover text for the same cover, previously added
+ by you or by arrangement made by the same entity you are acting on
+ behalf of, you may not add another; but you may replace the old
+ one, on explicit permission from the previous publisher that added
+ the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination all
+ of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the documents
+ in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow this
+ License in all other respects regarding verbatim copying of that
+ document.
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of a
+ storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of
+ section 4. Replacing Invariant Sections with translations requires
+ special permission from their copyright holders, but you may
+ include translations of some or all Invariant Sections in addition
+ to the original versions of these Invariant Sections. You may
+ include a translation of this License, and all the license notices
+ in the Document, and any Warranty Disclaimers, provided that you
+ also include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ http://www.gnu.org/copyleft.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If the
+ Document does not specify a version number of this License, you may
+ choose any version ever published (not as a draft) by the Free
+ Software Foundation. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
diff --git a/doc/source/overview.rst b/doc/source/overview.rst
new file mode 100644
index 0000000..0bb1a7e
--- /dev/null
+++ b/doc/source/overview.rst
@@ -0,0 +1,107 @@
+Overview
+========
+
+Evil is an extensible vi layer for Emacs. It emulates the main
+features of Vim, [#vim]_ turning Emacs into a modal editor. Like Emacs in
+general, Evil is extensible in Emacs Lisp.
+
+
+Installation via package.el
+---------------------------
+
+Evil is available as a package from MELPA stable and MELPA unstable.
+This is the recommended way of installing Evil.
+
+To set up `package.el` to work with one of these repositories, you can
+follow the instructions on
+`melpa.org <https://melpa.org/#/getting-started>`_.
+
+Once that is done, you can execute the following commands::
+
+ M-x package-refresh-contents
+ M-x package-install RET evil RET
+
+Finally, add the following lines to your Emacs init file:
+
+.. code-block:: elisp
+
+ (require 'evil)
+ (evil-mode 1)
+
+
+Manual installation
+-------------------
+
+First, install `undo-tree`, `goto-chg` and `cl-lib`. If you have an
+Emacs version of 24.3 or newer, you should already have `cl-lib`.
+
+Evil lives in a git repository. To download Evil, do::
+
+ git clone --depth 1 https://github.com/emacs-evil/evil.git
+
+Then add the following lines to your Emacs init file:
+
+.. code-block:: elisp
+
+ (add-to-list 'load-path "path/to/evil")
+ (require 'evil)
+ (evil-mode 1)
+
+Ensure that your replace ``path/to/evil`` with the actual path to
+where you cloned Evil.
+
+
+Modes and states
+----------------
+
+The next time Emacs is started, it will come up in *normal state*,
+denoted by ``<N>`` in 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
+``<E>``) in which vi keys are completely disabled. Press :kbd:`C-z`
+again to switch back to normal state.
+
+state
+ Evil uses the term *state* for what is called a "mode" in regular vi
+ usage, because *modes* are understood in Emacs terms to mean
+ something else.
+
+Evil defines a number of states by default:
+
+normal state (``<N>``)
+ This is the default "resting state" of Evil, in which the main body
+ of vi bindings are defined.
+
+insert state (``<I>``)
+ This is the state for insertion of text, where non-modified keys
+ will insert the corresponding character in the buffer.
+
+visual state (``<V>``)
+ A state for selecting text regions. Motions are available for
+ modifying the selected region, and operators are available for
+ acting on it.
+
+replace state (``<R>``)
+ A special state mostly similar to insert state, except it replaces
+ text instead of inserting.
+
+operator-pending state (``<O>``)
+ A special state entered after launching an operator, but before
+ specifying the corresponding motion or text object.
+
+motion state (``<M>``)
+ A special state useful for buffers that are read-only, where motions
+ are available but editing operations are not.
+
+Emacs state (``<E>``)
+ A state that as closely as possible mimics default Emacs behaviour,
+ by eliminating all vi bindings, except for :kbd:`C-z`, to re-enter
+ normal state.
+
+
+.. rubric:: Footnotes
+
+.. [#vim] Vim is the most popular version of *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 `the official Vim website <https://vim.org>`_.
diff --git a/doc/source/settings.rst b/doc/source/settings.rst
new file mode 100644
index 0000000..9ae45c6
--- /dev/null
+++ b/doc/source/settings.rst
@@ -0,0 +1,185 @@
+Settings
+========
+
+Evil's behaviour can be adjusted by setting some variables. The list
+of all available variables and their current values can be inspected
+by doing::
+
+ M-x customize-group RET evil RET
+
+To change the value of a variable, you can use this interface, or add
+a ``setq`` form to your Emacs init file, preferably before Evil is
+loaded. [#order]_
+
+.. code-block:: elisp
+
+ (setq evil-shift-width 0)
+ ;; Load Evil
+ (require 'evil)
+
+What follows is a non-exhaustive list of the most relevant
+customization options.
+
+
+The initial state
+-----------------
+
+The initial state of a buffer is determined by its major mode. Evil
+maintains an association between major modes and their corresponding
+states, which is most easily modified using the function
+:elisp:ref:`evil-set-initial-state`.
+
+.. elisp:autofunction:: evil-set-initial-state
+
+If no state can be found, Evil uses the default initial state.
+
+.. elisp:autovariable:: evil-default-state
+
+Alternatively, it is possible to select the initial state based on the
+buffer *name* rather than its major mode. This is checked first, so
+it takes precedence over the other methods for setting the state.
+
+.. elisp:autovariable:: evil-buffer-regexps
+
+
+Keybindings and other behaviour
+-------------------------------
+
+Evil comes with a rich system for modifying its key bindings
+:ref:`chapter-keymaps`. For the most common tweaks, the following
+variables are available.
+
+.. elisp:autovariable:: evil-toggle-key
+
+.. elisp:autovariable:: evil-want-C-i-jump
+
+.. elisp:autovariable:: evil-want-C-u-delete
+
+.. elisp:autovariable:: evil-want-C-u-scroll
+
+.. elisp:autovariable:: evil-want-C-d-scroll
+
+.. elisp:autovariable:: evil-want-C-w-delete
+
+.. elisp:autovariable:: evil-want-C-w-in-emacs-state
+
+.. elisp:autovariable:: evil-want-Y-yank-to-eol
+
+.. elisp:autovariable:: evil-disable-insert-state-bindings
+
+
+Search
+------
+
+.. elisp:autovariable:: evil-regexp-search
+
+.. elisp:autovariable:: evil-search-wrap
+
+.. elisp:autovariable:: evil-flash-delay
+
+.. elisp:autovariable:: evil-ex-hl-update-delay
+
+
+Indentation
+-----------
+
+.. elisp:autovariable:: evil-auto-indent
+
+.. elisp:autovariable:: evil-shift-width
+
+.. elisp:autovariable:: evil-shift-round
+
+.. elisp:autovariable:: evil-indent-convert-tabs
+
+
+Cursor movement
+---------------
+
+In standard Emacs terms, the cursor is generally understood to be
+located between two characters. In Vim, and therefore also Evil, this
+is the case in insert state, but in other states the cursor is
+understood to be *on* a character, and that this character is not a
+newline.
+
+Forcing this behaviour in Emacs is the source of some potentially
+surprising results (especially for traditional Emacs users---users
+used to Vim may find the default behavior to their satisfaction). Many
+of them can be tweaked using the following variables.
+
+.. elisp:autovariable:: evil-repeat-move-cursor
+
+.. elisp:autovariable:: evil-move-cursor-back
+
+.. elisp:autovariable:: evil-move-beyond-eol
+
+.. elisp:autovariable:: evil-cross-lines
+
+.. elisp:autovariable:: evil-respect-visual-line-mode
+
+.. elisp:autovariable:: evil-track-eol
+
+
+Cursor display
+--------------
+
+A state may change the appearance of the cursor. Use the variable
+:elisp:ref:`evil-default-cursor` to set the default cursor, and the
+variables ``evil-normal-state-cursor``, ``evil-insert-state-cursor``
+etc. to set the cursors for specific states. The acceptable values
+for all of them are the same.
+
+.. elisp:autovariable:: evil-default-cursor
+
+
+Window management
+-----------------
+
+.. elisp:autovariable:: evil-auto-balance-windows
+
+.. elisp:autovariable:: evil-split-window-below
+
+.. elisp:autovariable:: evil-vsplit-window-right
+
+
+Parenthesis highlighting
+------------------------
+
+These settings concern the integration between Evil and
+``show-paren-mode``. They take no effect if this mode is not enabled.
+
+.. elisp:autovariable:: evil-show-paren-range
+
+.. elisp:autovariable:: evil-highlight-closing-paren-at-point-states
+
+
+Miscellaneous
+-------------
+
+.. elisp:autovariable:: evil-want-fine-undo
+
+.. elisp:autovariable:: evil-backspace-join-lines
+
+.. elisp:autovariable:: evil-kbd-macro-suppress-motion-error
+
+.. elisp:autovariable:: evil-mode-line-format
+
+.. elisp:autovariable:: evil-mouse-word
+
+.. elisp:autovariable:: evil-bigword
+
+.. elisp:autovariable:: evil-esc-delay
+
+.. elisp:autovariable:: evil-intercept-esc
+
+.. elisp:autovariable:: evil-kill-on-visual-paste
+
+.. elisp:autovariable:: evil-echo-state
+
+.. elisp:autovariable:: evil-complete-all-buffers
+
+
+.. rubric:: Footnotes
+
+.. [#order] Strictly speaking, the order only matters if the variable
+ affects the way Evil is loaded. This is the case with some
+ variables.
diff --git a/doc/version.texi b/doc/version.texi
deleted file mode 100644
index 8531f00..0000000
--- a/doc/version.texi
+++ /dev/null
@@ -1,7 +0,0 @@
-@c -*-texinfo-*-
-@c This is part of the Evil manual.
-@c Copyright (C) 2011 Frank Fischer and Vegard Øye.
-@c See the file evil.texi for copying conditions.
-
-@set VERSION 0.1
-@set UPDATED 2011-07-30
diff --git a/evil-command-window.el b/evil-command-window.el
index 79db2a6..3d3397f 100644
--- a/evil-command-window.el
+++ b/evil-command-window.el
@@ -1,8 +1,8 @@
-;;; evil-command-window.el --- Evil command line window implementation
+;;; evil-command-window.el --- Evil command line window implementation -*- lexical-binding: t -*-
;; Author: Emanuel Evans <emanuel.evans at gmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -69,14 +69,35 @@ execute on the result that the user selects."
(evil-command-window-mode)
(evil-command-window-insert-commands hist))
-(defun evil-command-window-ex (&optional current-command)
+(defun evil-command-window-ex (&optional current-command execute-fn)
"Open a command line window for editing and executing ex commands.
If CURRENT-COMMAND is present, it will be inserted under the
-cursor as the current command to be edited."
+cursor as the current command to be edited. If EXECUTE-FN is given,
+it will be used as the function to execute instead of
+`evil-command-window-ex-execute', the default."
(interactive)
(evil-command-window (cons (or current-command "") evil-ex-history)
":"
- 'evil-command-window-ex-execute))
+ (or execute-fn 'evil-command-window-ex-execute)))
+
+(defun evil-ex-command-window ()
+ "Start command window with ex history and current minibuffer content."
+ (interactive)
+ (let ((current (minibuffer-contents))
+ (config (current-window-configuration)))
+ (evil-ex-teardown)
+ (select-window (minibuffer-selected-window) t)
+ (evil-command-window-ex current (apply-partially 'evil-ex-command-window-execute config))))
+
+(defun evil-ex-search-command-window ()
+ "Start command window with search history and current minibuffer content."
+ (interactive)
+ (let ((current (minibuffer-contents))
+ (config (current-window-configuration)))
+ (select-window (minibuffer-selected-window) t)
+ (evil-command-window (cons current evil-ex-search-history)
+ (evil-search-prompt (eq evil-ex-search-direction 'forward))
+ (apply-partially 'evil-ex-command-window-execute config))))
(defun evil-command-window-execute ()
"Execute the command under the cursor in the appropriate buffer.
diff --git a/evil-commands.el b/evil-commands.el
index c046861..dabbf68 100644
--- a/evil-commands.el
+++ b/evil-commands.el
@@ -1,8 +1,8 @@
-;;; evil-commands.el --- Evil commands and operators
+;;; evil-commands.el --- Evil commands and operators -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -31,10 +31,11 @@
(require 'evil-types)
(require 'evil-command-window)
(require 'evil-jumps)
+(require 'flyspell)
+(require 'cl-lib)
+(require 'reveal)
-;;; Compatibility for Emacs 23
-(unless (fboundp 'window-body-width)
- (defalias 'window-body-width 'window-width))
+(declare-function imenu--in-alist "imenu")
;;; Motions
@@ -84,8 +85,7 @@ of the line or the buffer; just return nil."
(evil-motion-loop (nil (or count 1))
(forward-char)
;; don't put the cursor on a newline
- (when (and evil-move-cursor-back
- (not evil-move-beyond-eol)
+ (when (and (not evil-move-beyond-eol)
(not (evil-visual-state-p))
(not (evil-operator-state-p))
(eolp) (not (eobp)) (not (bolp)))
@@ -115,7 +115,7 @@ of the line or the buffer; just return nil."
(evil-narrow-to-line
(evil-backward-char count t noerror))
(error
- ;; Restore the previous command (this one never happend).
+ ;; Restore the previous command (this one never happened).
;; Actually, this preserves the current column if the
;; previous command was `evil-next-line' or
;; `evil-previous-line'.
@@ -160,7 +160,19 @@ of the line or the buffer; just return nil."
;; Catch bob and eob errors. These are caused when not moving
;; point starting in the first or last line, respectively. In this
;; case the current line should be selected.
- (condition-case err
+ (condition-case _err
+ (evil-line-move (1- (or count 1)))
+ ((beginning-of-buffer end-of-buffer)))))
+
+(evil-define-motion evil-line-or-visual-line (count)
+ "Move COUNT - 1 lines down."
+ :type screen-line
+ (let ((line-move-visual (and evil-respect-visual-line-mode
+ visual-line-mode)))
+ ;; Catch bob and eob errors. These are caused when not moving
+ ;; point starting in the first or last line, respectively. In this
+ ;; case the current line should be selected.
+ (condition-case _err
(evil-line-move (1- (or count 1)))
((beginning-of-buffer end-of-buffer)))))
@@ -198,6 +210,18 @@ If COUNT is given, move COUNT - 1 screen lines downward first."
(end-of-visual-line count)
(end-of-line count)))
+(evil-define-motion evil-end-of-line-or-visual-line (count)
+ "Move the cursor to the last character of the current screen
+line if `visual-line-mode' is active and
+`evil-respect-visual-line-mode' is non-nil. If COUNT is given,
+move COUNT - 1 screen lines downward first."
+ :type inclusive
+ (if (and (fboundp 'end-of-visual-line)
+ evil-respect-visual-line-mode
+ visual-line-mode)
+ (end-of-visual-line count)
+ (evil-end-of-line count)))
+
(evil-define-motion evil-middle-of-visual-line ()
"Move the cursor to the middle of the current visual line."
:type exclusive
@@ -311,7 +335,7 @@ If point is at the end of the buffer and cannot be moved signal
(evil-forward-beginning thing count))
;; the evil-change operator, maybe behave like ce or cE
((and evil-want-change-word-to-end
- (eq evil-this-operator #'evil-change)
+ (memq evil-this-operator evil-change-commands)
(< orig (or (cdr-safe (bounds-of-thing-at-point thing)) orig)))
;; forward-thing moves point to the correct position because
;; this is an exclusive motion
@@ -426,7 +450,7 @@ If BIGWORD is non-nil, move by WORDS."
:type exclusive
(evil-signal-at-bob-or-eob count)
(evil-forward-nearest count
- #'(lambda (cnt)
+ #'(lambda (_cnt)
(evil-forward-beginning 'evil-sentence))
#'evil-forward-paragraph))
@@ -436,9 +460,9 @@ If BIGWORD is non-nil, move by WORDS."
:type exclusive
(evil-signal-at-bob-or-eob (- (or count 1)))
(evil-forward-nearest (- (or count 1))
- #'(lambda (cnt)
+ #'(lambda (_cnt)
(evil-backward-beginning 'evil-sentence))
- #'(lambda (cnt)
+ #'(lambda (_cnt)
(evil-backward-paragraph))))
(evil-define-motion evil-forward-paragraph (count)
@@ -458,6 +482,7 @@ If BIGWORD is non-nil, move by WORDS."
(evil-backward-beginning 'evil-paragraph count)
(unless (bobp) (forward-line -1)))
+(defvar hif-ifx-else-endif-regexp)
(evil-define-motion evil-jump-item (count)
"Find the next item in this line after or under the cursor
and jump to the corresponding one."
@@ -531,7 +556,6 @@ and jump to the corresponding one."
((not (or open-pair close-pair))
;; nothing found, check if we are inside a string
(let ((pnt (point))
- (state (syntax-ppss (point)))
(bnd (bounds-of-thing-at-point 'evil-string)))
(if (not (and bnd (< (point) (cdr bnd))))
;; no, then we really failed
@@ -554,16 +578,85 @@ and jump to the corresponding one."
((< open close) (goto-char open-pair))
(t (goto-char close-pair)))))))
+(defun evil--flyspell-overlays-in-p (beg end)
+ (let ((ovs (overlays-in beg end))
+ done)
+ (while (and ovs (not done))
+ (when (flyspell-overlay-p (car ovs))
+ (setq done t))
+ (setq ovs (cdr ovs)))
+ done))
+
+(defun evil--flyspell-overlay-at (pos forwardp)
+ (when (not forwardp)
+ (setq pos (max (1- pos) (point-min))))
+ (let ((ovs (overlays-at pos))
+ done)
+ (while (and ovs (not done))
+ (if (flyspell-overlay-p (car ovs))
+ (setq done t)
+ (setq ovs (cdr ovs))))
+ (when done
+ (car ovs))))
+
+(defun evil--flyspell-overlay-after (pos limit forwardp)
+ (let (done)
+ (while (and (if forwardp
+ (< pos limit)
+ (> pos limit))
+ (not done))
+ (let ((ov (evil--flyspell-overlay-at pos forwardp)))
+ (when ov
+ (setq done ov)))
+ (setq pos (if forwardp
+ (next-overlay-change pos)
+ (previous-overlay-change pos))))
+ done))
+
+(defun evil--next-flyspell-error (forwardp)
+ (when (evil--flyspell-overlays-in-p (point-min) (point-max))
+ (let ((pos (point))
+ limit
+ ov)
+ (when (evil--flyspell-overlay-at pos forwardp)
+ (if (/= pos (point-min))
+ (setq pos (save-excursion (goto-char pos)
+ (forward-word (if forwardp 1 -1))
+ (point)))
+ (setq pos (point-max))))
+ (setq limit (if forwardp (point-max) (point-min))
+ ov (evil--flyspell-overlay-after pos limit forwardp))
+ (if ov
+ (goto-char (overlay-start ov))
+ (when evil-search-wrap
+ (setq limit pos
+ pos (if forwardp (point-min) (point-max))
+ ov (evil--flyspell-overlay-after pos limit forwardp))
+ (when ov
+ (goto-char (overlay-start ov))))))))
+
+(evil-define-motion evil-next-flyspell-error (count)
+ "Go to the COUNT'th spelling mistake after point."
+ (interactive "p")
+ (dotimes (_ count)
+ (evil--next-flyspell-error t)))
+
+(evil-define-motion evil-prev-flyspell-error (count)
+ "Go to the COUNT'th spelling mistake preceding point."
+ (interactive "p")
+ (dotimes (_ count)
+ (evil--next-flyspell-error nil)))
+
(evil-define-motion evil-previous-open-paren (count)
"Go to [count] previous unmatched '('."
:type exclusive
- (evil-up-paren ?( ?) (- (or count 1))))
+ (evil-up-paren ?\( ?\) (- (or count 1))))
(evil-define-motion evil-next-close-paren (count)
"Go to [count] next unmatched ')'."
:type exclusive
(forward-char)
- (evil-up-paren ?( ?) (or count 1))
+ (evil-up-paren ?\( ?\) (or count 1))
(backward-char))
(evil-define-motion evil-previous-open-brace (count)
@@ -579,20 +672,33 @@ and jump to the corresponding one."
(backward-char))
(evil-define-motion evil-find-char (count char)
- "Move to the next COUNT'th occurrence of CHAR."
+ "Move to the next COUNT'th occurrence of CHAR.
+Movement is restricted to the current line unless `evil-cross-lines' is non-nil."
:type inclusive
(interactive "<c><C>")
(setq count (or count 1))
- (let ((fwd (> count 0)))
+ (let ((fwd (> count 0))
+ (visual (and evil-respect-visual-line-mode
+ visual-line-mode)))
(setq evil-last-find (list #'evil-find-char char fwd))
(when fwd (forward-char))
(let ((case-fold-search nil))
(unless (prog1
(search-forward (char-to-string char)
- (unless evil-cross-lines
- (if fwd
- (line-end-position)
- (line-beginning-position)))
+ (cond (evil-cross-lines
+ nil)
+ ((and fwd visual)
+ (save-excursion
+ (end-of-visual-line)
+ (point)))
+ (fwd
+ (line-end-position))
+ (visual
+ (save-excursion
+ (beginning-of-visual-line)
+ (point)))
+ (t
+ (line-beginning-position)))
t count)
(when fwd (backward-char)))
(user-error "Can't find %c" char)))))
@@ -663,6 +769,7 @@ Columns are counted from zero."
:keep-visual t
:repeat nil
:type exclusive
+ :jump t
(interactive (list (read-char)))
(let ((marker (evil-get-marker char)))
(cond
@@ -687,6 +794,7 @@ Columns are counted from zero."
:keep-visual t
:repeat nil
:type line
+ :jump t
(interactive (list (read-char)))
(evil-goto-mark char noerror)
(evil-first-non-blank))
@@ -710,18 +818,24 @@ The current position is placed in the jump list."
(evil--jump-backward 1)
(evil-set-jump pnt)))
+(defvar xref-prompt-for-identifier)
(evil-define-motion evil-jump-to-tag (arg)
"Jump to tag under point.
If called with a prefix argument, provide a prompt
for specifying the tag."
:jump t
(interactive "P")
- (if arg (call-interactively #'find-tag)
- (let ((tag (funcall (or find-tag-default-function
- (get major-mode 'find-tag-default-function)
- #'find-tag-default))))
- (unless tag (user-error "No tag candidate found around point"))
- (find-tag tag))))
+ (cond
+ ((fboundp 'xref-find-definitions)
+ (let ((xref-prompt-for-identifier arg))
+ (call-interactively #'xref-find-definitions)))
+ ((fboundp 'find-tag)
+ (if arg (call-interactively #'find-tag)
+ (let ((tag (funcall (or find-tag-default-function
+ (get major-mode 'find-tag-default-function)
+ #'find-tag-default))))
+ (unless tag (user-error "No tag candidate found around point"))
+ (find-tag tag))))))
(evil-define-motion evil-lookup ()
"Look up the keyword at point.
@@ -806,27 +920,19 @@ on the first non-blank character."
;; scrolling
(evil-define-command evil-scroll-line-up (count)
- "Scrolls the window COUNT lines upwards.
-If COUNT is not specified the function uses
-`evil-scroll-line-count', which is the last used count."
+ "Scrolls the window COUNT lines upwards."
:repeat nil
:keep-visual t
- (interactive "<c>")
- (progn
- (setq count (or count evil-scroll-line-count))
- (setq evil-scroll-line-count count)
+ (interactive "p")
+ (let ((scroll-preserve-screen-position nil))
(scroll-down count)))
(evil-define-command evil-scroll-line-down (count)
- "Scrolls the window COUNT lines downwards.
-If COUNT is not specified the function uses
-`evil-scroll-line-count', which is the last used count."
+ "Scrolls the window COUNT lines downwards."
:repeat nil
:keep-visual t
- (interactive "<c>")
- (progn
- (setq count (or count evil-scroll-line-count))
- (setq evil-scroll-line-count count)
+ (interactive "p")
+ (let ((scroll-preserve-screen-position nil))
(scroll-up count)))
(evil-define-command evil-scroll-count-reset ()
@@ -852,8 +958,8 @@ If the scroll count is zero the command scrolls half the screen."
(when (= (point-min) (line-beginning-position))
(signal 'beginning-of-buffer nil))
(when (zerop count)
- (setq count (/ (1- (window-height)) 2)))
- (let ((xy (posn-x-y (posn-at-point))))
+ (setq count (/ (window-body-height) 2)))
+ (let ((xy (evil-posn-x-y (posn-at-point))))
(condition-case nil
(progn
(scroll-down count)
@@ -876,12 +982,12 @@ If the scroll count is zero the command scrolls half the screen."
(setq evil-scroll-count count)
(when (eobp) (signal 'end-of-buffer nil))
(when (zerop count)
- (setq count (/ (1- (window-height)) 2)))
+ (setq count (/ (window-body-height) 2)))
;; BUG #660: First check whether the eob is visible.
;; In that case we do not scroll but merely move point.
(if (<= (point-max) (window-end))
(with-no-warnings (next-line count nil))
- (let ((xy (posn-x-y (posn-at-point))))
+ (let ((xy (evil-posn-x-y (posn-at-point))))
(condition-case nil
(progn
(scroll-up count)
@@ -1131,12 +1237,12 @@ or line COUNT to the top of the window."
(evil-define-text-object evil-a-paren (count &optional beg end type)
"Select a parenthesis."
:extend-selection nil
- (evil-select-paren ?( ?) beg end type count t))
+ (evil-select-paren ?\( ?\) beg end type count t))
(evil-define-text-object evil-inner-paren (count &optional beg end type)
"Select inner parenthesis."
:extend-selection nil
- (evil-select-paren ?( ?) beg end type count))
+ (evil-select-paren ?\( ?\) beg end type count))
(evil-define-text-object evil-a-bracket (count &optional beg end type)
"Select a square bracket."
@@ -1258,19 +1364,23 @@ or line COUNT to the top of the window."
(cua-copy-region-to-global-mark beg end))
((eq type 'block)
(evil-yank-rectangle beg end register yank-handler))
- ((eq type 'line)
+ ((memq type '(line screen-line))
(evil-yank-lines beg end register yank-handler))
(t
(evil-yank-characters beg end register yank-handler)))))
(evil-define-operator evil-yank-line (beg end type register)
"Saves whole lines into the kill-ring."
- :motion evil-line
+ :motion evil-line-or-visual-line
:move-point nil
(interactive "<R><x>")
(when (evil-visual-state-p)
- (unless (memq type '(line block))
- (let ((range (evil-expand beg end 'line)))
+ (unless (memq type '(line block screen-line))
+ (let ((range (evil-expand beg end
+ (if (and evil-respect-visual-line-mode
+ visual-line-mode)
+ 'screen-line
+ 'line))))
(setq beg (evil-range-beginning range)
end (evil-range-end range)
type (evil-type range))))
@@ -1301,7 +1411,7 @@ Save in REGISTER or in the kill-ring with YANK-HANDLER."
(t
(delete-region beg end)))
;; place cursor on beginning of line
- (when (and (evil-called-interactively-p)
+ (when (and (called-interactively-p 'any)
(eq type 'line))
(evil-first-non-blank)))
@@ -1312,10 +1422,20 @@ Save in REGISTER or in the kill-ring with YANK-HANDLER."
(interactive "<R><x>")
;; act linewise in Visual state
(let* ((beg (or beg (point)))
- (end (or end beg)))
+ (end (or end beg))
+ (visual-line-mode (and evil-respect-visual-line-mode
+ visual-line-mode))
+ (line-end (if visual-line-mode
+ (save-excursion
+ (end-of-visual-line)
+ (point))
+ (line-end-position))))
(when (evil-visual-state-p)
- (unless (memq type '(line block))
- (let ((range (evil-expand beg end 'line)))
+ (unless (memq type '(line screen-line block))
+ (let ((range (evil-expand beg end
+ (if visual-line-mode
+ 'screen-line
+ 'line))))
(setq beg (evil-range-beginning range)
end (evil-range-end range)
type (evil-type range))))
@@ -1329,15 +1449,15 @@ Save in REGISTER or in the kill-ring with YANK-HANDLER."
(let ((temporary-goal-column most-positive-fixnum)
(last-command 'next-line))
(evil-delete beg end 'block register yank-handler)))
- ((eq type 'line)
+ ((memq type '(line screen-line))
(evil-delete beg end type register yank-handler))
(t
- (evil-delete beg (line-end-position) type register yank-handler)))))
+ (evil-delete beg line-end type register yank-handler)))))
(evil-define-operator evil-delete-whole-line
(beg end type register yank-handler)
"Delete whole line."
- :motion evil-line
+ :motion evil-line-or-visual-line
(interactive "<R><x>")
(evil-delete beg end type register yank-handler))
@@ -1369,14 +1489,58 @@ be joined with the previous line if and only if
(progn
(unless evil-backspace-join-lines (user-error "Beginning of line"))
(delete-char -1))
- (evil-delete (max
- (save-excursion
- (evil-backward-word-begin)
- (point))
- (line-beginning-position))
- (point)
- 'exclusive
- nil)))
+ (delete-region (max
+ (save-excursion
+ (evil-backward-word-begin)
+ (point))
+ (line-beginning-position))
+ (point))))
+
+(evil-define-command evil-delete-back-to-indentation ()
+ "Delete back to the first non-whitespace character.
+If point is before the first non-whitespace character of a
+current line then delete from the point to the beginning of the
+current line. If point is on the beginning of the line, behave
+according to `evil-backspace-join-lines'."
+ (if (bolp)
+ (evil-delete-backward-char-and-join 1)
+ (delete-region (if (<= (current-column) (current-indentation))
+ (line-beginning-position)
+ (save-excursion
+ (evil-first-non-blank)
+ (point)))
+ (point))))
+
+(defun evil-ex-delete-or-yank (should-delete beg end type register count yank-handler)
+ "Execute evil-delete or evil-yank on the given region.
+If SHOULD-DELETE is t, evil-delete will be executed, otherwise
+evil-yank.
+The region specified by BEG and END will be adjusted if COUNT is
+given."
+ (when count
+ ;; with COUNT, the command should go the end of the region and delete/yank
+ ;; COUNT lines from there
+ (setq beg (save-excursion
+ (goto-char end)
+ (forward-line -1)
+ (point))
+ end (save-excursion
+ (goto-char end)
+ (point-at-bol count))
+ type 'line))
+ (funcall (if should-delete 'evil-delete 'evil-yank) beg end type register yank-handler))
+
+(evil-define-operator evil-ex-delete (beg end type register count yank-handler)
+ "The Ex delete command.
+\[BEG,END]delete [REGISTER] [COUNT]"
+ (interactive "<R><xc/><y>")
+ (evil-ex-delete-or-yank t beg end type register count yank-handler))
+
+(evil-define-operator evil-ex-yank (beg end type register count yank-handler)
+ "The Ex yank command.
+\[BEG,END]yank [REGISTER] [COUNT]"
+ (interactive "<R><xc/><y>")
+ (evil-ex-delete-or-yank nil beg end type register count yank-handler))
(evil-define-operator evil-change
(beg end type register yank-handler delete-func)
@@ -1407,20 +1571,20 @@ of the block."
(evil-define-operator evil-change-line (beg end type register yank-handler)
"Change to end of line."
- :motion evil-end-of-line
+ :motion evil-end-of-line-or-visual-line
(interactive "<R><x><y>")
(evil-change beg end type register yank-handler #'evil-delete-line))
(evil-define-operator evil-change-whole-line
(beg end type register yank-handler)
"Change whole line."
- :motion evil-line
+ :motion evil-line-or-visual-line
(interactive "<R><x>")
(evil-change beg end type register yank-handler #'evil-delete-whole-line))
(evil-define-command evil-copy (beg end address)
"Copy lines in BEG END below line given by ADDRESS."
- :motion evil-line
+ :motion evil-line-or-visual-line
(interactive "<r><addr>")
(goto-char (point-min))
(forward-line address)
@@ -1435,7 +1599,7 @@ of the block."
(evil-define-command evil-move (beg end address)
"Move lines in BEG END below line given by ADDRESS."
- :motion evil-line
+ :motion evil-line-or-visual-line
(interactive "<r><addr>")
(goto-char (point-min))
(forward-line address)
@@ -1498,7 +1662,6 @@ of the block."
(when evil-this-motion
(goto-char end)
(when (and evil-cross-lines
- evil-move-cursor-back
(not evil-move-beyond-eol)
(not (evil-visual-state-p))
(not (evil-operator-state-p))
@@ -1517,7 +1680,8 @@ of the block."
(let ((count (count-lines beg end)))
(when (> count 1)
(setq count (1- count)))
- (dotimes (var count)
+ (goto-char beg)
+ (dotimes (_ count)
(join-line 1))))
(evil-define-operator evil-join-whitespace (beg end)
@@ -1528,11 +1692,35 @@ but doesn't insert or remove any spaces."
(let ((count (count-lines beg end)))
(when (> count 1)
(setq count (1- count)))
- (dotimes (var count)
+ (goto-char beg)
+ (dotimes (_ count)
(evil-move-end-of-line 1)
(unless (eobp)
(delete-char 1)))))
+(evil-define-operator evil-ex-join (beg end &optional count bang)
+ "Join the selected lines with optional COUNT and BANG."
+ (interactive "<r><a><!>")
+ (if (and count (not (string-match-p "^[1-9][0-9]*$" count)))
+ (user-error "Invalid count")
+ (let ((join-fn (if bang 'evil-join-whitespace 'evil-join)))
+ (cond
+ ((not count)
+ ;; without count - just join the given region
+ (funcall join-fn beg end))
+ (t
+ ;; emulate vim's :join when count is given - start from the
+ ;; end of the region and join COUNT lines from there
+ (let* ((count-num (string-to-number count))
+ (beg-adjusted (save-excursion
+ (goto-char end)
+ (forward-line -1)
+ (point)))
+ (end-adjusted (save-excursion
+ (goto-char end)
+ (point-at-bol count-num))))
+ (funcall join-fn beg-adjusted end-adjusted)))))))
+
(evil-define-operator evil-fill (beg end)
"Fill text."
:move-point nil
@@ -1642,10 +1830,17 @@ See also `evil-shift-left'."
(indent-to new-indent 0))
(delete-region (point) (progn (skip-chars-forward " \t") (point)))
(forward-line 1))))
- ;; assuming that point is in the first line, adjust its position
- (if (called-interactively-p 'any)
- (evil-first-non-blank)
- (move-to-column (max 0 (+ pnt-indent first-shift))))))
+ ;; in case we're in an empty buffer first-shift is still unchanged
+ (unless first-shift
+ (if (< count 0)
+ (setq first-shift 0)
+ (setq first-shift (* count evil-shift-width))
+ (indent-to first-shift)))
+ ;; When called from insert state (C-t or C-d) the cursor should shift with the line,
+ ;; otherwise (normal state) it should end up on the first non-whitespace character
+ (if (evil-insert-state-p)
+ (move-to-column (max 0 (+ pnt-indent first-shift)))
+ (evil-first-non-blank))))
(evil-define-command evil-shift-right-line (count)
"Shift the current line COUNT times to the right.
@@ -1735,7 +1930,8 @@ The default for width is the value of `fill-column'."
"Pastes the latest yanked text before the cursor position.
The return value is the yanked text."
:suppress-operator t
- (interactive "P<x>")
+ (interactive "*P<x>")
+ (setq count (prefix-numeric-value count))
(if (evil-visual-state-p)
(evil-visual-paste count register)
(evil-with-undo
@@ -1759,7 +1955,7 @@ The return value is the yanked text."
(setq text (evil-vector-to-string text)))
(set-text-properties 0 (length text) nil text)
(push-mark opoint t)
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(insert-for-yank text))
(setq evil-last-paste
(list #'evil-paste-before
@@ -1769,7 +1965,8 @@ The return value is the yanked text."
(point))) ; end
(evil-set-marker ?\[ opoint)
(evil-set-marker ?\] (1- (point)))
- (when (> (length text) 0)
+ (when (and evil-move-cursor-back
+ (> (length text) 0))
(backward-char))))
;; no paste-pop after pasting from a register
(when register
@@ -1781,7 +1978,8 @@ The return value is the yanked text."
"Pastes the latest yanked text behind point.
The return value is the yanked text."
:suppress-operator t
- (interactive "P<x>")
+ (interactive "*P<x>")
+ (setq count (prefix-numeric-value count))
(if (evil-visual-state-p)
(evil-visual-paste count register)
(evil-with-undo
@@ -1810,7 +2008,7 @@ The return value is the yanked text."
;; The reason is that this yanking could very well use
;; `yank-handler'.
(let ((beg (point)))
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(insert-for-yank text))
(setq evil-last-paste
(list #'evil-paste-after
@@ -1829,7 +2027,8 @@ The return value is the yanked text."
(evil-define-command evil-visual-paste (count &optional register)
"Paste over Visual selection."
:suppress-operator t
- (interactive "P<x>")
+ (interactive "*P<x>")
+ (setq count (prefix-numeric-value count))
;; evil-visual-paste is typically called from evil-paste-before or
;; evil-paste-after, but we have to mark that the paste was from
;; visual state
@@ -1864,7 +2063,8 @@ The return value is the yanked text."
(if paste-eob
(evil-paste-after count register)
(evil-paste-before count register)))
- (kill-new new-kill)
+ (when evil-kill-on-visual-paste
+ (kill-new new-kill))
;; mark the last paste as visual-paste
(setq evil-last-paste
(list (nth 0 evil-last-paste)
@@ -1889,7 +2089,8 @@ The return value is the yanked text."
(delete-overlay overlay))))
(when (evil-paste-before nil register t)
;; go to end of pasted text
- (forward-char)))
+ (unless (eobp)
+ (forward-char))))
(defun evil-paste-last-insertion ()
"Paste last insertion."
@@ -1906,15 +2107,6 @@ The return value is the yanked text."
(defvar evil-macro-buffer nil
"The buffer that has been active on macro recording.")
-(defun evil-abort-macro ()
- "Abort macro recording when the buffer is changed.
-Macros are aborted when the the current buffer
-is changed during macro recording."
- (unless (or (minibufferp) (eq (current-buffer) evil-macro-buffer))
- (remove-hook 'post-command-hook #'evil-abort-macro)
- (end-kbd-macro)
- (message "Abort macro recording (changed buffer)")))
-
(evil-define-command evil-record-macro (register)
"Record a keyboard macro into REGISTER.
If REGISTER is :, /, or ?, the corresponding command line window
@@ -1928,7 +2120,6 @@ will be opened instead."
((eq register ?\C-g)
(keyboard-quit))
((and evil-this-macro defining-kbd-macro)
- (remove-hook 'post-command-hook #'evil-abort-macro)
(setq evil-macro-buffer nil)
(condition-case nil
(end-kbd-macro)
@@ -1951,8 +2142,7 @@ will be opened instead."
(setq evil-this-macro register)
(evil-set-register evil-this-macro nil)
(start-kbd-macro nil)
- (setq evil-macro-buffer (current-buffer))
- (add-hook 'post-command-hook #'evil-abort-macro))
+ (setq evil-macro-buffer (current-buffer)))
(t (error "Invalid register"))))
(evil-define-command evil-execute-macro (count macro)
@@ -1986,7 +2176,7 @@ when called interactively."
(cond
((functionp macro)
(evil-repeat-abort)
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(funcall macro)))
((or (and (not (stringp macro))
(not (vectorp macro)))
@@ -2126,7 +2316,7 @@ lines. This is the default behaviour for Visual-state insertion."
(prog1 (count-lines evil-visual-beginning evil-visual-end)
(set-mark m)))))
(evil-visual-state-p)))
- (if (and (evil-called-interactively-p)
+ (if (and (called-interactively-p 'any)
(evil-visual-state-p))
(cond
((eq (evil-visual-type) 'line)
@@ -2169,7 +2359,7 @@ the lines."
(evil-visual-rotate 'upper-left)
(prog1 (count-lines evil-visual-beginning evil-visual-end)
(set-mark m)))))))
- (if (and (evil-called-interactively-p)
+ (if (and (called-interactively-p 'any)
(evil-visual-state-p))
(cond
((or (eq (evil-visual-type) 'line)
@@ -2187,6 +2377,7 @@ the lines."
(evil-insert count vcount skip-empty-lines)))
(t
(evil-visual-rotate 'lower-right)
+ (backward-char)
(evil-append count)))
(unless (eolp) (forward-char))
(evil-insert count vcount skip-empty-lines)
@@ -2239,7 +2430,16 @@ non nil it should be number > 0. The insertion will be repeated
in the next VCOUNT - 1 lines below the current one."
(interactive "p")
(push (point) buffer-undo-list)
- (back-to-indentation)
+ (if (and visual-line-mode
+ evil-respect-visual-line-mode)
+ (goto-char
+ (max (save-excursion
+ (back-to-indentation)
+ (point))
+ (save-excursion
+ (beginning-of-visual-line)
+ (point))))
+ (back-to-indentation))
(setq evil-insert-count count
evil-insert-lines nil
evil-insert-vcount
@@ -2256,7 +2456,10 @@ The insertion will be repeated COUNT times. If VCOUNT is non nil
it should be number > 0. The insertion will be repeated in the
next VCOUNT - 1 lines below the current one."
(interactive "p")
- (evil-move-end-of-line)
+ (if (and visual-line-mode
+ evil-respect-visual-line-mode)
+ (evil-end-of-visual-line)
+ (evil-move-end-of-line))
(setq evil-insert-count count
evil-insert-lines nil
evil-insert-vcount
@@ -2307,6 +2510,13 @@ next VCOUNT - 1 lines below the current one."
(setq row nil)))
rows))))
+(defun evil--self-insert-string (string)
+ "Insert STRING as if typed interactively."
+ (let ((chars (append string nil)))
+ (dolist (char chars)
+ (let ((last-command-event char))
+ (self-insert-command 1)))))
+
(defun evil-copy-from-above (arg)
"Copy characters from preceding non-blank line.
The copied text is inserted before point.
@@ -2321,7 +2531,7 @@ See also \\<evil-insert-state-map>\\[evil-copy-from-below]."
(list (prefix-numeric-value current-prefix-arg)))
(t
(list (prefix-numeric-value current-prefix-arg)))))
- (insert (evil-copy-chars-from-line 1 (- arg))))
+ (evil--self-insert-string (evil-copy-chars-from-line arg -1)))
(defun evil-copy-from-below (arg)
"Copy characters from following non-blank line.
@@ -2336,7 +2546,7 @@ See also \\<evil-insert-state-map>\\[evil-copy-from-above]."
(list (prefix-numeric-value current-prefix-arg)))
(t
(list (prefix-numeric-value current-prefix-arg)))))
- (insert (evil-copy-chars-from-line 1 arg)))
+ (evil--self-insert-string (evil-copy-chars-from-line arg 1)))
;; adapted from `copy-from-above-command' in misc.el
(defun evil-copy-chars-from-line (n num &optional col)
@@ -2457,17 +2667,31 @@ for `isearch-forward',\nwhich lists available keys:\n\n%s"
"Repeat the last search."
:jump t
:type exclusive
- (dotimes (var (or count 1))
- (evil-search (if evil-regexp-search
- (car-safe regexp-search-ring)
- (car-safe search-ring))
- isearch-forward evil-regexp-search)))
+ (let ((orig (point))
+ (search-string (if evil-regexp-search
+ (car-safe regexp-search-ring)
+ (car-safe search-ring))))
+ (goto-char
+ ;; Wrap in `save-excursion' so that multiple searches have no visual effect.
+ (save-excursion
+ (evil-search search-string isearch-forward evil-regexp-search)
+ (when (and (> (point) orig)
+ (save-excursion
+ (evil-adjust-cursor)
+ (= (point) orig)))
+ ;; Point won't move after first attempt and `evil-adjust-cursor' takes
+ ;; effect, so start again.
+ (evil-search search-string isearch-forward evil-regexp-search))
+ (point)))
+ (when (and count (> count 1))
+ (dotimes (_ (1- count))
+ (evil-search search-string isearch-forward evil-regexp-search)))))
(evil-define-motion evil-search-previous (count)
"Repeat the last search in the opposite direction."
:jump t
:type exclusive
- (dotimes (var (or count 1))
+ (dotimes (_ (or count 1))
(evil-search (if evil-regexp-search
(car-safe regexp-search-ring)
(car-safe search-ring))
@@ -2479,7 +2703,7 @@ for `isearch-forward',\nwhich lists available keys:\n\n%s"
:type exclusive
(interactive (list (prefix-numeric-value current-prefix-arg)
evil-symbol-word-search))
- (dotimes (var (or count 1))
+ (dotimes (_ (or count 1))
(evil-search-word nil nil symbol)))
(evil-define-motion evil-search-word-forward (count &optional symbol)
@@ -2488,7 +2712,7 @@ for `isearch-forward',\nwhich lists available keys:\n\n%s"
:type exclusive
(interactive (list (prefix-numeric-value current-prefix-arg)
evil-symbol-word-search))
- (dotimes (var (or count 1))
+ (dotimes (_ (or count 1))
(evil-search-word t nil symbol)))
(evil-define-motion evil-search-unbounded-word-backward (count &optional symbol)
@@ -2499,7 +2723,7 @@ The search is unbounded, i.e., the pattern is not wrapped in
:type exclusive
(interactive (list (prefix-numeric-value current-prefix-arg)
evil-symbol-word-search))
- (dotimes (var (or count 1))
+ (dotimes (_ (or count 1))
(evil-search-word nil t symbol)))
(evil-define-motion evil-search-unbounded-word-forward (count &optional symbol)
@@ -2510,46 +2734,59 @@ The search is unbounded, i.e., the pattern is not wrapped in
:type exclusive
(interactive (list (prefix-numeric-value current-prefix-arg)
evil-symbol-word-search))
- (dotimes (var (or count 1))
+ (dotimes (_ (or count 1))
(evil-search-word t t symbol)))
+(defun evil-goto-definition-imenu (string _position)
+ "Find definition for STRING with imenu."
+ (require 'imenu nil t)
+ (let (ientry ipos)
+ (when (fboundp 'imenu--make-index-alist)
+ (ignore-errors (setq ientry (imenu--make-index-alist)))
+ (setq ientry (imenu--in-alist string ientry))
+ (setq ipos (cdr ientry))
+ (when (and (markerp ipos)
+ (eq (marker-buffer ipos) (current-buffer)))
+ (setq ipos (marker-position ipos))
+ (when (numberp ipos)
+ (evil-search (format "\\_<%s\\_>" (regexp-quote string)) t t ipos)
+ t)))))
+
+(defun evil-goto-definition-semantic (_string position)
+ "Find definition for POSITION with semantic."
+ (and (fboundp 'semantic-ia-fast-jump)
+ (ignore-errors (semantic-ia-fast-jump position))))
+
+(declare-function xref-backend-identifier-at-point "xref")
+
+(defun evil-goto-definition-xref (_string position)
+ "Find definition at POSITION with xref."
+ (when (fboundp 'xref-find-definitions)
+ (let ((identifier (save-excursion
+ (goto-char position)
+ (xref-backend-identifier-at-point (xref-find-backend)))))
+ (condition-case ()
+ (xref-find-definitions identifier)
+ (user-error nil)))))
+
+(defun evil-goto-definition-search (string _position)
+ "Find definition for STRING with evil-search."
+ (evil-search (format "\\_<%s\\_>" (regexp-quote string)) t t (point-min))
+ t)
+
(evil-define-motion evil-goto-definition ()
- "Go to definition or first occurrence of symbol under point."
+ "Go to definition or first occurrence of symbol under point.
+See also `evil-goto-definition-functions'."
:jump t
:type exclusive
- (let* ((string (evil-find-symbol t))
- (search (format "\\_<%s\\_>" (regexp-quote string)))
- ientry ipos)
- ;; load imenu if available
- (unless (featurep 'imenu)
- (condition-case nil
- (require 'imenu)
- (error nil)))
+ (let* ((match (evil--find-thing t 'symbol))
+ (string (car match))
+ (position (cdr match)))
(if (null string)
(user-error "No symbol under cursor")
(setq isearch-forward t)
- ;; if imenu is available, try it
- (cond
- ((fboundp 'imenu--make-index-alist)
- (condition-case nil
- (setq ientry (imenu--make-index-alist))
- (error nil))
- (setq ientry (assoc string ientry))
- (setq ipos (cdr ientry))
- (when (and (markerp ipos)
- (eq (marker-buffer ipos) (current-buffer)))
- (setq ipos (marker-position ipos)))
- (cond
- ;; imenu found a position, so go there and
- ;; highlight the occurrence
- ((numberp ipos)
- (evil-search search t t ipos))
- ;; imenu failed, so just go to first occurrence in buffer
- (t
- (evil-search search t t (point-min)))))
- ;; no imenu, so just go to first occurrence in buffer
- (t
- (evil-search search t t (point-min)))))))
+ (run-hook-with-args-until-success 'evil-goto-definition-functions
+ string position))))
;;; Folding
(defun evil-fold-action (list action)
@@ -2565,7 +2802,8 @@ Handler errors will be demoted, so a problem in one handler will (hopefully)
not interfere with another."
(if (null list)
(user-error
- "Folding is not supported for any of these major/minor modes")
+ "Enable one of the following modes for folding to work: %s"
+ (mapconcat 'symbol-name (mapcar 'caar evil-fold-list) ", "))
(let* ((modes (caar list)))
(if (evil--mode-p modes)
(let* ((actions (cdar list))
@@ -2755,14 +2993,14 @@ command."
"Goes to the `count'-th next buffer in the buffer list."
:repeat nil
(interactive "p")
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(next-buffer)))
(evil-define-command evil-prev-buffer (&optional count)
"Goes to the `count'-th prev buffer in the buffer list."
:repeat nil
(interactive "p")
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(previous-buffer)))
(evil-define-command evil-delete-buffer (buffer &optional bang)
@@ -2944,10 +3182,11 @@ If ARG is nil this function calls `recompile', otherwise it calls
:entries
(cl-loop for (key . val) in (evil-register-list)
collect `(nil [,(char-to-string key)
- ,(or (and val
- (stringp val)
- (replace-regexp-in-string "\n" "^J" val))
- "")]))))
+ ,(cond ((stringp val)
+ (replace-regexp-in-string "\n" "^J" val))
+ ((vectorp val)
+ (key-description val))
+ (t ""))]))))
(evil-define-command evil-show-marks (mrks)
"Shows all marks.
@@ -3027,7 +3266,7 @@ If FORCE is non-nil all local marks except 0-9 are removed.
(while (< i n)
(cond
;; skip spaces
- ((= (aref i ?\ )) (cl-incf i))
+ ((= (aref marks i) ?\s) (cl-incf i))
;; ranges of marks
((and (< (+ i 2) n)
(= (aref marks (1+ i)) ?-)
@@ -3210,6 +3449,29 @@ resp. after executing the command."
evil-symbol-word-search))
(evil-ex-start-word-search t 'backward count symbol))
+(defun evil-revert-reveal (open-spots)
+ "Unconditionally close overlays in OPEN-SPOTS in current window.
+Modified version of `reveal-close-old-overlays' from
+reveal.el. OPEN-SPOTS is a local version of `reveal-open-spots'."
+ (dolist (spot open-spots)
+ (let ((window (car spot))
+ (ol (cdr spot)))
+ (unless (eq window (selected-window))
+ (error "evil-revert-reveal: slot with wrong window"))
+ (let* ((inv (overlay-get ol 'reveal-invisible))
+ (open (or (overlay-get ol 'reveal-toggle-invisible)
+ (get inv 'reveal-toggle-invisible)
+ (overlay-get ol 'isearch-open-invisible-temporary))))
+ (if (and (overlay-start ol) ;Check it's still live.
+ open)
+ (condition-case err
+ (funcall open ol t)
+ (error (message "!!Reveal-hide (funcall %s %s t): %s !!"
+ open ol err)))
+ (overlay-put ol 'invisible inv))
+ ;; Remove the overlay from the list of open spots.
+ (overlay-put ol 'reveal-invisible nil)))))
+
(evil-define-operator evil-ex-substitute
(beg end pattern replacement flags)
"The Ex substitute command.
@@ -3225,107 +3487,141 @@ resp. after executing the command."
(setq replacement (or replacement ""))
(setq evil-ex-last-was-search nil)
(let* ((flags (append flags nil))
- (confirm (memq ?c flags))
+ (count-only (memq ?n flags))
+ (confirm (and (memq ?c flags) (not count-only)))
(case-fold-search (evil-ex-pattern-ignore-case pattern))
(case-replace case-fold-search)
- (evil-ex-substitute-regex (evil-ex-pattern-regex pattern)))
+ (evil-ex-substitute-regex (evil-ex-pattern-regex pattern))
+ (evil-ex-substitute-nreplaced 0)
+ (evil-ex-substitute-last-point (point))
+ (whole-line (evil-ex-pattern-whole-line pattern))
+ (evil-ex-substitute-overlay (make-overlay (point) (point)))
+ (orig-point-marker (move-marker (make-marker) (point)))
+ (end-marker (move-marker (make-marker) end))
+ (use-reveal confirm)
+ reveal-open-spots
+ zero-length-match
+ match-contains-newline
+ transient-mark-mode)
(setq evil-ex-substitute-pattern pattern
evil-ex-substitute-replacement replacement
evil-ex-substitute-flags flags
isearch-string evil-ex-substitute-regex)
(isearch-update-ring evil-ex-substitute-regex t)
- (if (evil-ex-pattern-whole-line pattern)
- ;; this one is easy, just use the built-in function
- (perform-replace evil-ex-substitute-regex
- evil-ex-substitute-replacement
- confirm t nil nil nil
- beg
- (if (and (> end (point-min))
- (= (char-after (1- end)) ?\n))
- (1- end)
- end))
- (let ((evil-ex-substitute-nreplaced 0)
- (evil-ex-substitute-last-point (point))
- markers
- transient-mark-mode)
- (save-excursion
+ (unwind-protect
+ (progn
+ (evil-ex-hl-change 'evil-ex-substitute pattern)
+ (overlay-put evil-ex-substitute-overlay 'face 'isearch)
+ (overlay-put evil-ex-substitute-overlay 'priority 1001)
(goto-char beg)
- (beginning-of-line)
- (while (< (point) end)
- (push (move-marker (make-marker) (point)) markers)
- (forward-line)))
- (setq markers (nreverse markers))
- (if confirm
- (let ((evil-ex-substitute-overlay
- (make-overlay (point) (point)))
- (evil-ex-substitute-hl
- (evil-ex-make-hl 'evil-ex-substitute)))
- (evil-ex-hl-change 'evil-ex-substitute pattern)
- (unwind-protect
- ;; this one is more difficult: we have to do
- ;; the highlighting and querying on our own
- (progn
- (overlay-put evil-ex-substitute-overlay
- 'face 'isearch)
- (overlay-put evil-ex-substitute-overlay
- 'priority 1001)
- (map-y-or-n-p
- #'(lambda (x)
- (set-match-data x)
- (move-overlay evil-ex-substitute-overlay
- (match-beginning 0)
- (match-end 0))
- (format "Query replacing %s with %s: "
- (match-string 0)
- (evil-match-substitute-replacement
- evil-ex-substitute-replacement
- (not case-replace))))
- #'(lambda (x)
- (set-match-data x)
- (evil-replace-match evil-ex-substitute-replacement
- (not case-replace))
- (setq evil-ex-substitute-last-point (point))
- (setq evil-ex-substitute-nreplaced
- (1+ evil-ex-substitute-nreplaced))
- (evil-ex-hl-set-region 'evil-ex-substitute
- (save-excursion
- (forward-line)
- (point))
- (evil-ex-hl-get-max
- 'evil-ex-substitute)))
- #'(lambda ()
- (catch 'found
- (while markers
- (let ((m (pop markers)))
- (goto-char m)
- (move-marker m nil))
- (when (re-search-forward evil-ex-substitute-regex
- (line-end-position) t nil)
- (goto-char (match-beginning 0))
- (throw 'found (match-data))))))))
- (evil-ex-delete-hl 'evil-ex-substitute)
- (delete-overlay evil-ex-substitute-overlay)))
-
- ;; just replace the first occurrences per line
- ;; without highlighting and asking
- (while markers
- (let ((m (pop markers)))
- (goto-char m)
- (move-marker m nil))
- (when (re-search-forward evil-ex-substitute-regex
- (line-end-position) t nil)
- (setq evil-ex-substitute-nreplaced
- (1+ evil-ex-substitute-nreplaced))
- (evil-replace-match evil-ex-substitute-replacement
- (not case-replace))
- (setq evil-ex-substitute-last-point (point)))))
-
- (while markers (move-marker (pop markers) nil))
- (goto-char evil-ex-substitute-last-point)
-
- (message "Replaced %d occurrence%s"
- evil-ex-substitute-nreplaced
- (if (/= evil-ex-substitute-nreplaced 1) "s" ""))))
+ (catch 'exit-search
+ (while (re-search-forward evil-ex-substitute-regex end-marker t)
+ (when (not (and query-replace-skip-read-only
+ (text-property-any (match-beginning 0) (match-end 0) 'read-only t)))
+ (let ((match-str (match-string 0))
+ (match-beg (move-marker (make-marker) (match-beginning 0)))
+ (match-end (move-marker (make-marker) (match-end 0)))
+ (match-data (match-data)))
+ (goto-char match-beg)
+ (setq match-contains-newline
+ (string-match-p "\n" (buffer-substring-no-properties
+ match-beg match-end)))
+ (setq zero-length-match (= match-beg match-end))
+ (when (and (string= "^" evil-ex-substitute-regex)
+ (= (point) end-marker))
+ ;; The range (beg end) includes the final newline which means
+ ;; end-marker is on one line down. With the regex "^" the
+ ;; beginning of this last line will be matched which we don't
+ ;; want, so we abort here.
+ (throw 'exit-search t))
+ (setq evil-ex-substitute-last-point match-beg)
+ (if confirm
+ (let ((prompt
+ (format "Replace %s with %s (y/n/a/q/l/^E/^Y)? "
+ match-str
+ (evil-match-substitute-replacement
+ evil-ex-substitute-replacement
+ (not case-replace))))
+ (search-invisible t)
+ response)
+ (move-overlay evil-ex-substitute-overlay match-beg match-end)
+ ;; Simulate `reveal-mode'. `reveal-mode' uses
+ ;; `post-command-hook' but that won't work here.
+ (when use-reveal
+ (reveal-post-command))
+ (catch 'exit-read-char
+ (while (setq response (read-char prompt))
+ (when (member response '(?y ?a ?l))
+ (unless count-only
+ (set-match-data match-data)
+ (evil-replace-match evil-ex-substitute-replacement
+ (not case-replace)))
+ (setq evil-ex-substitute-nreplaced
+ (1+ evil-ex-substitute-nreplaced))
+ (evil-ex-hl-set-region 'evil-ex-substitute
+ (save-excursion
+ (forward-line)
+ (point))
+ (evil-ex-hl-get-max
+ 'evil-ex-substitute)))
+ (cl-case response
+ ((?y ?n) (throw 'exit-read-char t))
+ (?a (setq confirm nil)
+ (throw 'exit-read-char t))
+ ((?q ?l ?\C-\[) (throw 'exit-search t))
+ (?\C-e (evil-scroll-line-down 1))
+ (?\C-y (evil-scroll-line-up 1))))))
+ (setq evil-ex-substitute-nreplaced
+ (1+ evil-ex-substitute-nreplaced))
+ (unless count-only
+ (set-match-data match-data)
+ (evil-replace-match evil-ex-substitute-replacement
+ (not case-replace))))
+ (goto-char match-end)
+ (cond ((>= (point) end-marker)
+ ;; Don't want to perform multiple replacements at the end
+ ;; of the search region.
+ (throw 'exit-search t))
+ ((and (not whole-line)
+ (not match-contains-newline))
+ (forward-line)
+ ;; forward-line just moves to the end of the line on the
+ ;; last line of the buffer.
+ (when (or (eobp)
+ (> (point) end-marker))
+ (throw 'exit-search t)))
+ ;; For zero-length matches check to see if point won't
+ ;; move next time. This is a problem when matching the
+ ;; regexp "$" because we can enter an infinite loop,
+ ;; repeatedly matching the same character
+ ((and zero-length-match
+ (let ((pnt (point)))
+ (save-excursion
+ (and
+ (re-search-forward
+ evil-ex-substitute-regex end-marker t)
+ (= pnt (point))))))
+ (if (or (eobp)
+ (>= (point) end-marker))
+ (throw 'exit-search t)
+ (forward-char)))))))))
+ (evil-ex-delete-hl 'evil-ex-substitute)
+ (delete-overlay evil-ex-substitute-overlay)
+
+ (if count-only
+ (goto-char orig-point-marker)
+ (goto-char evil-ex-substitute-last-point))
+
+ (move-marker orig-point-marker nil)
+ (move-marker end-marker nil)
+
+ (when use-reveal
+ (evil-revert-reveal reveal-open-spots)))
+
+ (message "%s %d occurrence%s"
+ (if count-only "Found" "Replaced")
+ evil-ex-substitute-nreplaced
+ (if (/= evil-ex-substitute-nreplaced 1) "s" ""))
(evil-first-non-blank)))
(evil-define-operator evil-ex-repeat-substitute
@@ -3398,9 +3694,15 @@ This is the same as :%s//~/&"
(user-error "No pattern given"))
(unless command
(user-error "No command given"))
+ ;; TODO: `evil-ex-make-substitute-pattern' should be executed so
+ ;; :substitute can re-use :global's pattern depending on its `r'
+ ;; flag. This isn't supported currently but should be simple to add
(evil-with-single-undo
(let ((case-fold-search
- (eq (evil-ex-regex-case pattern 'smart) 'insensitive))
+ (eq (evil-ex-regex-case pattern evil-ex-search-case) 'insensitive))
+ (command-form (evil-ex-parse command))
+ (transient-mark-mode transient-mark-mode)
+ (deactivate-mark deactivate-mark)
match markers)
(when (and pattern command)
(setq isearch-string pattern)
@@ -3420,7 +3722,7 @@ This is the same as :%s//~/&"
(unwind-protect
(dolist (marker markers)
(goto-char marker)
- (evil-ex-eval command))
+ (eval command-form))
;; ensure that all markers are deleted afterwards,
;; even in the event of failure
(dolist (marker markers)
@@ -3496,6 +3798,7 @@ Default position is the beginning of the buffer."
(message "\"%s\" %d %slines --%s--" file nlines readonly perc)
(message "%d lines --%s--" nlines perc))))
+(defvar sort-fold-case)
(evil-define-operator evil-ex-sort (beg end &optional options reverse)
"The Ex sort command.
\[BEG,END]sort[!] [i][u]
@@ -3538,49 +3841,55 @@ The 'bang' argument means to sort in reverse order."
;;; Window navigation
+(defmacro evil-save-side-windows (&rest body)
+ "Toggle side windows, evaluate BODY, restore side windows."
+ (declare (indent defun) (debug (&rest form)))
+ (let ((sides (make-symbol "sidesvar")))
+ `(let ((,sides (and (functionp 'window-toggle-side-windows)
+ (window-with-parameter 'window-side))))
+ (when ,sides
+ (window-toggle-side-windows))
+ (unwind-protect
+ (progn ,@body)
+ (when ,sides
+ (window-toggle-side-windows))))))
+
(defun evil-resize-window (new-size &optional horizontal)
"Set the current window's width or height to NEW-SIZE.
If HORIZONTAL is non-nil the width of the window is changed,
otherwise its height is changed."
(let ((count (- new-size (if horizontal (window-width) (window-height)))))
- (if (>= emacs-major-version 24)
- (enlarge-window count horizontal)
- (let ((wincfg (current-window-configuration))
- (nwins (length (window-list)))
- (inhibit-redisplay t))
- (catch 'done
- (save-window-excursion
- (while (not (zerop count))
- (if (> count 0)
- (progn
- (enlarge-window 1 horizontal)
- (setq count (1- count)))
- (progn
- (shrink-window 1 horizontal)
- (setq count (1+ count))))
- (if (= nwins (length (window-list)))
- (setq wincfg (current-window-configuration))
- (throw 'done t)))))
- (set-window-configuration wincfg)))))
-
-(defun evil-get-buffer-tree (wintree)
- "Extracts the buffer tree from a given window tree WINTREE."
- (if (consp wintree)
- (cons (car wintree) (mapcar #'evil-get-buffer-tree (cddr wintree)))
- (window-buffer wintree)))
-
-(defun evil-restore-window-tree (win tree)
- "Restore the given buffer-tree layout as subwindows of WIN.
-TREE is the tree layout to be restored."
- (cond
- ((and (consp tree) (cddr tree))
- (let ((newwin (split-window win nil (not (car tree)))))
- (evil-restore-window-tree win (cadr tree))
- (evil-restore-window-tree newwin (cons (car tree) (cddr tree)))))
- ((consp tree)
- (set-window-buffer win (cadr tree)))
- (t
- (set-window-buffer win tree))))
+ (enlarge-window count horizontal)))
+
+(defun evil-move-window (side)
+ "Move the `selected-window' to SIDE.
+The state of the `selected-window' is saved along with the state
+of the window tree consisting of all the other windows. Then, all
+windows are deleted, the remaining window is split according to
+SIDE, the state of the window at SIDE is replaced with the saved
+state of the `selected-window', and, finally, the state of the
+saved window tree is reconstructed on the opposite side.
+
+SIDE has the same meaning as in `split-window'.
+
+Note, this function only operates on the window tree rooted in
+the frame's main window and effectively preserves any side
+windows \(i.e. windows with a valid window-side window
+parameter\)."
+ (evil-save-side-windows
+ (unless (one-window-p)
+ (save-excursion
+ (let ((w (window-state-get (selected-window))))
+ (delete-window)
+ (let ((wtree (window-state-get)))
+ (delete-other-windows)
+ (let ((subwin (selected-window))
+ ;; NOTE: SIDE is new in Emacs 24
+ (newwin (split-window nil nil side)))
+ (window-state-put wtree subwin)
+ (window-state-put w newwin)
+ (select-window newwin)))))
+ (balance-windows))))
(defun evil-alternate-buffer (&optional window)
"Return the last buffer WINDOW has displayed other than the
@@ -3588,7 +3897,7 @@ current one (equivalent to Vim's alternate buffer).
Returns the first item in `window-prev-buffers' that isn't
`window-buffer' of WINDOW."
- ;; If the last buffer visitied has been killed, then `window-prev-buffers'
+ ;; If the last buffer visited has been killed, then `window-prev-buffers'
;; returns a list with `current-buffer' at the head, we account for this
;; possibility.
(let* ((prev-buffers (window-prev-buffers))
@@ -3613,7 +3922,7 @@ the deleted window's parent window are rebalanced."
(delete-window)
(when evil-auto-balance-windows
;; balance-windows raises an error if the parent does not have
- ;; any futher childs (then rebalancing is not necessary anywa)
+ ;; any further children (then rebalancing is not necessary anyway)
(condition-case nil
(balance-windows p)
(error)))))
@@ -3673,28 +3982,28 @@ of the parent of the splitted window are rebalanced."
"Move the cursor to new COUNT-th window left of the current one."
:repeat nil
(interactive "p")
- (dotimes (i count)
+ (dotimes (_ count)
(windmove-left)))
(evil-define-command evil-window-right (count)
"Move the cursor to new COUNT-th window right of the current one."
:repeat nil
(interactive "p")
- (dotimes (i count)
+ (dotimes (_ count)
(windmove-right)))
(evil-define-command evil-window-up (count)
"Move the cursor to new COUNT-th window above the current one."
:repeat nil
(interactive "p")
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(windmove-up)))
(evil-define-command evil-window-down (count)
"Move the cursor to new COUNT-th window below the current one."
:repeat nil
(interactive "p")
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(windmove-down)))
(evil-define-command evil-window-bottom-right ()
@@ -3718,7 +4027,7 @@ of the parent of the splitted window are rebalanced."
(evil-define-command evil-window-mru ()
"Move the cursor to the previous (last accessed) buffer in another window.
-More precisely, it selectes the most recently used buffer that is
+More precisely, it selects the most recently used buffer that is
shown in some other window, preferably of the current frame, and
is different from the current one."
:repeat nil
@@ -3788,7 +4097,7 @@ and opens a new buffer name or edits a certain FILE."
(funcall (default-value 'major-mode)))))))
(evil-define-command evil-buffer-new (count file)
- "Creates a new buffer replacing the current window, optionaly
+ "Creates a new buffer replacing the current window, optionally
editing a certain FILE"
:repeat nil
(interactive "P<f>")
@@ -3859,98 +4168,54 @@ If ARG is empty, maximize the current window height."
(evil-window-decrease-height (- n))))))
(evil-define-command evil-window-rotate-upwards ()
- "Rotates the windows according to the currenty cyclic ordering."
+ "Rotates the windows according to the current cyclic ordering."
:repeat nil
- (let ((wlist (window-list))
- (blist (mapcar #'(lambda (w) (window-buffer w))
- (window-list))))
- (setq blist (append (cdr blist) (list (car blist))))
- (while (and wlist blist)
- (set-window-buffer (car wlist) (car blist))
- (setq wlist (cdr wlist)
- blist (cdr blist)))
- (select-window (car (last (window-list))))))
+ (evil-save-side-windows
+ (let ((wlist (window-list))
+ (slist (mapcar #'window-state-get (window-list))))
+ (setq slist (append (cdr slist) (list (car slist))))
+ (while (and wlist slist)
+ (window-state-put (car slist) (car wlist))
+ (setq wlist (cdr wlist)
+ slist (cdr slist)))
+ (select-window (car (last (window-list)))))))
(evil-define-command evil-window-rotate-downwards ()
- "Rotates the windows according to the currenty cyclic ordering."
+ "Rotates the windows according to the current cyclic ordering."
:repeat nil
- (let ((wlist (window-list))
- (blist (mapcar #'(lambda (w) (window-buffer w))
- (window-list))))
- (setq blist (append (last blist) blist))
- (while (and wlist blist)
- (set-window-buffer (car wlist) (car blist))
- (setq wlist (cdr wlist)
- blist (cdr blist)))
- (select-window (cadr (window-list)))))
+ (evil-save-side-windows
+ (let ((wlist (window-list))
+ (slist (mapcar #'window-state-get (window-list))))
+ (setq slist (append (last slist) slist))
+ (while (and wlist slist)
+ (window-state-put (car slist) (car wlist))
+ (setq wlist (cdr wlist)
+ slist (cdr slist)))
+ (select-window (cadr (window-list))))))
(evil-define-command evil-window-move-very-top ()
"Closes the current window, splits the upper-left one horizontally
and redisplays the current buffer there."
:repeat nil
- (unless (one-window-p)
- (save-excursion
- (let ((b (current-buffer)))
- (delete-window)
- (let ((btree (evil-get-buffer-tree (car (window-tree)))))
- (delete-other-windows)
- (let ((newwin (selected-window))
- (subwin (split-window)))
- (evil-restore-window-tree subwin btree)
- (set-window-buffer newwin b)
- (select-window newwin)))))
- (balance-windows)))
+ (evil-move-window 'above))
(evil-define-command evil-window-move-far-left ()
"Closes the current window, splits the upper-left one vertically
and redisplays the current buffer there."
:repeat nil
- (unless (one-window-p)
- (save-excursion
- (let ((b (current-buffer)))
- (delete-window)
- (let ((btree (evil-get-buffer-tree (car (window-tree)))))
- (delete-other-windows)
- (let ((newwin (selected-window))
- (subwin (split-window-horizontally)))
- (evil-restore-window-tree subwin btree)
- (set-window-buffer newwin b)
- (select-window newwin)))))
- (balance-windows)))
+ (evil-move-window 'left))
(evil-define-command evil-window-move-far-right ()
"Closes the current window, splits the lower-right one vertically
and redisplays the current buffer there."
:repeat nil
- (unless (one-window-p)
- (save-excursion
- (let ((b (current-buffer)))
- (delete-window)
- (let ((btree (evil-get-buffer-tree (car (window-tree)))))
- (delete-other-windows)
- (let ((subwin (selected-window))
- (newwin (split-window-horizontally)))
- (evil-restore-window-tree subwin btree)
- (set-window-buffer newwin b)
- (select-window newwin)))))
- (balance-windows)))
+ (evil-move-window 'right))
(evil-define-command evil-window-move-very-bottom ()
"Closes the current window, splits the lower-right one horizontally
and redisplays the current buffer there."
:repeat nil
- (unless (one-window-p)
- (save-excursion
- (let ((b (current-buffer)))
- (delete-window)
- (let ((btree (evil-get-buffer-tree (car (window-tree)))))
- (delete-other-windows)
- (let ((subwin (selected-window))
- (newwin (split-window)))
- (evil-restore-window-tree subwin btree)
- (set-window-buffer newwin b)
- (select-window newwin)))))
- (balance-windows)))
+ (evil-move-window 'below))
;;; Mouse handling
@@ -3994,7 +4259,8 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
(bounds (window-edges start-window))
(make-cursor-line-fully-visible nil)
(top (nth 1 bounds))
- (bottom (if (window-minibuffer-p start-window)
+ (bottom (if (or (window-minibuffer-p start-window)
+ (not mode-line-format))
(nth 3 bounds)
;; Don't count the mode line.
(1- (nth 3 bounds))))
@@ -4047,7 +4313,7 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
;; Track the mouse until we get a non-movement event.
(track-mouse
(while (progn
- (setq event (read-event))
+ (setq event (read-key))
(or (mouse-movement-p event)
(memq (car-safe event) '(switch-frame select-window))))
(unless (evil-visual-state-p)
@@ -4232,8 +4498,9 @@ if the previous state was Emacs state."
universal-argument-more
universal-argument-other-key)))
`(progn
- (evil-change-state ',evil-state)
- (setq evil-move-cursor-back ',evil-move-cursor-back))
+ (with-current-buffer ,(current-buffer)
+ (evil-change-state ',evil-state)
+ (setq evil-move-cursor-back ',evil-move-cursor-back)))
'post-command-hook)
(setq evil-move-cursor-back nil)
(evil-normal-state)
diff --git a/evil-common.el b/evil-common.el
index 4651db1..7afa99d 100644
--- a/evil-common.el
+++ b/evil-common.el
@@ -1,8 +1,8 @@
-;;; evil-common.el --- Common functions and utilities
+;;; evil-common.el --- Common functions and utilities -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -28,7 +28,7 @@
(require 'evil-digraphs)
(require 'rect)
(require 'thingatpt)
-(eval-when-compile (require 'cl))
+(require 'cl-lib)
;;; Code:
@@ -38,12 +38,6 @@
(declare-function evil-ex-p "evil-ex")
(declare-function evil-set-jump "evil-jumps")
-;;; Compatibility for Emacs 23
-(unless (fboundp 'deactivate-input-method)
- (defalias 'deactivate-input-method 'inactivate-input-method))
-(unless (boundp 'input-method-deactivate-hook)
- (defvaralias 'input-method-deactivate-hook 'input-method-inactivate-hook))
-
(condition-case nil
(require 'windmove)
(error
@@ -53,26 +47,21 @@ window commands not available.")
;;; Compatibility with different Emacs versions
+;; x-set-selection and x-get-selection have been deprecated since 25.1
+;; by gui-set-selection and gui-get-selection
+(defalias 'evil-get-selection
+ (if (fboundp 'gui-get-selection) 'gui-get-selection 'x-get-selection))
+(defalias 'evil-set-selection
+ (if (fboundp 'gui-set-selection) 'gui-set-selection 'x-set-selection))
+
(defmacro evil-called-interactively-p ()
"Wrapper for `called-interactively-p'.
In older versions of Emacs, `called-interactively-p' takes
no arguments. In Emacs 23.2 and newer, it takes one argument."
- (if (version< emacs-version "23.2")
- '(called-interactively-p)
- '(called-interactively-p 'any)))
-
-(unless (fboundp 'region-active-p)
- (defun region-active-p ()
- "Returns t iff region and mark are active."
- (and transient-mark-mode mark-active)))
-
-;; Emacs <23 does not know `characterp'
-(unless (fboundp 'characterp)
- (defalias 'characterp 'char-valid-p))
-
-;; `make-char-table' requires this property in Emacs 22
-(unless (get 'display-table 'char-table-extra-slots)
- (put 'display-table 'char-table-extra-slots 0))
+ (called-interactively-p 'any))
+(make-obsolete 'evil-called-interactively-p
+ "please use (called-interactively-p 'any) instead."
+ "Git commit 222b791")
;; macro helper
(eval-and-compile
@@ -102,6 +91,28 @@ the buffer-local value of HOOK is modified."
;;; List functions
+(defmacro evil--add-to-alist (list-var &rest elements)
+ "Add the assocation of KEY and VAL to the value of LIST-VAR.
+If the list already contains an entry for KEY, update that entry;
+otherwise add at the end of the list.
+
+\(fn LIST-VAR KEY VAL &rest ELEMENTS)"
+ (when (eq (car-safe list-var) 'quote)
+ (setq list-var (cadr list-var)))
+ `(progn
+ ,@(if (version< emacs-version "26")
+ ;; TODO: Remove this path when support for Emacs 25 is dropped
+ (cl-loop for (key val) on elements by #'cddr
+ collect `(let* ((key ,key)
+ (val ,val)
+ (cell (assoc key ,list-var)))
+ (if cell
+ (setcdr cell val)
+ (push (cons key val) ,list-var))))
+ (cl-loop for (key val) on elements by #'cddr
+ collect `(setf (alist-get ,key ,list-var nil nil #'equal) ,val)))
+ ,list-var))
+
(defun evil-add-to-alist (list-var key val &rest elements)
"Add the assocation of KEY and VAL to the value of LIST-VAR.
If the list already contains an entry for KEY, update that entry;
@@ -117,6 +128,10 @@ otherwise add at the end of the list."
(apply #'evil-add-to-alist list-var elements)
(symbol-value list-var))))
+(make-obsolete 'evil-add-to-alist
+ "use `evil--add-to-alist' instead. You may need to recompile code with evil macros."
+ "1.13.1")
+
;; custom version of `delete-if'
(defun evil-filter-list (predicate list &optional pointer)
"Delete by side-effect all items satisfying PREDICATE in LIST.
@@ -167,8 +182,8 @@ Elements are compared with `eq'."
(let (result)
(dolist (sequence sequences)
(dolist (elt sequence)
- (add-to-list 'result elt nil #'eq)))
- (nreverse result)))
+ (push elt result)))
+ (nreverse (cl-remove-duplicates result :test #'eq))))
(defun evil-concat-alists (&rest sequences)
"Concatenate association lists, removing duplicates.
@@ -312,6 +327,7 @@ sorting in between."
\(fn COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)"
(declare (indent defun)
+ (doc-string 3)
(debug (&define name
[&optional lambda-list]
[&optional stringp]
@@ -351,6 +367,7 @@ sorting in between."
`(defun ,command ,args
,@(when doc `(,doc))
,interactive
+ (ignore ,@(cl-set-difference args '(&optional &rest)))
,@body))
,(when (and command doc-form)
`(put ',command 'function-documentation ,doc-form))
@@ -432,7 +449,7 @@ MOTION defaults to the current motion."
(defun evil-declare-motion (command)
"Declare COMMAND to be a movement function.
-This ensures that it behaves correctly in Visual state."
+This ensures that it behaves correctly in visual state."
(evil-add-command-properties command :keep-visual t :repeat 'motion))
(defun evil-declare-repeat (command)
@@ -448,7 +465,8 @@ This ensures that it behaves correctly in Visual state."
(evil-add-command-properties command :repeat 'ignore))
(defun evil-declare-change-repeat (command)
- "Declare COMMAND to be repeatable by buffer changes."
+ "Declare COMMAND to be repeatable by buffer changes rather than
+keystrokes."
(evil-add-command-properties command :repeat 'change))
(defun evil-declare-insert-at-point-repeat (command)
@@ -489,7 +507,7 @@ an empty string."
(zerop (length (substring string idx))))
(push match result))))
(when (and num (< (length result) num))
- (dotimes (i (- num (length result)))
+ (dotimes (_ (- num (length result)))
(push nil result)))
(nreverse result))))
@@ -500,13 +518,13 @@ If any character set is complemented, the result is also complemented."
(let ((bracket "") (complement "") (hyphen "") result)
(save-match-data
(dolist (set sets)
- (when (string-match "^\\^" set)
+ (when (string-match-p "^\\^" set)
(setq set (substring set 1)
complement "^"))
- (when (string-match "^]" set)
+ (when (string-match-p "^]" set)
(setq set (substring set 1)
bracket "]"))
- (when (string-match "^-" set)
+ (when (string-match-p "^-" set)
(setq set (substring set 1)
hyphen "-"))
(setq result (concat result set)))
@@ -565,11 +583,14 @@ Translates it according to the input method."
(progn
(define-key new-global-map [menu-bar]
(lookup-key global-map [menu-bar]))
+ (define-key new-global-map [tab-bar]
+ (lookup-key global-map [tab-bar]))
(define-key new-global-map [tool-bar]
(lookup-key global-map [tool-bar]))
- (add-to-list 'new-global-map
- (make-char-table 'display-table
- 'self-insert-command) t)
+ (setq new-global-map
+ (append new-global-map
+ (list (make-char-table 'display-table
+ 'self-insert-command))))
(use-global-map new-global-map)
(setq seq (read-key-sequence prompt nil t)
char (aref seq 0)
@@ -632,10 +653,7 @@ HIDE-CHARS characters. HIDE-CHARS defaults to 1."
The type may be overridden with MODIFIER, which may be a type
or a Visual selection as defined by `evil-define-visual-selection'.
Return a list (MOTION COUNT [TYPE])."
- (let ((modifiers '((evil-visual-char . char)
- (evil-visual-line . line)
- (evil-visual-block . block)))
- command prefix)
+ (let (command prefix)
(setq evil-this-type-modified nil)
(unless motion
(while (progn
@@ -742,8 +760,10 @@ has already been started; otherwise TARGET is called."
(setq this-command #'digit-argument)
(call-interactively #'digit-argument))
(t
- (setq this-command #',target)
- (call-interactively #',target)))))))
+ (let ((target (or (command-remapping #',target)
+ #',target)))
+ (setq this-command target)
+ (call-interactively target))))))))
(defun evil-extract-append (file-or-append)
"Return an (APPEND . FILENAME) pair based on FILE-OR-APPEND.
@@ -762,6 +782,13 @@ filename."
(when prompt
(setcdr map (cons prompt (cdr map)))))
+(defun evil-lookup-key (map key)
+ "Returns non-nil value if KEY is bound in MAP."
+ (let ((definition (lookup-key map key)))
+ (if (numberp definition) ; in-band error
+ nil
+ definition)))
+
;;; Display
(defun evil-set-cursor (specs)
@@ -769,7 +796,8 @@ filename."
SPECS may be a cursor type as per `cursor-type', a color
string as passed to `set-cursor-color', a zero-argument
function for changing the cursor, or a list of the above."
- (unless (and (listp specs)
+ (unless (and (not (functionp specs))
+ (listp specs)
(null (cdr-safe (last specs))))
(setq specs (list specs)))
(dolist (spec specs)
@@ -867,9 +895,40 @@ Inhibits echo area messages, mode line updates and cursor changes."
`(let ((evil-no-display t))
,@body))
-(defun evil-num-visible-lines ()
- "Returns the number of currently visible lines."
- (- (window-height) 1))
+(defvar evil-cached-header-line-height nil
+ "Cached height of the header line.
+Used for fallback implementation on older Emacsen.")
+
+(defun evil-header-line-height ()
+ "Return the height of the header line.
+If there is no header line, return 0.
+Used as a fallback implementation of `window-header-line-height' on
+older Emacsen."
+ (let ((posn (posn-at-x-y 0 0)))
+ (or (when (eq (posn-area posn) 'header-line)
+ (cdr (posn-object-width-height posn)))
+ 0)))
+
+(defun evil-posn-x-y (position)
+ "Return the x and y coordinates in POSITION.
+This function returns y offset from the top of the buffer area including
+the header line.
+
+On Emacs 24 and later versions, the y-offset returned by
+`posn-at-point' is relative to the text area excluding the header
+line, while y offset taken by `posn-at-x-y' is relative to the buffer
+area including the header line. This asymmetry is by design according
+to GNU Emacs team. This function fixes the asymmetry between them.
+
+Learned from mozc.el."
+ (let ((xy (posn-x-y position)))
+ (when header-line-format
+ (setcdr xy (+ (cdr xy)
+ (or (and (fboundp 'window-header-line-height)
+ (window-header-line-height))
+ evil-cached-header-line-height
+ (setq evil-cached-header-line-height (evil-header-line-height))))))
+ xy))
(defun evil-count-lines (beg end)
"Return absolute line-number-difference betweeen `beg` and `end`.
@@ -976,10 +1035,9 @@ Like `move-end-of-line', but retains the goal column."
(move-end-of-line arg)
(end-of-line)))
-(defun evil-adjust-cursor (&optional force)
+(defun evil-adjust-cursor (&optional _)
"Move point one character back if at the end of a non-empty line.
-This behavior is contingent on the variable `evil-move-cursor-back';
-use the FORCE parameter to override it."
+This behavior is controled by `evil-move-beyond-eol'."
(when (and (eolp)
(not evil-move-beyond-eol)
(not (bolp))
@@ -987,7 +1045,7 @@ use the FORCE parameter to override it."
(save-excursion
(evil-move-end-of-line)
(point))))
- (evil-move-cursor-back force)))
+ (evil-move-cursor-back t)))
(defun evil-move-cursor-back (&optional force)
"Move point one character back within the current line.
@@ -1130,13 +1188,13 @@ This function should be used in forward motions. If `point' is close
to eob so that no further forward motion is possible the error
'end-of-buffer is raised. This is the case if `point' is at
`point-max' or if is one position before `point-max',
-`evil-move-cursor-back' is non-nil and `point' is not at the end
+`evil-move-beyond-eol' is nil and `point' is not at the end
of a line. The latter is necessary because `point' cannot be
-moved to `point-max' if `evil-move-cursor-back' is non-nil and
+moved to `point-max' if `evil-move-beyond-eol' is nil and
the last line in the buffer is not empty."
(when (or (eobp)
(and (not (eolp))
- evil-move-cursor-back
+ (not evil-move-beyond-eol)
(save-excursion (forward-char) (eobp))))
(signal 'end-of-buffer nil)))
@@ -1375,48 +1433,42 @@ match-data reflects the last successful match (that caused COUNT
to reach zero). The behaviour of this functions is similar to
`up-list'."
(let* ((count (or count 1))
- (dir (if (> count 0) +1 -1)))
+ (forwardp (> count 0))
+ (dir (if forwardp +1 -1)))
(catch 'done
(while (not (zerop count))
(let* ((pnt (point))
(cl (save-excursion
- (and (re-search-forward end nil t dir)
+ (and (re-search-forward (if forwardp end beg) nil t dir)
(or (/= pnt (point))
(progn
;; zero size match, repeat search from
;; the next position
(forward-char dir)
- (re-search-forward end nil t dir)))
+ (re-search-forward (if forwardp end beg) nil t dir)))
(point))))
(match (match-data t))
(op (save-excursion
- (and (re-search-forward beg cl t dir)
+ (and (not (equal beg end))
+ (re-search-forward (if forwardp beg end) cl t dir)
(or (/= pnt (point))
(progn
;; zero size match, repeat search from
;; the next position
(forward-char dir)
- (re-search-forward beg cl t dir)))
+ (re-search-forward (if forwardp beg end) cl t dir)))
(point)))))
(cond
- ((and (not op) (not cl))
- (goto-char (if (> dir 0) (point-max) (point-min)))
+ ((not cl)
+ (goto-char (if forwardp (point-max) (point-min)))
(set-match-data nil)
(throw 'done count))
- ((> dir 0)
- (if cl
- (progn
- (setq count (1- count))
- (if (zerop count) (set-match-data match))
- (goto-char cl))
- (setq count (1+ count))
- (goto-char op)))
- ((< dir 0)
+ (t
(if op
(progn
- (setq count (1+ count))
+ (setq count (if forwardp (1+ count) (1- count)))
(goto-char op))
- (setq count (1- count))
+ (setq count (if forwardp (1- count) (1+ count)))
(if (zerop count) (set-match-data match))
(goto-char cl))))))
0)))
@@ -1467,7 +1519,6 @@ motion stops when COUNT reaches zero. The match-data reflects the
last successful match (that caused COUNT to reach zero)."
(let* ((dir (if (> (or count 1) 0) +1 -1))
(count (abs (or count 1)))
- (match (> count 0))
(op (if (> dir 0) 1 2))
(cl (if (> dir 0) 2 1))
(orig (point))
@@ -1541,8 +1592,9 @@ backwards."
(setq reset-parser t))
;; global parser state is out of state, use local one
(let* ((pnt (point))
- (state (progn (beginning-of-defun)
- (parse-partial-sexp (point) pnt nil nil (syntax-ppss))))
+ (state (save-excursion
+ (beginning-of-defun)
+ (parse-partial-sexp (point) pnt nil nil (syntax-ppss))))
(bnd (bounds-of-evil-string-at-point state)))
(when (and bnd (< (point) (cdr bnd)))
;; currently within a string
@@ -1894,7 +1946,7 @@ closer if MOVE is non-nil."
with regard to indentation."
(evil-narrow-to-field
(evil-move-beginning-of-line)
- (insert "\n")
+ (insert (if use-hard-newlines hard-newline "\n"))
(forward-line -1)
(back-to-indentation)))
@@ -1903,7 +1955,7 @@ with regard to indentation."
with regard to indentation."
(evil-narrow-to-field
(evil-move-end-of-line)
- (insert "\n")
+ (insert (if use-hard-newlines hard-newline "\n"))
(back-to-indentation)))
;;; Markers
@@ -1934,11 +1986,11 @@ otherwise, it stays behind."
((evil-global-marker-p char)
(setq alist (default-value 'evil-markers-alist)
marker (make-marker))
- (evil-add-to-alist 'alist char marker)
+ (evil--add-to-alist 'alist char marker)
(setq-default evil-markers-alist alist))
(t
(setq marker (make-marker))
- (evil-add-to-alist 'evil-markers-alist char marker))))
+ (evil--add-to-alist 'evil-markers-alist char marker))))
(add-hook 'kill-buffer-hook #'evil-swap-out-markers nil t)
(set-marker-insertion-type marker advance)
(set-marker marker (or pos (point))))))
@@ -1960,8 +2012,9 @@ or a marker object pointing nowhere."
(when (and (symbolp marker) (boundp marker))
(setq marker (symbol-value marker)))
(when (functionp marker)
- (funcall marker)
- (setq marker (point)))
+ (save-window-excursion
+ (funcall marker)
+ (setq marker (move-marker (make-marker) (point)))))
(when (markerp marker)
(if (eq (marker-buffer marker) (current-buffer))
(setq marker (marker-position marker))
@@ -1983,7 +2036,7 @@ or a marker object pointing nowhere."
(marker-position (cdr entry))))))))
(put 'evil-swap-out-markers 'permanent-local-hook t)
-(defun evil-get-register (register &optional noerror)
+(defun evil-get-register (register &optional _noerror)
"Return contents of REGISTER.
Signal an error if empty, unless NOERROR is non-nil.
@@ -2018,13 +2071,13 @@ The following special registers are supported.
(let ((what (if (eq register ?*) 'PRIMARY 'CLIPBOARD))
(request-type (or (and (boundp 'x-select-request-type)
x-select-request-type)
- '(UTF8_STRING COMPOUNT_TEXT STRING)))
+ '(UTF8_STRING COMPOUND_TEXT STRING)))
text)
(unless (consp request-type)
(setq request-type (list request-type)))
(while (and request-type (not text))
(condition-case nil
- (setq text (x-get-selection what (pop request-type)))
+ (setq text (evil-get-selection what (pop request-type)))
(error nil)))
(when text
(remove-text-properties 0 (length text) '(foreign-selection nil) text))
@@ -2091,11 +2144,43 @@ The following special registers are supported.
(user-error "Register `%c' is empty" register)))
(error (unless err (signal (car err) (cdr err))))))
+(defun evil-append-register (register text)
+ "Append TEXT to the contents of register REGISTER."
+ (let ((content (get-register register)))
+ (cond
+ ((not content)
+ (set-register register text))
+ ((or (text-property-not-all 0 (length content)
+ 'yank-handler nil
+ content)
+ (text-property-not-all 0 (length text)
+ 'yank-handler nil
+ text))
+ ;; some non-trivial yank-handler -> always switch to line handler
+ ;; ensure complete lines
+ (when (and (> (length content) 0)
+ (/= (aref content (1- (length content))) ?\n))
+ (setq content (concat content "\n")))
+ (when (and (> (length text) 0)
+ (/= (aref text (1- (length text))) ?\n))
+ (setq text (concat text "\n")))
+ (setq text (concat content text))
+ (remove-list-of-text-properties 0 (length text) '(yank-handler) text)
+ (setq text (propertize text 'yank-handler '(evil-yank-line-handler)))
+ (set-register register text))
+ (t
+ (set-register register (concat content text))))))
+
(defun evil-set-register (register text)
"Set the contents of register REGISTER to TEXT.
If REGISTER is an upcase character then text is appended to that
register instead of replacing its content."
(cond
+ ((not (characterp register))
+ (user-error "Invalid register"))
+ ;; don't allow modification of read-only registers
+ ((member register '(?: ?. ?%))
+ (user-error "Can't modify read-only register"))
((eq register ?\")
(kill-new text))
((and (<= ?1 register) (<= register ?9))
@@ -2107,49 +2192,28 @@ register instead of replacing its content."
(current-kill (- register ?1))
(setcar kill-ring-yank-pointer text))))
((eq register ?*)
- (x-set-selection 'PRIMARY text))
+ (evil-set-selection 'PRIMARY text))
((eq register ?+)
- (x-set-selection 'CLIPBOARD text))
+ (evil-set-selection 'CLIPBOARD text))
((eq register ?-)
(setq evil-last-small-deletion text))
((eq register ?_) ; the black hole register
nil)
((and (<= ?A register) (<= register ?Z))
- (setq register (downcase register))
- (let ((content (get-register register)))
- (cond
- ((not content)
- (set-register register text))
- ((or (text-property-not-all 0 (length content)
- 'yank-handler nil
- content)
- (text-property-not-all 0 (length text)
- 'yank-handler nil
- text))
- ;; some non-trivial yank-handler -> always switch to line handler
- ;; ensure complete lines
- (when (and (> (length content) 0)
- (/= (aref content (1- (length content))) ?\n))
- (setq content (concat content "\n")))
- (when (and (> (length text) 0)
- (/= (aref text (1- (length text))) ?\n))
- (setq text (concat text "\n")))
- (setq text (concat content text))
- (remove-list-of-text-properties 0 (length text) '(yank-handler) text)
- (setq text (propertize text 'yank-handler '(evil-yank-line-handler)))
- (set-register register text))
- (t
- (set-register register (concat content text))))))
+ (evil-append-register (downcase register) text))
(t
(set-register register text))))
(defun evil-register-list ()
- "Returns an alist of all registers"
+ "Returns an alist of all registers, but only those named
+with number or character. Registers with symbol or string in names are ignored
+to keep Vim compatibility with register jumps."
(sort (append (mapcar #'(lambda (reg)
(cons reg (evil-get-register reg t)))
'(?\" ?* ?+ ?% ?# ?/ ?: ?. ?-
?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
- register-alist nil)
+ (cl-remove-if-not (lambda (reg) (number-or-marker-p (car reg))) register-alist)
+ nil)
#'(lambda (reg1 reg2) (< (car reg1) (car reg2)))))
(defsubst evil-kbd-macro-suppress-motion-error ()
@@ -2183,7 +2247,7 @@ Variables pertaining to Transient Mark mode are listed in
(when (and (boundp var)
(not (assq var evil-transient-vals)))
(push (list var (symbol-value var)
- (and (assq var (buffer-local-variables)) t))
+ (local-variable-p var))
evil-transient-vals)
(make-variable-buffer-local var)
(put var 'permanent-local t))))
@@ -2342,7 +2406,7 @@ be passed via ARGS."
(setq endcol (max endcol
(min eol-col
(1+ (min (1- most-positive-fixnum)
- temporary-goal-column))))))
+ (truncate temporary-goal-column)))))))
;; start looping over lines
(goto-char startpt)
(while (< (point) endpt)
@@ -2443,7 +2507,9 @@ The tracked insertion is set to `evil-last-insertion'."
"Saves the lines in the region BEG and END into the kill-ring."
(let* ((text (filter-buffer-substring beg end))
(yank-handler (list (or yank-handler
- #'evil-yank-line-handler))))
+ #'evil-yank-line-handler)
+ nil
+ t)))
;; Ensure the text ends with a newline. This is required
;; if the deleted lines were the last lines in the buffer.
(when (or (zerop (length text))
@@ -2470,7 +2536,7 @@ The tracked insertion is set to `evil-last-insertion'."
(let* ((yank-handler (list (or yank-handler
#'evil-yank-block-handler)
lines
- nil
+ t
'evil-delete-yanked-rectangle))
(text (propertize (mapconcat #'identity lines "\n")
'yank-handler yank-handler)))
@@ -2481,12 +2547,18 @@ The tracked insertion is set to `evil-last-insertion'."
(unless (eq register ?_)
(kill-new text)))))
+(defun evil-remove-yank-excluded-properties (text)
+ "Removes `yank-excluded-properties' from TEXT."
+ (if (eq yank-excluded-properties t)
+ (set-text-properties 0 (length text) nil text)
+ (remove-list-of-text-properties 0 (length text)
+ yank-excluded-properties text)))
+
(defun evil-yank-line-handler (text)
"Inserts the current text linewise."
(let ((text (apply #'concat (make-list (or evil-paste-count 1) text)))
(opoint (point)))
- (remove-list-of-text-properties
- 0 (length text) yank-excluded-properties text)
+ (evil-remove-yank-excluded-properties text)
(cond
((eq this-command 'evil-paste-before)
(evil-move-beginning-of-line)
@@ -2552,13 +2624,12 @@ The tracked insertion is set to `evil-last-insertion'."
(if (< (evil-column (line-end-position)) col)
(move-to-column (+ col begextra) t)
(move-to-column col t)
- (insert (make-string begextra ? )))
- (remove-list-of-text-properties 0 (length text)
- yank-excluded-properties text)
+ (insert (make-string begextra ?\s)))
+ (evil-remove-yank-excluded-properties text)
(insert text)
(unless (eolp)
;; text follows, so we have to insert spaces
- (insert (make-string endextra ? )))
+ (insert (make-string endextra ?\s)))
(setq epoint (point)))
(forward-line 1)))
(setq evil-last-paste
@@ -2580,7 +2651,7 @@ The tracked insertion is set to `evil-last-insertion'."
(col (if (eq last-command 'evil-paste-after)
(1+ (current-column))
(current-column))))
- (dotimes (i nrows)
+ (dotimes (_ nrows)
(delete-region (save-excursion
(move-to-column col)
(point))
@@ -2948,12 +3019,10 @@ This can be overridden with TYPE."
(defun evil-select-inner-object (thing beg end type &optional count line)
"Return an inner text object range of COUNT objects.
If COUNT is positive, return objects following point; if COUNT is
-negative, return objects preceding point. FORWARD is a function
-which moves to the end of an object, and BACKWARD is a function
-which moves to the beginning. If one is unspecified, the other
-is used with a negative argument. THING is a symbol understood
-by thing-at-point. BEG, END and TYPE specify the current
-selection. If LINE is non-nil, the text object should be
+negative, return objects preceding point. If one is unspecified,
+the other is used with a negative argument. THING is a symbol
+understood by thing-at-point. BEG, END and TYPE specify the
+current selection. If LINE is non-nil, the text object should be
linewise, otherwise it is character wise."
(let* ((count (or count 1))
(bnd (or (let ((b (bounds-of-thing-at-point thing)))
@@ -2980,12 +3049,10 @@ linewise, otherwise it is character wise."
(defun evil-select-an-object (thing beg end type count &optional line)
"Return an outer text object range of COUNT objects.
If COUNT is positive, return objects following point; if COUNT is
-negative, return objects preceding point. FORWARD is a function
-which moves to the end of an object, and BACKWARD is a function
-which moves to the beginning. If one is unspecified, the other
-is used with a negative argument. THING is a symbol understood
-by thing-at-point. BEG, END and TYPE specify the current
-selection. If LINE is non-nil, the text object should be
+negative, return objects preceding point. If one is unspecified,
+the other is used with a negative argument. THING is a symbol
+understood by thing-at-point. BEG, END and TYPE specify the
+current selection. If LINE is non-nil, the text object should be
linewise, otherwise it is character wise."
(let* ((dir (if (> (or count 1) 0) +1 -1))
(count (abs (or count 1)))
@@ -3040,7 +3107,7 @@ linewise, otherwise it is character wise."
;; possibly count current object as selection
(if addcurrent (setq count (1- count)))
;; move
- (dotimes (var count)
+ (dotimes (_ count)
(let ((wsend (evil-bounds-of-not-thing-at-point thing dir)))
(if (and wsend (/= wsend (point)))
;; start with whitespace
@@ -3208,54 +3275,52 @@ must be regular expressions and `evil-up-block' is used.
If the selection is exclusive, whitespace at the end or at the
beginning of the selection until the end-of-line or beginning-of-line
is ignored."
- (lexical-let
- ((open open) (close close))
- ;; we need special linewise exclusive selection
- (unless inclusive (setq inclusive 'exclusive-line))
- (cond
- ((and (characterp open) (characterp close))
- (let ((thing #'(lambda (&optional cnt)
- (evil-up-paren open close cnt)))
- (bnd (or (bounds-of-thing-at-point 'evil-string)
- (bounds-of-thing-at-point 'evil-comment)
- ;; If point is at the opening quote of a string,
- ;; this must be handled as if point is within the
- ;; string, i.e. the selection must be extended
- ;; around the string. Otherwise
- ;; `evil-select-block' might do the wrong thing
- ;; because it accidentally moves point inside the
- ;; string (for inclusive selection) when looking
- ;; for the current surrounding block. (re #364)
- (and (= (point) (or beg (point)))
- (save-excursion
- (goto-char (1+ (or beg (point))))
- (or (bounds-of-thing-at-point 'evil-string)
- (bounds-of-thing-at-point 'evil-comment)))))))
- (if (not bnd)
- (evil-select-block thing beg end type count inclusive)
- (or (evil-with-restriction (car bnd) (cdr bnd)
- (condition-case nil
- (evil-select-block thing beg end type count inclusive)
- (error nil)))
- (save-excursion
- (setq beg (or beg (point))
- end (or end (point)))
- (goto-char (car bnd))
- (let ((extbeg (min beg (car bnd)))
- (extend (max end (cdr bnd))))
- (evil-select-block thing
- extbeg extend
- type
- count
- inclusive
- (or (< extbeg beg) (> extend end))
- t)))))))
- (t
- (evil-select-block #'(lambda (&optional cnt)
- (evil-up-block open close cnt))
- beg end type count inclusive)))))
+ ;; we need special linewise exclusive selection
+ (unless inclusive (setq inclusive 'exclusive-line))
+ (cond
+ ((and (characterp open) (characterp close))
+ (let ((thing #'(lambda (&optional cnt)
+ (evil-up-paren open close cnt)))
+ (bnd (or (bounds-of-thing-at-point 'evil-string)
+ (bounds-of-thing-at-point 'evil-comment)
+ ;; If point is at the opening quote of a string,
+ ;; this must be handled as if point is within the
+ ;; string, i.e. the selection must be extended
+ ;; around the string. Otherwise
+ ;; `evil-select-block' might do the wrong thing
+ ;; because it accidentally moves point inside the
+ ;; string (for inclusive selection) when looking
+ ;; for the current surrounding block. (re #364)
+ (and (= (point) (or beg (point)))
+ (save-excursion
+ (goto-char (1+ (or beg (point))))
+ (or (bounds-of-thing-at-point 'evil-string)
+ (bounds-of-thing-at-point 'evil-comment)))))))
+ (if (not bnd)
+ (evil-select-block thing beg end type count inclusive)
+ (or (evil-with-restriction (car bnd) (cdr bnd)
+ (condition-case nil
+ (evil-select-block thing beg end type count inclusive)
+ (error nil)))
+ (save-excursion
+ (setq beg (or beg (point))
+ end (or end (point)))
+ (goto-char (car bnd))
+ (let ((extbeg (min beg (car bnd)))
+ (extend (max end (cdr bnd))))
+ (evil-select-block thing
+ extbeg extend
+ type
+ count
+ inclusive
+ (or (< extbeg beg) (> extend end))
+ t)))))))
+ (t
+ (evil-select-block #'(lambda (&optional cnt)
+ (evil-up-block open close cnt))
+ beg end type count inclusive))))
-(defun evil-select-quote-thing (thing beg end type count &optional inclusive)
+(defun evil-select-quote-thing (thing beg end _type count &optional inclusive)
"Selection THING as if it described a quoted object.
THING is typically either 'evil-quote or 'evil-chars. This
function is called from `evil-select-quote'."
@@ -3264,7 +3329,6 @@ function is called from `evil-select-quote'."
(dir (if (> count 0) 1 -1))
(bnd (let ((b (bounds-of-thing-at-point thing)))
(and b (< (point) (cdr b)) b)))
- contains-string
addcurrent
wsboth)
(if inclusive (setq inclusive t)
@@ -3437,7 +3501,8 @@ are included. The step is terminated with `evil-end-undo-step'."
(defun evil-end-undo-step (&optional continue)
"End a undo step started with `evil-start-undo-step'.
Adds an undo boundary unless CONTINUE is specified."
- (when (and evil-undo-list-pointer
+ (when (and (listp buffer-undo-list)
+ evil-undo-list-pointer
(not evil-in-single-undo))
(evil-refresh-undo-step)
(unless (or continue (null (car-safe buffer-undo-list)))
@@ -3462,7 +3527,7 @@ is stored in `evil-temporary-undo' instead of `buffer-undo-list'."
(debug t))
`(unwind-protect
(let (buffer-undo-list)
- (prog1
+ (unwind-protect
(progn ,@body)
(setq evil-temporary-undo buffer-undo-list)
;; ensure evil-temporary-undo starts with exactly one undo
@@ -3515,21 +3580,20 @@ in `evil-temporary-undo' instead."
;;; Search
(defun evil-transform-regexp (regexp replacements-alist)
- (let ((pos 0) result)
- (replace-regexp-in-string
- "\\\\+[^\\\\]"
- #'(lambda (txt)
- (let* ((b (match-beginning 0))
- (e (match-end 0))
- (ch (aref txt (1- e)))
- (repl (assoc ch replacements-alist)))
- (if (and repl (zerop (mod (length txt) 2)))
- (concat (substring txt b (- e 2))
- (cdr repl))
- txt)))
- regexp nil t)))
-
-(defun evil-transform-magic (str magic quote transform &optional start)
+ (replace-regexp-in-string
+ "\\\\+[^\\\\]"
+ #'(lambda (txt)
+ (let* ((b (match-beginning 0))
+ (e (match-end 0))
+ (ch (aref txt (1- e)))
+ (repl (assoc ch replacements-alist)))
+ (if (and repl (zerop (mod (length txt) 2)))
+ (concat (substring txt b (- e 2))
+ (cdr repl))
+ txt)))
+ regexp nil t))
+
+(defun evil-transform-magic (str magic quote transform &optional _start)
"Transforms STR with magic characters.
MAGIC is a regexp that matches all potential magic
characters. Each occurence of CHAR as magic character within str
@@ -3624,26 +3688,26 @@ transformations, usually `regexp-quote' or `replace-quote'."
(cons repl str)))))
(defconst evil-vim-regexp-replacements
- '((?n . "\n") (?r . "\r")
- (?t . "\t") (?b . "\b")
- (?s . "[[:space:]]") (?S . "[^[:space:]]")
- (?d . "[[:digit:]]") (?D . "[^[:digit:]]")
- (?x . "[[:xdigit:]]") (?X . "[^[:xdigit:]]")
- (?o . "[0-7]") (?O . "[^0-7]")
- (?a . "[[:alpha:]]") (?A . "[^[:alpha:]]")
- (?l . "[a-z]") (?L . "[^a-z]")
- (?u . "[A-Z]") (?U . "[^A-Z]")
- (?y . "\\s") (?Y . "\\S")
- (?( . "\\(") (?) . "\\)")
- (?{ . "\\{") (?} . "\\}")
- (?[ . "[") (?] . "]")
- (?< . "\\<") (?> . "\\>")
- (?_ . "\\_")
- (?* . "*") (?+ . "+")
- (?? . "?") (?= . "?")
- (?. . ".")
- (?` . "`") (?^ . "^")
- (?$ . "$") (?| . "\\|")))
+ '((?n . "\n") (?r . "\r")
+ (?t . "\t") (?b . "\b")
+ (?s . "[[:space:]]") (?S . "[^[:space:]]")
+ (?d . "[[:digit:]]") (?D . "[^[:digit:]]")
+ (?x . "[[:xdigit:]]") (?X . "[^[:xdigit:]]")
+ (?o . "[0-7]") (?O . "[^0-7]")
+ (?a . "[[:alpha:]]") (?A . "[^[:alpha:]]")
+ (?l . "[a-z]") (?L . "[^a-z]")
+ (?u . "[A-Z]") (?U . "[^A-Z]")
+ (?y . "\\s") (?Y . "\\S")
+ (?\( . "\\(") (?\) . "\\)")
+ (?{ . "\\{") (?} . "\\}")
+ (?\[ . "[") (?\] . "]")
+ (?< . "\\<") (?> . "\\>")
+ (?_ . "\\_")
+ (?* . "*") (?+ . "+")
+ (?? . "?") (?= . "?")
+ (?. . ".")
+ (?` . "`") (?^ . "^")
+ (?$ . "$") (?| . "\\|")))
(defconst evil-regexp-magic "[][(){}<>_dDsSxXoOaAlLuUwWyY.*+?=^$`|nrtb]")
@@ -3846,7 +3910,11 @@ should be left-aligned for left justification."
(entry (elt tabulated-list-entries (1- line))))
(funcall evil-list-view-select-action (nth 1 entry)))))
-(define-key evil-list-view-mode-map (kbd "q") #'kill-this-buffer)
+(defun evil-list-view-quit ()
+ (interactive)
+ (quit-window 'kill))
+
+(define-key evil-list-view-mode-map (kbd "q") #'evil-list-view-quit)
(define-key evil-list-view-mode-map [follow-link] nil) ;; allows mouse-1 to be activated
(define-key evil-list-view-mode-map [mouse-1] #'evil-list-view-goto-entry)
(define-key evil-list-view-mode-map [return] #'evil-list-view-goto-entry)
diff --git a/evil-core.el b/evil-core.el
index 2897d29..79bbd19 100644
--- a/evil-core.el
+++ b/evil-core.el
@@ -1,8 +1,8 @@
-;;; evil-core.el --- Core functionality
+;;; evil-core.el --- Core functionality -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -129,6 +129,9 @@
;; restore the proper value of `major-mode' in Fundamental buffers
(when (eq major-mode 'turn-on-evil-mode)
(setq major-mode 'fundamental-mode))
+ (when (minibufferp)
+ (setq-local evil-default-state 'insert)
+ (setq-local evil-echo-state nil))
;; The initial state is usually setup by `evil-initialize' when
;; the major-mode in a buffer changes. This preliminary
;; initialization is only for the case when `evil-local-mode' is
@@ -170,12 +173,11 @@
(defun evil-initialize ()
"Enable Evil in the current buffer, if appropriate.
To enable Evil globally, do (evil-mode 1)."
- ;; TODO: option for enabling vi keys in the minibuffer
- (unless (minibufferp)
+ (unless (and (minibufferp) (not evil-want-minibuffer))
(evil-local-mode 1)
(evil-initialize-state)))
-;;;###autoload
+;;;###autoload (autoload 'evil-mode "evil" nil t)
(define-globalized-minor-mode evil-mode
evil-local-mode evil-initialize)
@@ -282,24 +284,45 @@ See also `evil-initial-state'."
(when (and (boundp mode) (symbol-value mode))
(when (setq mode (evil-initial-state mode))
(throw 'done mode)))))
- (evil-initial-state major-mode)
+ (evil-initial-state major-mode nil t)
default)))
-(defun evil-initial-state (mode &optional default)
- "Return the Evil state to use for MODE.
+(defun evil-initial-state (mode &optional default follow-parent checked-modes)
+ "Return the Evil state to use for MODE or its alias.
Returns DEFAULT if no initial state is associated with MODE.
The initial state for a mode can be set with
-`evil-set-initial-state'."
- (let (state modes)
- (catch 'done
- (dolist (entry (evil-state-property t :modes) default)
- (setq state (car entry)
- modes (symbol-value (cdr entry)))
- (when (memq mode modes)
- (throw 'done state))))))
+`evil-set-initial-state'.
+
+If FOLLOW-PARENT is non-nil, also check parent modes of MODE and
+its alias. CHECKED-MODES is used internally and should not be set
+initially."
+ (cond
+ ((and mode (symbolp mode) (memq mode checked-modes))
+ (error "Circular reference detected in ancestors of %s\n%s"
+ major-mode checked-modes))
+ ((and mode (symbolp mode))
+ (let ((mode-alias (let ((func (symbol-function mode)))
+ (when (symbolp func)
+ func)))
+ state modes)
+ (or
+ (catch 'done
+ (dolist (entry (evil-state-property t :modes) default)
+ (setq state (car entry)
+ modes (symbol-value (cdr entry)))
+ (when (or (memq mode modes)
+ (and mode-alias
+ (memq mode-alias modes)))
+ (throw 'done state))))
+ (when follow-parent
+ (evil-initial-state (get mode 'derived-mode-parent)
+ nil t (cons mode checked-modes)))
+ (when follow-parent
+ (evil-initial-state (get mode-alias 'derived-mode-parent)
+ nil t (cons mode-alias checked-modes))))))))
(defun evil-set-initial-state (mode state)
- "Set the initial state for MODE to STATE.
+ "Set the initial state for major mode MODE to STATE.
This is the state the buffer comes up in."
(dolist (modes (evil-state-property t :modes))
(setq modes (cdr-safe modes))
@@ -358,6 +381,8 @@ then this function does nothing."
(defun evil-generate-mode-line-tag (&optional state)
"Generate the evil mode-line tag for STATE."
(let ((tag (evil-state-property state :tag t)))
+ (when (functionp tag)
+ (setq tag (funcall tag)))
;; prepare mode-line: add tooltip
(if (stringp tag)
(propertize tag
@@ -456,10 +481,9 @@ This allows input methods to be used in normal-state."
"Initialize a buffer-local value for local keymaps as necessary.
The initial value is that of `make-sparse-keymap'."
(dolist (entry evil-local-keymaps-alist)
- (let ((mode (car entry))
- (map (cdr entry)))
+ (let ((map (cdr entry)))
(unless (and (keymapp (symbol-value map))
- (assq map (buffer-local-variables)))
+ (local-variable-p map))
(set map (make-sparse-keymap))))))
(defun evil-make-overriding-map (keymap &optional state copy)
@@ -476,11 +500,15 @@ higher precedence. See also `evil-make-intercept-map'."
(define-key copy key (or state 'all))
(define-key keymap key copy))))
-(defun evil-make-intercept-map (keymap &optional state)
+(defun evil-make-intercept-map (keymap &optional state aux)
"Give KEYMAP precedence over all Evil keymaps in STATE.
-If STATE is nil, give it precedence over all states.
-See also `evil-make-overriding-map'."
- (let ((key [intercept-state]))
+If STATE is nil, give it precedence over all states. If AUX is non-nil, make the
+auxiliary keymap corresponding to KEYMAP in STATE an intercept keymap instead of
+KEYMAP itself. See also `evil-make-overriding-map'."
+ (let ((key [intercept-state])
+ (keymap (if aux
+ (evil-get-auxiliary-keymap keymap state t t)
+ keymap)))
(define-key keymap key (or state 'all))))
(defmacro evil-define-keymap (keymap doc &rest body)
@@ -499,6 +527,7 @@ may be specified before the body code:
\(fn KEYMAP DOC [[KEY VAL]...] BODY...)"
(declare (indent defun)
+ (doc-string 2)
(debug (&define name
[&optional stringp]
[&rest [keywordp sexp]]
@@ -540,11 +569,11 @@ may be specified before the body code:
,@(if local
`((make-variable-buffer-local ',keymap)
(put ',keymap 'permanent-local t)
- (evil-add-to-alist 'evil-local-keymaps-alist
+ (evil--add-to-alist 'evil-local-keymaps-alist
',mode ',keymap))
- `((evil-add-to-alist 'evil-global-keymaps-alist
+ `((evil--add-to-alist 'evil-global-keymaps-alist
',mode ',keymap)
- (evil-add-to-alist 'evil-mode-map-alist
+ (evil--add-to-alist 'evil-mode-map-alist
',mode ,keymap)))
,(when (or body func)
`(defun ,mode (&optional arg)
@@ -625,7 +654,8 @@ happen when the keymap is accessed from `read-key-sequence'. In
particular, if it is access from `define-key' the returned
mapping will always be the ESC prefix map."
(if (and (not evil-inhibit-esc)
- (or evil-local-mode (evil-ex-p))
+ (or evil-local-mode (evil-ex-p)
+ (active-minibuffer-window))
(not (evil-emacs-state-p))
(let ((keys (this-single-command-keys)))
(and (> (length keys) 0)
@@ -809,7 +839,9 @@ See also `evil-mode-for-keymap'."
(let* ((state (or state evil-state))
result)
(dolist (map (current-active-maps))
- (when (setq map (evil-intercept-keymap-p map state))
+ (when (setq map (or (evil-intercept-keymap-p map state)
+ (evil-intercept-keymap-p
+ (evil-get-auxiliary-keymap map state) state)))
(push (cons (evil-mode-for-keymap map t) map) result)))
(setq result (nreverse result))
result))
@@ -876,14 +908,14 @@ does not already exist."
(defun evil-auxiliary-keymap-p (map)
"Whether MAP is an auxiliary keymap."
(and (keymapp map)
- (string-match "Auxiliary keymap"
- (or (keymap-prompt map) "")) t))
+ (string-match-p "Auxiliary keymap"
+ (or (keymap-prompt map) "")) t))
(defun evil-minor-mode-keymap-p (map)
"Whether MAP is a minor-mode keymap."
(and (keymapp map)
- (string-match "Minor-mode keymap"
- (or (keymap-prompt map) "")) t))
+ (string-match-p "Minor-mode keymap"
+ (or (keymap-prompt map) "")) t))
(defun evil-intercept-keymap-p (map &optional state)
"Whether MAP is an intercept keymap for STATE.
@@ -941,64 +973,166 @@ A return value of t means all states."
(t
state))))
+(defun evil-send-leader ()
+ "Put symbol leader in `unread-command-events' to trigger any
+<leader> bindings."
+ (interactive)
+ (setq prefix-arg current-prefix-arg)
+ (push '(t . leader) unread-command-events))
+
+(defun evil-send-localleader ()
+ "Put symbol localleader in `unread-command-events' to trigger any
+<localleader> bindings."
+ (interactive)
+ (setq prefix-arg current-prefix-arg)
+ (push '(t. localleader) unread-command-events))
+
+(defun evil-set-leader (state key &optional localleader)
+ "Set KEY to trigger leader bindings in STATE.
+KEY should be in the form produced by `kbd'. STATE is one of
+`normal', `insert', `visual', `replace', `operator', `motion',
+`emacs', a list of one or more of these, or `nil', which means
+all of the above. If LOCALLEADER is non-nil, set the local leader
+instead."
+ (let* ((all-states '(normal insert visual replace operator motion emacs))
+ (states (cond ((listp state) state)
+ ((member state all-states) (list state))
+ ((null state) all-states)
+ ;; Maybe throw error here
+ (t (list state))))
+ (binding (if localleader 'evil-send-localleader 'evil-send-leader)))
+ (dolist (state states)
+ (evil-global-set-key state key binding))))
+
(defmacro evil-define-key (state keymap key def &rest bindings)
"Create a STATE binding from KEY to DEF for KEYMAP.
STATE is one of `normal', `insert', `visual', `replace',
`operator', `motion', `emacs', or a list of one or more of
-these. The remaining arguments are like those of
-`define-key'. For example:
+these. Omitting a state by using `nil' corresponds to a standard
+Emacs binding using `define-key'. The remaining arguments are
+like those of `define-key'. For example:
(evil-define-key 'normal foo-map \"a\" 'bar)
-This creates a binding from \"a\" to `bar' in Normal state,
-which is active whenever `foo-map' is active. It is possible
-to specify multiple bindings at once:
+This creates a binding from `a' to `bar' in normal state, which
+is active whenever `foo-map' is active. Using nil for the state,
+the following lead to identical bindings:
- (evil-define-key 'normal foo-map
+ (evil-define-key nil foo-map \"a\" 'bar)
+ (define-key foo-map \"a\" 'bar)
+
+It is possible to specify multiple states and/or bindings at
+once:
+
+ (evil-define-key '(normal visual) foo-map
\"a\" 'bar
\"b\" 'foo)
-If foo-map has not been initialized yet, this macro adds an entry
-to `after-load-functions', delaying execution as necessary."
+If `foo-map' has not been initialized yet, this macro adds an
+entry to `after-load-functions', delaying execution as necessary.
+
+KEYMAP may also be a quoted symbol. If the symbol is `global', the
+global evil keymap corresponding to the state(s) is used, meaning
+the following lead to identical bindings:
+
+ (evil-define-key 'normal 'global \"a\" 'bar)
+ (evil-global-set-key 'normal \"a\" 'bar)
+
+The symbol `local' may also be used, which corresponds to using
+`evil-local-set-key'. If a quoted symbol is used that is not
+`global' or `local', it is assumed to be the name of a minor
+mode, in which case `evil-define-minor-mode-key' is used."
(declare (indent defun))
- `(evil-delay ',(if (symbolp keymap)
- `(and (boundp ',keymap) (keymapp ,keymap))
- `(keymapp ,keymap))
- '(evil-define-key* ,state ,keymap ,key ,def ,@bindings)
- 'after-load-functions t nil
- (format "evil-define-key-in-%s"
- ',(if (symbolp keymap) keymap 'keymap))))
+ (cond ((member keymap '('global 'local))
+ `(evil-define-key* ,state ,keymap ,key ,def ,@bindings))
+ ((and (consp keymap) (eq (car keymap) 'quote))
+ `(evil-define-minor-mode-key ,state ,keymap ,key ,def ,@bindings))
+ (t
+ `(evil-delay ',(if (symbolp keymap)
+ `(and (boundp ',keymap) (keymapp ,keymap))
+ `(keymapp ,keymap))
+ '(condition-case-unless-debug err
+ (evil-define-key* ,state ,keymap ,key ,def ,@bindings)
+ (error
+ (message "error in evil-define-key: %s"
+ (error-message-string err))))
+ 'after-load-functions t nil
+ (format "evil-define-key-in-%s"
+ ',(if (symbolp keymap) keymap 'keymap))))))
(defalias 'evil-declare-key 'evil-define-key)
(defun evil-define-key* (state keymap key def &rest bindings)
"Create a STATE binding from KEY to DEF for KEYMAP.
-STATE is one of `normal', `insert', `visual', `replace',
-`operator', `motion', `emacs', or a list of one or more of these.
+STATE is one of normal, insert, visual, replace, operator,
+motion, emacs, or a list of one or more of these. Omitting a
+state by using nil corresponds to a standard Emacs binding using
+`define-key' The remaining arguments are like those of
+`define-key'. For example:
-The use is identical to `evil-define-key' with the exception that
-this is a function and not a macro (and so will not be expanded
-when compiled which can have unintended
+ (evil-define-key* 'normal foo-map \"a\" 'bar)
+
+This creates a binding from \"a\" to bar in Normal state, which
+is active whenever foo-map is active. Using nil for the state,
+the following are equivalent:
+
+ (evil-define-key* nil foo-map \"a\" 'bar)
+
+ (define-key foo-map \"a\" 'bar)
+
+ It is possible to specify multiple states and/or bindings at
+ once:
+
+ (evil-define-key* '(normal visual) foo-map
+ \"a\" 'bar
+ \"b\" 'foo)
+
+KEYMAP may also be a quoted symbol. If the symbol is global, the
+global evil keymap corresponding to the state(s) is used, meaning
+the following are equivalent:
+
+ (evil-define-key* 'normal 'global \"a\" 'bar)
+
+ (evil-global-set-key 'normal \"a\" 'bar)
+
+The symbol local may also be used, which corresponds to using
+`evil-local-set-key'.
+
+The use is nearly identical to `evil-define-key' with the
+exception that this is a function and not a macro (and so will
+not be expanded when compiled which can have unintended
consequences). `evil-define-key*' also does not defer any
bindings like `evil-define-key' does using `evil-delay'. This
allows errors in the bindings to be caught immediately, and makes
its behavior more predictable."
- (let ((aux-maps
- (cond ((listp state)
- (mapcar
- (lambda (st)
- (evil-get-auxiliary-keymap keymap st t))
- state))
- (state
- (list (evil-get-auxiliary-keymap keymap state t)))
- (t
- (list keymap)))))
+ (let ((maps
+ (if state
+ (mapcar
+ (lambda (st)
+ (cond ((eq keymap 'global)
+ (evil-state-property st :keymap t))
+ ((eq keymap 'local)
+ (evil-state-property st :local-keymap t))
+ (t
+ (evil-get-auxiliary-keymap keymap st t t))))
+ (if (listp state) state (list state)))
+ (list
+ (cond ((eq keymap 'global)
+ global-map)
+ ((eq keymap 'local)
+ ;; see `local-set-key'
+ (or (current-local-map)
+ (let ((map (make-sparse-keymap)))
+ (use-local-map map)
+ map)))
+ (t
+ keymap))))))
(while key
- (dolist (map aux-maps)
+ (dolist (map maps)
(define-key map key def))
(setq key (pop bindings)
def (pop bindings)))
;; ensure the prompt string comes first
- (dolist (map aux-maps)
+ (dolist (map maps)
(evil-set-keymap-prompt map (keymap-prompt map)))))
(defun evil-define-minor-mode-key (state mode key def &rest bindings)
@@ -1015,9 +1149,13 @@ value.
See `evil-define-key' for the usage of STATE, KEY, DEF and
BINDINGS."
(declare (indent defun))
- (let ((map (evil-get-minor-mode-keymap state mode)))
+ (let ((maps (mapcar
+ (lambda (st)
+ (evil-get-minor-mode-keymap st mode))
+ (if (listp state) state (list state)))))
(while key
- (define-key map key def)
+ (dolist (map maps)
+ (define-key map key def))
(setq key (pop bindings)
def (pop bindings)))))
@@ -1056,32 +1194,28 @@ Add additional BINDINGS if specified."
"Define an Evil state STATE.
DOC is a general description and shows up in all docstrings;
the first line of the string should be the full name of the state.
-Then follows one or more optional keywords:
-
-:tag STRING Mode line indicator.
-:message STRING Echo area message when changing to STATE.
-:cursor SPEC Cursor to use in STATE.
-:entry-hook LIST Hooks run when changing to STATE.
-:exit-hook LIST Hooks run when changing from STATE.
-:enable LIST List of other states and modes enabled by STATE.
-:suppress-keymap FLAG If FLAG is non-nil, makes `evil-suppress-map'
- the parent of the global map of STATE,
- effectively disabling bindings to
- `self-insert-command'.
-
-Following the keywords is optional code to be executed each time
-the state is enabled or disabled. For example:
-
- (evil-define-state test
- \"Test state.\"
- :tag \"<T> \"
- (setq test-var t))
+
+BODY is executed each time the state is enabled or disabled.
+
+Optional keyword arguments:
+- `:tag' - the mode line indicator, e.g. \"<T>\".
+- `:message' - string shown in the echo area when the state is
+ activated.
+- `:cursor' - default cursor specification.
+- `:enable' - list of other state keymaps to enable when in this
+ state.
+- `:entry-hook' - list of functions to run when entering this state.
+- `:exit-hook' - list of functions to run when exiting this state.
+- `:suppress-keymap' - if non-nil, effectively disables bindings to
+ `self-insert-command' by making `evil-suppress-map' the parent of
+ the global state keymap.
The global keymap of this state will be `evil-test-state-map',
the local keymap will be `evil-test-state-local-map', and so on.
\(fn STATE DOC [[KEY VAL]...] BODY...)"
(declare (indent defun)
+ (doc-string 2)
(debug (&define name
[&optional stringp]
[&rest [keywordp sexp]]
@@ -1125,7 +1259,7 @@ the local keymap will be `evil-test-state-local-map', and so on.
((eq key :exit-hook)
(setq exit-hook-value arg)
(unless (listp exit-hook-value)
- (setq exit-hook-value (list entry-hook-value))))
+ (setq exit-hook-value (list exit-hook-value))))
((eq key :enable)
(setq enable arg))
((eq key :input-method)
@@ -1213,7 +1347,7 @@ If ARG is nil, don't display a message in the echo area.%s" name doc)
input-method-deactivate-hook)
(evil-change-state nil)
(setq evil-state ',state)
- (evil-add-to-alist 'evil-previous-state-alist
+ (evil--add-to-alist 'evil-previous-state-alist
',state evil-previous-state)
(let ((evil-state ',state))
(evil-normalize-keymaps)
@@ -1229,7 +1363,7 @@ If ARG is nil, don't display a message in the echo area.%s" name doc)
(unless evil-no-display
(evil-refresh-cursor ',state)
(evil-refresh-mode-line ',state)
- (when (evil-called-interactively-p)
+ (when (called-interactively-p 'any)
(redisplay)))
,@body
(run-hooks ',entry-hook)
diff --git a/evil-development.el b/evil-development.el
new file mode 100644
index 0000000..1930be7
--- /dev/null
+++ b/evil-development.el
@@ -0,0 +1,50 @@
+;;; evil-development.el --- Useful features for Evil developers -*- lexical-binding: t -*-
+
+;; Author: Justin Burkett <justin at burkett dot cc>
+
+;; Version: 1.14.0
+
+;;
+;; This file is NOT part of GNU Emacs.
+
+;;; License:
+
+;; This file is part of Evil.
+;;
+;; Evil is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Evil is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Evil. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Code:
+
+;;; Teach imenu about evil macros
+
+(with-eval-after-load 'lisp-mode
+ (when (boundp 'lisp-imenu-generic-expression)
+ (dolist (macro '("interactive-code"
+ "type"
+ "text-object"
+ "motion"
+ "command"
+ "operator"))
+ (let ((macro-name (format "evil-%s" macro)))
+ (unless (assoc macro-name lisp-imenu-generic-expression)
+ (push (list
+ macro-name
+ (format "^\\s-*(evil-define-%s\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)"
+ macro)
+ 1)
+ lisp-imenu-generic-expression))))))
+
+(provide 'evil-development)
+
+;;; evil-development.el ends here
diff --git a/evil-digraphs.el b/evil-digraphs.el
index 2c3c529..745814e 100644
--- a/evil-digraphs.el
+++ b/evil-digraphs.el
@@ -1,9 +1,9 @@
-;;; evil-digraphs.el --- Digraphs
+;;; evil-digraphs.el --- Digraphs -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
diff --git a/evil-ex.el b/evil-ex.el
index 23a164c..95902f7 100644
--- a/evil-ex.el
+++ b/evil-ex.el
@@ -1,9 +1,9 @@
-;;; evil-ex.el --- Ex-mode
+;;; evil-ex.el --- Ex-mode -*- lexical-binding: nil -*-
;; Author: Frank Fischer <frank fischer at mathematik.tu-chemnitz.de>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -42,6 +42,7 @@
(require 'evil-common)
(require 'evil-states)
+(require 'shell)
;;; Code:
@@ -55,7 +56,7 @@
number)
(command #'evil-ex-parse-command)
(binding
- "[~&*@<>=:]+\\|[[:alpha:]-]+\\|!")
+ "[~&*@<>=:]+\\|[[:alpha:]_]+\\|!")
(emacs-binding
"[[:alpha:]-][[:alnum:][:punct:]-]+")
(bang
@@ -169,7 +170,7 @@ is appended to the line."
(let ((arg (prefix-numeric-value current-prefix-arg)))
(cond ((< arg 0) (setq arg (1+ arg)))
((> arg 0) (setq arg (1- arg))))
- (if (= arg 0) '(".")
+ (if (= arg 0) "."
(format ".,.%+d" arg)))))
evil-ex-initial-input)))
(and (> (length s) 0) s))))
@@ -180,7 +181,7 @@ is appended to the line."
evil-ex-info-string
result)
(minibuffer-with-setup-hook
- #'evil-ex-setup
+ (if initial-input #'evil-ex-setup-and-update #'evil-ex-setup)
(setq result
(read-from-minibuffer
":"
@@ -221,13 +222,20 @@ Otherwise behaves like `delete-backward-char'."
(unless (minibufferp)
(abort-recursive-edit)))
+(defun evil-ex-command-window-execute (config result)
+ (select-window (active-minibuffer-window) t)
+ (set-window-configuration config)
+ (delete-minibuffer-contents)
+ (insert result)
+ (exit-minibuffer))
+
(defun evil-ex-setup ()
"Initialize Ex minibuffer.
This function registers several hooks that are used for the
interactive actions during ex state."
(add-hook 'post-command-hook #'evil-ex-abort)
(add-hook 'after-change-functions #'evil-ex-update nil t)
- (add-hook 'minibuffer-exit-hook #'evil-ex-teardown)
+ (add-hook 'minibuffer-exit-hook #'evil-ex-teardown nil t)
(when evil-ex-previous-command
(add-hook 'pre-command-hook #'evil-ex-remove-default))
(remove-hook 'minibuffer-setup-hook #'evil-ex-setup)
@@ -238,11 +246,16 @@ interactive actions during ex state."
evil-ex-argument-completion-at-point)))
(put 'evil-ex-setup 'permanent-local-hook t)
+(defun evil-ex-setup-and-update ()
+ "Initialize Ex minibuffer with `evil-ex-setup', then call `evil-ex-update'."
+ (evil-ex-setup)
+ (evil-ex-update))
+
(defun evil-ex-teardown ()
"Deinitialize Ex minibuffer.
Clean up everything set up by `evil-ex-setup'."
(remove-hook 'post-command-hook #'evil-ex-abort)
- (remove-hook 'minibuffer-exit-hook #'evil-ex-teardown)
+ (remove-hook 'minibuffer-exit-hook #'evil-ex-teardown t)
(remove-hook 'after-change-functions #'evil-ex-update t)
(when evil-ex-argument-handler
(let ((runner (evil-ex-argument-handler-runner
@@ -373,15 +386,10 @@ in case of incomplete or unknown commands."
(remove-text-properties (minibuffer-prompt-end) (point-max) '(face nil evil))))
(defun evil-ex-command-completion-at-point ()
- (let ((context (evil-ex-syntactic-context (1- (point)))))
- (when (memq 'command context)
- (let ((beg (or (get-text-property 0 'ex-index evil-ex-cmd)
- (point)))
- (end (1+ (or (get-text-property (1- (length evil-ex-cmd))
- 'ex-index
- evil-ex-cmd)
- (1- (point))))))
- (list beg end (evil-ex-completion-table))))))
+ (let ((beg (or (get-text-property 0 'ex-index evil-ex-cmd)
+ (point)))
+ (end (point)))
+ (list beg end (evil-ex-completion-table) :exclusive 'no)))
(defun evil-ex-completion-table ()
(cond
@@ -457,6 +465,13 @@ in case of incomplete or unknown commands."
(defun evil-ex-argument-completion-at-point ()
(let ((context (evil-ex-syntactic-context (1- (point)))))
(when (memq 'argument context)
+ ;; if it's an autoload, load the function; this allows external
+ ;; packages to register autoloaded ex commands which will be
+ ;; loaded when ex argument completion is triggered
+ (let ((binding-definition (symbol-function (evil-ex-binding evil-ex-cmd))))
+ (when (autoloadp binding-definition)
+ (autoload-do-load binding-definition)))
+
(let* ((beg (or (and evil-ex-argument
(get-text-property 0 'ex-index evil-ex-argument))
(point)))
@@ -484,9 +499,9 @@ in case of incomplete or unknown commands."
(if (string-match "^[^][]*\\(\\[\\(.*\\)\\]\\)[^][]*$" cmd)
(let ((abbrev (replace-match "" nil t cmd 1))
(full (replace-match "\\2" nil nil cmd 1)))
- (evil-add-to-alist 'evil-ex-commands full function)
- (evil-add-to-alist 'evil-ex-commands abbrev full))
- (evil-add-to-alist 'evil-ex-commands cmd function))))
+ (evil--add-to-alist 'evil-ex-commands full function)
+ (evil--add-to-alist 'evil-ex-commands abbrev full))
+ (evil--add-to-alist 'evil-ex-commands cmd function))))
(defun evil-ex-make-argument-handler (runner completer)
(list runner completer))
@@ -528,6 +543,7 @@ keywords and function:
or 'update then ARG is the current value of this argument. If
FLAG is 'stop then arg is nil."
(declare (indent defun)
+ (doc-string 2)
(debug (&define name
[&optional stringp]
[&rest [keywordp function-form]])))
@@ -544,7 +560,7 @@ keywords and function:
((eq key :completion-at-point)
(setq completer (cons 'completion-at-point func))))))
`(eval-and-compile
- (evil-add-to-alist
+ (evil--add-to-alist
'evil-ex-argument-types
',arg-type
'(,runner ,completer)))))
@@ -564,9 +580,7 @@ keywords and function:
This function must be called from the :runner function of some
argument handler that requires shell completion."
(when (and (eq flag 'start)
- (not evil-ex-shell-argument-initialized)
- (require 'shell nil t)
- (require 'comint nil t))
+ (not evil-ex-shell-argument-initialized))
(set (make-local-variable 'evil-ex-shell-argument-initialized) t)
(cond
;; Emacs 24
@@ -579,43 +593,13 @@ argument handler that requires shell completion."
'(evil-ex-command-completion-at-point
evil-ex-argument-completion-at-point))))
-;; because this variable is used only for Emacs 23 shell completion,
-;; we put it here instead of "evil-vars.el"
-(defvar evil-ex-shell-argument-range nil
- "Internal helper variable for Emacs 23 shell completion.")
-
-(defun evil-ex-shell-command-completion-at-point ()
- "Completion at point function for shell commands."
- (cond
- ;; Emacs 24
- ((fboundp 'comint-completion-at-point)
- (comint-completion-at-point))
- ;; Emacs 23
- ((fboundp 'minibuffer-complete-shell-command)
- (set (make-local-variable 'evil-ex-shell-argument-range)
- (list (point-min) (point-max)))
- #'(lambda ()
- ;; We narrow the buffer to the argument so
- ;; `minibuffer-complete-shell-command' will correctly detect
- ;; the beginning of the argument. When narrowing the buffer
- ;; to the argument the leading text in the minibuffer will be
- ;; hidden. Therefore we add a dummy overlay which shows that
- ;; text during narrowing.
- (let* ((beg (car evil-ex-shell-argument-range))
- (end (cdr evil-ex-shell-argument-range))
- (prev-text (buffer-substring
- (point-min)
- (car evil-ex-shell-argument-range)))
- (ov (make-overlay beg beg)))
- (overlay-put ov 'before-string prev-text)
- (save-restriction
- (apply #'narrow-to-region evil-ex-shell-argument-range)
- (minibuffer-complete-shell-command))
- (delete-overlay ov))))))
+(define-obsolete-function-alias
+ 'evil-ex-shell-command-completion-at-point
+ 'comint-completion-at-point)
(evil-ex-define-argument-type shell
"Shell argument type, supports completion."
- :completion-at-point evil-ex-shell-command-completion-at-point
+ :completion-at-point comint-completion-at-point
:runner evil-ex-init-shell-argument-completion)
(defun evil-ex-file-or-shell-command-completion-at-point ()
@@ -623,7 +607,7 @@ argument handler that requires shell completion."
(= (char-after (point-min)) ?!))
(save-restriction
(narrow-to-region (1+ (point-min)) (point-max))
- (evil-ex-shell-command-completion-at-point))
+ (comint-completion-at-point))
(list (point-min) (point-max) #'read-file-name-internal)))
(evil-ex-define-argument-type file-or-shell
@@ -664,29 +648,35 @@ works accordingly."
"Replace special symbols in FILE-NAME.
Replaces % by the current file-name,
Replaces # by the alternate file-name in FILE-NAME."
- (let ((current-fname (buffer-file-name))
+ (let ((remote (file-remote-p file-name))
+ (current-fname (buffer-file-name))
(alternate-fname (and (other-buffer)
(buffer-file-name (other-buffer)))))
+ (setq file-name (or (file-remote-p file-name 'localname) file-name))
(when current-fname
+ (setq current-fname (or (file-remote-p current-fname 'localname)
+ current-fname))
(setq file-name
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%\\)"
current-fname file-name
t t 2)))
(when alternate-fname
+ (setq alternate-fname (or (file-remote-p alternate-fname 'localname)
+ alternate-fname))
(setq file-name
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(#\\)"
alternate-fname file-name
t t 2)))
(setq file-name
(replace-regexp-in-string "\\\\\\([#%]\\)"
- "\\1" file-name t)))
+ "\\1" file-name t))
+ (setq file-name (concat remote file-name)))
file-name)
(defun evil-ex-file-arg ()
"Returns the current Ex argument as a file name.
This function interprets special file names like # and %."
- (unless (or (null evil-ex-argument)
- (zerop (length evil-ex-argument)))
+ (unless (zerop (length evil-ex-argument))
(evil-ex-replace-special-filenames evil-ex-argument)))
(defun evil-ex-repeat (count)
@@ -845,14 +835,8 @@ Returns the line number of the match."
NUMBER defaults to 1."
(funcall sign (or number 1)))
-(defun evil-ex-eval (string &optional start)
- "Evaluate STRING as an Ex command.
-START is the start symbol, which defaults to `expression'."
- ;; disable the mark before executing, otherwise the visual region
- ;; may be used as operator range instead of the ex-range
- (let ((form (evil-ex-parse string nil start))
- transient-mark-mode deactivate-mark)
- (eval form)))
+;; function `evil-ex-eval' has been superseded by `evil-ex-parse' plus `eval'
+(make-obsolete 'evil-ex-eval 'evil-ex-parse "1.2.14")
(defun evil-ex-parse (string &optional syntax start)
"Parse STRING as an Ex expression and return an evaluation tree.
@@ -870,15 +854,13 @@ START is the start symbol, which defaults to `expression'."
(when result
(setq command (car-safe result)
string (cdr-safe result))
- ;; check whether the command is followed by a slash and the
- ;; part before the slash is not a known ex binding
- ;; (maybe we should check for other characters, too? But only
- ;; the slash is used commonly in Emacs functions)
+ ;; check whether the parsed command is followed by a slash, dash
+ ;; or number and either the part before is NOT known to be a binding,
+ ;; or the complete string IS known to be a binding
(when (and (> (length string) 0)
- (= (aref string 0) ?/)
- (not (evil-ex-binding command t)))
- ;; if this is the case, assume the slash and all following
- ;; symbol characters form an (Emacs-)command
+ (string-match-p "^[-/[:digit:]]" string)
+ (or (evil-ex-binding (concat command string) t)
+ (not (evil-ex-binding command t))))
(setq result (evil-parser (concat command string)
'emacs-binding
evil-ex-grammar)
@@ -930,6 +912,33 @@ POS defaults to the current position of point."
(when contexts
(nth pos contexts))))
+(defun evil-parser--dexp (obj)
+ "Parse a numerical dollar-sign symbol.
+Given e.g. $4, return 4."
+ (when (symbolp obj)
+ (let ((str (symbol-name obj)))
+ (save-match-data
+ (when (string-match "\\$\\([0-9]+\\)" str)
+ (string-to-number (match-string 1 str)))))))
+
+(defun evil-parser--dval (obj result)
+ "Substitute all dollar-sign symbols in OBJ.
+Each dollar-sign symbol is replaced with the corresponding
+element in RESULT, so that $1 becomes the first element, etc.
+The special value $0 is substituted with the whole list RESULT.
+If RESULT is not a list, all dollar-sign symbols are substituted with
+RESULT."
+ (if (listp obj)
+ (mapcar (lambda (obj) (evil-parser--dval obj result)) obj)
+ (let ((num (evil-parser--dexp obj)))
+ (if num
+ (if (not (listp result))
+ result
+ (if (eq num 0)
+ `(list ,@result)
+ (nth (1- num) result)))
+ obj))))
+
(defun evil-parser (string symbol grammar &optional greedy syntax)
"Parse STRING as a SYMBOL in GRAMMAR.
If GREEDY is non-nil, the whole of STRING must match.
@@ -1127,54 +1136,33 @@ The following symbols have reserved meanings within a grammar:
;; semantic action
(when (and pair func (not syntax))
(setq result (car pair))
- (let* ((dexp
- #'(lambda (obj)
- (when (symbolp obj)
- (let ((str (symbol-name obj)))
- (save-match-data
- (when (string-match "\\$\\([0-9]+\\)" str)
- (string-to-number (match-string 1 str))))))))
- ;; traverse a tree for dollar expressions
- (dval nil)
- (dval
- #'(lambda (obj)
- (if (listp obj)
- (mapcar dval obj)
- (let ((num (funcall dexp obj)))
- (if num
- (if (not (listp result))
- result
- (if (eq num 0)
- `(list ,@result)
- (nth (1- num) result)))
- obj))))))
- (cond
- ((null func)
- (setq result nil))
- ;; lambda function
- ((eq (car-safe func) 'lambda)
- (if (memq symbol '(+ seq))
- (setq result `(funcall ,func ,@result))
- (setq result `(funcall ,func ,result))))
- ;; string replacement
- ((or (stringp func) (stringp (car-safe func)))
- (let* ((symbol (or (car-safe (cdr-safe func))
- (and (boundp 'context) context)
- (car-safe (car-safe grammar))))
- (string (if (stringp func) func (car-safe func))))
- (setq result (car-safe (evil-parser string symbol grammar
- greedy syntax)))))
- ;; dollar expression
- ((funcall dexp func)
- (setq result (funcall dval func)))
- ;; function call
- ((listp func)
- (setq result (funcall dval func)))
- ;; symbol
- (t
- (if (memq symbol '(+ seq))
- (setq result `(,func ,@result))
- (setq result `(,func ,result))))))
+ (cond
+ ((null func)
+ (setq result nil))
+ ;; lambda function
+ ((eq (car-safe func) 'lambda)
+ (if (memq symbol '(+ seq))
+ (setq result `(funcall ,func ,@result))
+ (setq result `(funcall ,func ,result))))
+ ;; string replacement
+ ((or (stringp func) (stringp (car-safe func)))
+ (let* ((symbol (or (car-safe (cdr-safe func))
+ (and (boundp 'context) context)
+ (car-safe (car-safe grammar))))
+ (string (if (stringp func) func (car-safe func))))
+ (setq result (car-safe (evil-parser string symbol grammar
+ greedy syntax)))))
+ ;; dollar expression
+ ((evil-parser--dexp func)
+ (setq result (evil-parser--dval func result)))
+ ;; function call
+ ((listp func)
+ (setq result (evil-parser--dval func result)))
+ ;; symbol
+ (t
+ (if (memq symbol '(+ seq))
+ (setq result `(,func ,@result))
+ (setq result `(,func ,result)))))
(setcar pair result))))
;; weed out incomplete matches
(when pair
diff --git a/evil-integration.el b/evil-integration.el
index a6b5f96..01bd247 100644
--- a/evil-integration.el
+++ b/evil-integration.el
@@ -1,9 +1,9 @@
-;;; evil-integration.el --- Integrate Evil with other modules
+;;; evil-integration.el --- Integrate Evil with other modules -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -25,14 +25,19 @@
;; You should have received a copy of the GNU General Public License
;; along with Evil. If not, see <http://www.gnu.org/licenses/>.
+;;; Commentary:
+
+;; This provides evil integration for various emacs modes.
+;; Additional keybindings (or default state) should go into evil-keybindings.el.
+
+;;; Code:
+
(require 'evil-maps)
(require 'evil-core)
(require 'evil-macros)
(require 'evil-types)
(require 'evil-repeat)
-;;; Code:
-
;;; Evilize some commands
;; unbound keys should be ignored
@@ -90,63 +95,12 @@
(when (fboundp 'evil-repeat-abort)
(evil-repeat-abort)))
-;; etags-select
-;; FIXME: probably etags-select should be recomended in docs
-(eval-after-load 'etags-select
- '(progn
- (define-key evil-motion-state-map "g]" 'etags-select-find-tag-at-point)))
-
-;;; Buffer-menu
-
-(evil-add-hjkl-bindings Buffer-menu-mode-map 'motion)
-
-;; dictionary.el
-
-(evil-add-hjkl-bindings dictionary-mode-map 'motion
- "?" 'dictionary-help ; "h"
- "C-o" 'dictionary-previous) ; "l"
-
-;;; Dired
-
-(eval-after-load 'dired
- '(progn
- ;; use the standard Dired bindings as a base
- (defvar dired-mode-map)
- (evil-make-overriding-map dired-mode-map 'normal)
- (evil-add-hjkl-bindings dired-mode-map 'normal
- "J" 'dired-goto-file ; "j"
- "K" 'dired-do-kill-lines ; "k"
- "r" 'dired-do-redisplay ; "l"
- ;; ":d", ":v", ":s", ":e"
- ";" (lookup-key dired-mode-map ":"))))
-
(eval-after-load 'wdired
'(progn
(add-hook 'wdired-mode-hook #'evil-change-to-initial-state)
(defadvice wdired-change-to-dired-mode (after evil activate)
(evil-change-to-initial-state nil t))))
-;;; ELP
-
-(eval-after-load 'elp
- '(defadvice elp-results (after evil activate)
- (evil-motion-state)))
-
-;;; ERT
-
-(evil-add-hjkl-bindings ert-results-mode-map 'motion)
-
-;;; Info
-
-(evil-add-hjkl-bindings Info-mode-map 'motion
- "0" 'evil-digit-argument-or-evil-beginning-of-line
- (kbd "\M-h") 'Info-help ; "h"
- "\C-t" 'Info-history-back ; "l"
- "\C-o" 'Info-history-back
- " " 'Info-scroll-up
- "\C-]" 'Info-follow-nearest-node
- (kbd "DEL") 'Info-scroll-down)
-
;;; Parentheses
(defadvice show-paren-function (around evil disable)
@@ -184,29 +138,6 @@
(let ((ov (and (boundp ov) (symbol-value ov))))
(when (overlayp ov) (delete-overlay ov))))))))
-;;; Speedbar
-
-(evil-add-hjkl-bindings speedbar-key-map 'motion
- "h" 'backward-char
- "j" 'speedbar-next
- "k" 'speedbar-prev
- "l" 'forward-char
- "i" 'speedbar-item-info
- "r" 'speedbar-refresh
- "u" 'speedbar-up-directory
- "o" 'speedbar-toggle-line-expansion
- (kbd "RET") 'speedbar-edit-line)
-
-;; Ibuffer
-(eval-after-load 'ibuffer
- '(progn
- (defvar ibuffer-mode-map)
- (evil-make-overriding-map ibuffer-mode-map 'normal)
- (evil-define-key 'normal ibuffer-mode-map
- "j" 'evil-next-line
- "k" 'evil-previous-line
- "RET" 'ibuffer-visit-buffer)))
-
;;; Undo tree
(when (and (require 'undo-tree nil t)
(fboundp 'global-undo-tree-mode))
@@ -221,7 +152,7 @@ some buffer, but only if `global-undo-tree-mode' is also
activated."
(when (and (boundp 'global-undo-tree-mode)
global-undo-tree-mode)
- (undo-tree-mode 1)))
+ (turn-on-undo-tree-mode)))
(add-hook 'evil-local-mode-hook #'evil-turn-on-undo-tree-mode)
@@ -356,9 +287,10 @@ activated."
(evil-with-state emacs ad-do-it))
;; ace-jump-mode
-(declare-function 'ace-jump-char-mode "ace-jump-mode")
-(declare-function 'ace-jump-word-mode "ace-jump-mode")
-(declare-function 'ace-jump-line-mode "ace-jump-mode")
+(declare-function ace-jump-char-mode "ext:ace-jump-mode")
+(declare-function ace-jump-word-mode "ext:ace-jump-mode")
+(declare-function ace-jump-line-mode "ext:ace-jump-mode")
+(defvar ace-jump-mode-scope)
(defvar evil-ace-jump-active nil)
@@ -466,19 +398,21 @@ the mark and entering `recursive-edit'."
(define-key evil-motion-state-map [remap ace-jump-word-mode] #'evil-ace-jump-word-mode)
;;; avy
-(declare-function 'avy-goto-word-or-subword-1 "avy")
-(declare-function 'avy-goto-line "avy")
-(declare-function 'avy-goto-char "avy")
-(declare-function 'avy-goto-char-2 "avy")
-(declare-function 'avy-goto-char-2-above "avy")
-(declare-function 'avy-goto-char-2-below "avy")
-(declare-function 'avy-goto-char-in-line "avy")
-(declare-function 'avy-goto-word-0 "avy")
-(declare-function 'avy-goto-word-1 "avy")
-(declare-function 'avy-goto-word-1-above "avy")
-(declare-function 'avy-goto-word-1-below "avy")
-(declare-function 'avy-goto-subword-0 "avy")
-(declare-function 'avy-goto-subword-1 "avy")
+(declare-function avy-goto-word-or-subword-1 "ext:avy")
+(declare-function avy-goto-line "ext:avy")
+(declare-function avy-goto-char "ext:avy")
+(declare-function avy-goto-char-2 "ext:avy")
+(declare-function avy-goto-char-2-above "ext:avy")
+(declare-function avy-goto-char-2-below "ext:avy")
+(declare-function avy-goto-char-in-line "ext:avy")
+(declare-function avy-goto-word-0 "ext:avy")
+(declare-function avy-goto-word-1 "ext:avy")
+(declare-function avy-goto-word-1-above "ext:avy")
+(declare-function avy-goto-word-1-below "ext:avy")
+(declare-function avy-goto-subword-0 "ext:avy")
+(declare-function avy-goto-subword-1 "ext:avy")
+(declare-function avy-goto-char-timer "ext:avy")
+(defvar avy-all-windows)
(defmacro evil-enclose-avy-for-motion (&rest body)
"Enclose avy to make it suitable for motions.
@@ -496,7 +430,7 @@ Based on `evil-enclose-ace-jump-for-motion'."
(declare (indent defun)
(debug t))
(let ((name (intern (format "evil-%s" command))))
- `(evil-define-motion ,name (_count)
+ `(evil-define-motion ,name (count)
,(format "Evil motion for `%s'." command)
:type ,type
:jump t
@@ -506,34 +440,46 @@ Based on `evil-enclose-ace-jump-for-motion'."
(call-interactively ',command))))))
;; define evil-avy-* motion commands for avy-* commands
-(evil-define-avy-motion avy-goto-word-or-subword-1 exclusive)
-(evil-define-avy-motion avy-goto-line line)
(evil-define-avy-motion avy-goto-char inclusive)
(evil-define-avy-motion avy-goto-char-2 inclusive)
(evil-define-avy-motion avy-goto-char-2-above inclusive)
(evil-define-avy-motion avy-goto-char-2-below inclusive)
(evil-define-avy-motion avy-goto-char-in-line inclusive)
+(evil-define-avy-motion avy-goto-char-timer inclusive)
+(evil-define-avy-motion avy-goto-line line)
+(evil-define-avy-motion avy-goto-line-above line)
+(evil-define-avy-motion avy-goto-line-below line)
+(evil-define-avy-motion avy-goto-subword-0 exclusive)
+(evil-define-avy-motion avy-goto-subword-1 exclusive)
+(evil-define-avy-motion avy-goto-symbol-1 exclusive)
+(evil-define-avy-motion avy-goto-symbol-1-above exclusive)
+(evil-define-avy-motion avy-goto-symbol-1-below exclusive)
(evil-define-avy-motion avy-goto-word-0 exclusive)
(evil-define-avy-motion avy-goto-word-1 exclusive)
(evil-define-avy-motion avy-goto-word-1-above exclusive)
(evil-define-avy-motion avy-goto-word-1-below exclusive)
-(evil-define-avy-motion avy-goto-subword-0 exclusive)
-(evil-define-avy-motion avy-goto-subword-1 exclusive)
+(evil-define-avy-motion avy-goto-word-or-subword-1 exclusive)
;; remap avy-* commands to evil-avy-* commands
-(dolist (command '(avy-goto-word-or-subword-1
- avy-goto-line
- avy-goto-char
+(dolist (command '(avy-goto-char
avy-goto-char-2
avy-goto-char-2-above
avy-goto-char-2-below
avy-goto-char-in-line
+ avy-goto-char-timer
+ avy-goto-line
+ avy-goto-line-above
+ avy-goto-line-below
+ avy-goto-subword-0
+ avy-goto-subword-1
+ avy-goto-symbol-1
+ avy-goto-symbol-1-above
+ avy-goto-symbol-1-below
avy-goto-word-0
avy-goto-word-1
avy-goto-word-1-above
avy-goto-word-1-below
- avy-goto-subword-0
- avy-goto-subword-1))
+ avy-goto-word-or-subword-1))
(define-key evil-motion-state-map
(vector 'remap command) (intern-soft (format "evil-%s" command))))
@@ -543,12 +489,44 @@ Based on `evil-enclose-ace-jump-for-motion'."
'(with-no-warnings
(push 'evil-mode-cmhh mumamo-change-major-mode-no-nos)))
-;;; ag.el
-(eval-after-load 'ag
- '(progn
- (defvar ag-mode-map)
- (add-to-list 'evil-motion-state-modes 'ag-mode)
- (evil-add-hjkl-bindings ag-mode-map 'motion)))
+;; visual-line-mode integration
+(when evil-respect-visual-line-mode
+ (evil-define-command evil-digit-argument-or-evil-beginning-of-visual-line ()
+ :digit-argument-redirection evil-beginning-of-visual-line
+ :keep-visual t
+ :repeat nil
+ (interactive)
+ (cond
+ (current-prefix-arg
+ (setq this-command #'digit-argument)
+ (call-interactively #'digit-argument))
+ (t
+ (setq this-command 'evil-beginning-of-visual-line)
+ (call-interactively 'evil-beginning-of-visual-line))))
+
+ (evil-define-minor-mode-key 'motion 'visual-line-mode
+ "j" 'evil-next-visual-line
+ "gj" 'evil-next-line
+ "k" 'evil-previous-visual-line
+ "gk" 'evil-previous-line
+ "0" 'evil-digit-argument-or-evil-beginning-of-visual-line
+ "g0" 'evil-beginning-of-line
+ "$" 'evil-end-of-visual-line
+ "g$" 'evil-end-of-line
+ "V" 'evil-visual-screen-line))
+
+;;; abbrev.el
+(defun evil-maybe-expand-abbrev ()
+ (when (and abbrev-mode evil-want-abbrev-expand-on-insert-exit)
+ (expand-abbrev)))
+
+(eval-after-load 'abbrev
+ '(add-hook 'evil-insert-state-exit-hook 'evil-maybe-expand-abbrev))
+
+;;; ElDoc
+(eval-after-load 'eldoc
+ '(when (fboundp 'eldoc-add-command-completions)
+ (eldoc-add-command-completions "evil-window-")))
(provide 'evil-integration)
diff --git a/evil-jumps.el b/evil-jumps.el
index 3c194b4..efe031d 100644
--- a/evil-jumps.el
+++ b/evil-jumps.el
@@ -1,8 +1,8 @@
-;;; evil-jumps.el --- Jump list implementation
+;;; evil-jumps.el --- Jump list implementation -*- lexical-binding: t -*-
;; Author: Bailey Ling <bling at live.ca>
-;; Version: 1.2.10
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -24,8 +24,7 @@
;; You should have received a copy of the GNU General Public License
;; along with Evil. If not, see <http://www.gnu.org/licenses/>.
-(eval-when-compile (require 'cl))
-
+(require 'cl-lib)
(require 'evil-core)
(require 'evil-states)
@@ -36,6 +35,11 @@
:prefix "evil-jumps"
:group 'evil)
+(defcustom evil-jumps-cross-buffers t
+ "When non-nil, the jump commands can cross borders between buffers, otherwise the jump commands act only within the current buffer."
+ :type 'boolean
+ :group 'evil-jumps)
+
(defcustom evil-jumps-max-length 100
"The maximum number of jumps to keep track of."
:type 'integer
@@ -129,24 +133,32 @@
nil)))
(ring-elements (evil--jumps-get-window-jump-list))))))
-(defun evil--jumps-jump-to-index (idx)
+(defun evil--jumps-jump (idx shift)
(let ((target-list (evil--jumps-get-window-jump-list)))
- (evil--jumps-message "jumping to %s" idx)
+ (evil--jumps-message "jumping from %s by %s" idx shift)
(evil--jumps-message "target list = %s" target-list)
- (when (and (< idx (ring-length target-list))
- (>= idx 0))
- (run-hooks 'evil-jumps-pre-jump-hook)
- (setf (evil-jumps-struct-idx (evil--jumps-get-current)) idx)
- (let* ((place (ring-ref target-list idx))
- (pos (car place))
- (file-name (cadr place)))
- (setq evil--jumps-jumping t)
- (if (string-match-p evil--jumps-buffer-targets file-name)
- (switch-to-buffer file-name)
- (find-file file-name))
- (setq evil--jumps-jumping nil)
- (goto-char pos)
- (run-hooks 'evil-jumps-post-jump-hook)))))
+ (setq idx (+ idx shift))
+ (let* ((current-file-name (or (buffer-file-name) (buffer-name)))
+ (size (ring-length target-list)))
+ (unless evil-jumps-cross-buffers
+ ;; skip jump marks pointing to other buffers
+ (while (and (< idx size) (>= idx 0)
+ (not (string= current-file-name (cadr (ring-ref target-list idx)))))
+ (setq idx (+ idx shift))))
+ (when (and (< idx size) (>= idx 0))
+ ;; actual jump
+ (run-hooks 'evil-jumps-pre-jump-hook)
+ (let* ((place (ring-ref target-list idx))
+ (pos (car place))
+ (file-name (cadr place)))
+ (setq evil--jumps-jumping t)
+ (if (string-match-p evil--jumps-buffer-targets file-name)
+ (switch-to-buffer file-name)
+ (find-file file-name))
+ (setq evil--jumps-jumping nil)
+ (goto-char pos)
+ (setf (evil-jumps-struct-idx (evil--jumps-get-current)) idx)
+ (run-hooks 'evil-jumps-post-jump-hook))))))
(defun evil--jumps-push ()
"Pushes the current cursor/file position to the jump list."
@@ -189,7 +201,7 @@
:entries (let* ((jumps (evil--jumps-savehist-sync))
(count 0))
(cl-loop for jump in jumps
- collect `(nil [,(number-to-string (incf count))
+ collect `(nil [,(number-to-string (cl-incf count))
,(number-to-string (car jump))
(,(cadr jump))])))
:select-action #'evil--show-jumps-select-action))
@@ -215,7 +227,10 @@ POS defaults to point."
(cl-loop repeat idx
do (ring-remove target-list))
(setf (evil-jumps-struct-idx struct) -1))
- (evil--jumps-push)))
+ (save-excursion
+ (when pos
+ (goto-char pos))
+ (evil--jumps-push))))
(defun evil--jump-backward (count)
(let ((count (or count 1)))
@@ -224,26 +239,29 @@ POS defaults to point."
(idx (evil-jumps-struct-idx struct)))
(evil--jumps-message "jumping back %s" idx)
(when (= idx -1)
- (setq idx (+ idx 1))
+ (setq idx 0)
(setf (evil-jumps-struct-idx struct) 0)
(evil--jumps-push))
- (evil--jumps-jump-to-index (+ idx 1))))))
+ (evil--jumps-jump idx 1)))))
(defun evil--jump-forward (count)
(let ((count (or count 1)))
(evil-motion-loop (nil count)
(let* ((struct (evil--jumps-get-current))
(idx (evil-jumps-struct-idx struct)))
- (evil--jumps-jump-to-index (- idx 1))))))
+ (when (= idx -1)
+ (setq idx 0)
+ (setf (evil-jumps-struct-idx struct) 0)
+ (evil--jumps-push))
+ (evil--jumps-jump idx -1)))))
-(defun evil--jumps-window-configuration-hook (&rest args)
+(defun evil--jumps-window-configuration-hook (&rest _args)
(let* ((window-list (window-list-1 nil nil t))
(existing-window (selected-window))
(new-window (previous-window)))
(when (and (not (eq existing-window new-window))
(> (length window-list) 1))
- (let* ((target-jump-struct (evil--jumps-get-current new-window))
- (target-jump-count (ring-length (evil--jumps-get-jumps target-jump-struct))))
+ (let* ((target-jump-struct (evil--jumps-get-current new-window)))
(if (not (ring-empty-p (evil--jumps-get-jumps target-jump-struct)))
(evil--jumps-message "target window %s already has %s jumps" new-window target-jump-count)
(evil--jumps-message "new target window detected; copying %s to %s" existing-window new-window)
@@ -253,7 +271,7 @@ POS defaults to point."
(setf (evil-jumps-struct-idx target-jump-struct) (evil-jumps-struct-idx source-jump-struct))
(setf (evil-jumps-struct-ring target-jump-struct) (ring-copy source-list)))))))
;; delete obsolete windows
- (maphash (lambda (key val)
+ (maphash (lambda (key _val)
(unless (member key window-list)
(evil--jumps-message "removing %s" key)
(remhash key evil--jumps-window-jumps)))
@@ -271,8 +289,9 @@ POS defaults to point."
(defadvice split-window-internal (before evil-jumps activate)
(evil-set-jump))
-(defadvice find-tag-noselect (before evil-jumps activate)
- (evil-set-jump))
+(eval-after-load 'etags
+ '(defadvice find-tag-noselect (before evil-jumps activate)
+ (evil-set-jump)))
(if (bound-and-true-p savehist-loaded)
(evil--jumps-savehist-load)
diff --git a/evil-keybindings.el b/evil-keybindings.el
new file mode 100644
index 0000000..084a06a
--- /dev/null
+++ b/evil-keybindings.el
@@ -0,0 +1,124 @@
+;;; evil-keybindings.el --- Add some Evil keybindings to other modules -*- lexical-binding: t -*-
+
+;; Author: Vegard Øye <vegard_oye at hotmail.com>
+;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
+
+;; Version: 1.14.0
+
+;;
+;; This file is NOT part of GNU Emacs.
+
+;;; License:
+
+;; This file is part of Evil.
+;;
+;; Evil is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Evil is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Evil. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This provides a set of keybindings for other emacs modes. This also includes
+;; setting up the initial evil state of those other modes.
+
+;;; Code:
+
+(require 'evil-maps)
+(require 'evil-core)
+(require 'evil-macros)
+(require 'evil-types)
+(require 'evil-repeat)
+
+;; etags-select
+;; FIXME: probably etags-select should be recomended in docs
+(eval-after-load 'etags-select
+ '(progn
+ (define-key evil-motion-state-map "g]" 'etags-select-find-tag-at-point)))
+
+;;; Buffer-menu
+
+(evil-add-hjkl-bindings Buffer-menu-mode-map 'motion)
+
+;; dictionary.el
+
+(evil-add-hjkl-bindings dictionary-mode-map 'motion
+ "?" 'dictionary-help ; "h"
+ "C-o" 'dictionary-previous) ; "l"
+
+;;; Dired
+
+(eval-after-load 'dired
+ '(progn
+ ;; use the standard Dired bindings as a base
+ (defvar dired-mode-map)
+ (evil-make-overriding-map dired-mode-map 'normal)
+ (evil-add-hjkl-bindings dired-mode-map 'normal
+ "J" 'dired-goto-file ; "j"
+ "K" 'dired-do-kill-lines ; "k"
+ "r" 'dired-do-redisplay ; "l"
+ ;; ":d", ":v", ":s", ":e"
+ ";" (lookup-key dired-mode-map ":"))))
+
+;;; ERT
+
+(evil-add-hjkl-bindings ert-results-mode-map 'motion)
+
+;;; Info
+
+(evil-add-hjkl-bindings Info-mode-map 'motion
+ "0" 'evil-digit-argument-or-evil-beginning-of-line
+ (kbd "\M-h") 'Info-help ; "h"
+ "\C-t" 'Info-history-back ; "l"
+ "\C-o" 'Info-history-back
+ " " 'Info-scroll-up
+ "\C-]" 'Info-follow-nearest-node
+ (kbd "DEL") 'Info-scroll-down)
+
+;;; Speedbar
+
+(evil-add-hjkl-bindings speedbar-key-map 'motion
+ "h" 'backward-char
+ "j" 'speedbar-next
+ "k" 'speedbar-prev
+ "l" 'forward-char
+ "i" 'speedbar-item-info
+ "r" 'speedbar-refresh
+ "u" 'speedbar-up-directory
+ "o" 'speedbar-toggle-line-expansion
+ (kbd "RET") 'speedbar-edit-line)
+
+;; Ibuffer
+(eval-after-load 'ibuffer
+ '(progn
+ (defvar ibuffer-mode-map)
+ (evil-make-overriding-map ibuffer-mode-map 'normal)
+ (evil-define-key 'normal ibuffer-mode-map
+ "j" 'evil-next-line
+ "k" 'evil-previous-line
+ "RET" 'ibuffer-visit-buffer)))
+
+;;; ag.el
+(eval-after-load 'ag
+ '(progn
+ (defvar ag-mode-map)
+ (add-to-list 'evil-motion-state-modes 'ag-mode)
+ (evil-add-hjkl-bindings ag-mode-map 'motion)))
+
+;;; ELP
+
+(eval-after-load 'elp
+ '(defadvice elp-results (after evil activate)
+ (evil-motion-state)))
+
+(provide 'evil-keybindings)
+
+;;; evil-keybindings.el ends here
diff --git a/evil-macros.el b/evil-macros.el
index 13bff5c..7331ae2 100644
--- a/evil-macros.el
+++ b/evil-macros.el
@@ -1,9 +1,9 @@
-;;; evil-macros.el --- Macros
+;;; evil-macros.el --- Macros -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -44,7 +44,6 @@
The return value is a list (BEG END TYPE)."
(let ((opoint (point))
(omark (mark t))
- (omactive (and (boundp 'mark-active) mark-active))
(obuffer (current-buffer))
(evil-motion-marker (move-marker (make-marker) (point)))
range)
@@ -110,16 +109,28 @@ The return value is a list (BEG END TYPE)."
(move-marker evil-motion-marker nil))))))
(defmacro evil-define-motion (motion args &rest body)
- "Define an motion command MOTION.
+ "Define a motion command MOTION.
+ARGS is a list of arguments. Motions can have any number of
+arguments, but the first (if any) has the predefined meaning of
+count. BODY must execute the motion by moving point.
+
+Optional keyword arguments are:
+- `:type' - determines how the motion works after an operator (one of
+ `inclusive', `line', `block' and `exclusive', or a self-defined
+ motion type)
+- `:jump' - if non-nil, the previous position is stored in the jump
+ list, so that it can be restored with \
+\\<evil-motion-state-map>\\[evil-jump-backward]
\(fn MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)"
(declare (indent defun)
+ (doc-string 3)
(debug (&define name lambda-list
[&optional stringp]
[&rest keywordp sexp]
[&optional ("interactive" [&rest form])]
def-body)))
- (let (arg doc interactive key keys type)
+ (let (arg doc interactive key keys)
(when args
(setq args `(&optional ,@(delq '&optional args))
;; the count is either numerical or nil
@@ -146,7 +157,7 @@ The return value is a list (BEG END TYPE)."
'(and (fboundp 'eldoc-add-command)
(eldoc-add-command ',motion))))
(evil-define-command ,motion (,@args)
- ,@(when doc `(,doc)) ; avoid nil before `interactive'
+ ,@(when doc `(,doc)) ; avoid nil before `interactive'
,@keys
:keep-visual t
(interactive ,@interactive)
@@ -168,8 +179,7 @@ upon reaching the beginning or end of the current line.
(when (save-excursion (goto-char end) (bolp))
(setq end (max beg (1- end))))
;; don't include the newline in Normal state
- (when (and evil-move-cursor-back
- (not evil-move-beyond-eol)
+ (when (and (not evil-move-beyond-eol)
(not (evil-visual-state-p))
(not (evil-operator-state-p)))
(setq end (max beg (1- end))))
@@ -296,7 +306,7 @@ of the object; otherwise it is placed at the end of the object."
(unless (bobp) (backward-char)))
(when (or (evil-normal-state-p)
(evil-motion-state-p))
- (evil-adjust-cursor t)))))
+ (evil-adjust-cursor)))))
((> count 0)
(when (evil-eobp)
(signal 'end-of-buffer nil))
@@ -311,7 +321,7 @@ of the object; otherwise it is placed at the end of the object."
(unless (bobp) (backward-char)))
(when (or (evil-normal-state-p)
(evil-motion-state-p))
- (evil-adjust-cursor t)))))
+ (evil-adjust-cursor)))))
(t
count))))
@@ -356,8 +366,17 @@ the new range."
BODY should return a range (BEG END) to the right of point
if COUNT is positive, and to the left of it if negative.
+Optional keyword arguments:
+- `:type' - determines how the range applies after an operator
+ (`inclusive', `line', `block', and `exclusive', or a self-defined
+ motion type).
+- `:extend-selection' - if non-nil (default), the text object always
+ enlarges the current selection. Otherwise, it replaces the current
+ selection.
+
\(fn OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)"
(declare (indent defun)
+ (doc-string 3)
(debug (&define name lambda-list
[&optional stringp]
[&rest keywordp sexp]
@@ -396,7 +415,7 @@ if COUNT is positive, and to the left of it if negative.
(cond
;; Visual state: extend the current selection
((and (evil-visual-state-p)
- (evil-called-interactively-p))
+ (called-interactively-p 'any))
;; if we are at the beginning of the Visual selection,
;; go to the left (negative COUNT); if at the end,
;; go to the right (positive COUNT)
@@ -443,9 +462,28 @@ if COUNT is positive, and to the left of it if negative.
(defmacro evil-define-operator (operator args &rest body)
"Define an operator command OPERATOR.
+The operator acts on the range of characters BEG through
+END. BODY must execute the operator by potentially manipulating
+the buffer contents, or otherwise causing side effects to happen.
+
+Optional keyword arguments are:
+- `:type' - force the input range to be of a given type (`inclusive',
+ `line', `block', and `exclusive', or a self-defined motion type).
+- `:motion' - use a predetermined motion instead of waiting for one
+ from the keyboard. This does not affect the behavior in visual
+ state, where selection boundaries are always used.
+- `:repeat' - if non-nil (default), then \
+ \\<evil-normal-state-map>\\[evil-repeat] will repeat the
+ operator.
+- `:move-point' - if non-nil (default), the cursor will be moved to
+ the beginning of the range before the body executes
+- `:keep-visual' - if non-nil, the selection is not disabled when the
+ operator is executed in visual state. By default, visual state is
+ exited automatically.
\(fn OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)"
(declare (indent defun)
+ (doc-string 3)
(debug (&define name lambda-list
[&optional stringp]
[&rest keywordp sexp]
@@ -518,7 +556,7 @@ if COUNT is positive, and to the left of it if negative.
(unwind-protect
(let ((evil-inhibit-operator evil-inhibit-operator-value))
(unless (and evil-inhibit-operator
- (evil-called-interactively-p))
+ (called-interactively-p 'any))
,@body))
(setq evil-inhibit-operator-value nil)))))
@@ -527,22 +565,23 @@ if COUNT is positive, and to the left of it if negative.
"Read a motion from the keyboard and return its buffer positions.
The return value is a list (BEG END), or (BEG END TYPE) if
RETURN-TYPE is non-nil."
- (let ((motion (or evil-operator-range-motion
- (when (evil-ex-p) 'evil-line)))
- (type evil-operator-range-type)
- (range (evil-range (point) (point)))
- command count modifier)
+ (let* ((evil-ex-p (and (not (minibufferp)) (evil-ex-p)))
+ (motion (or evil-operator-range-motion
+ (when evil-ex-p 'evil-line)))
+ (type evil-operator-range-type)
+ (range (evil-range (point) (point)))
+ command count)
(setq evil-this-type-modified nil)
(evil-save-echo-area
(cond
;; Ex mode
- ((and (evil-ex-p) evil-ex-range)
+ ((and evil-ex-p evil-ex-range)
(setq range evil-ex-range))
;; Visual selection
- ((and (not (evil-ex-p)) (evil-visual-state-p))
+ ((and (not evil-ex-p) (evil-visual-state-p))
(setq range (evil-visual-range)))
;; active region
- ((and (not (evil-ex-p)) (region-active-p))
+ ((and (not evil-ex-p) (region-active-p))
(setq range (evil-range (region-beginning)
(region-end)
(or evil-this-type 'exclusive))))
@@ -557,7 +596,7 @@ RETURN-TYPE is non-nil."
(setq keys (listify-key-sequence keys))
(dotimes (var (length keys))
(define-key evil-operator-shortcut-map
- (vconcat (nthcdr var keys)) 'evil-line)))
+ (vconcat (nthcdr var keys)) 'evil-line-or-visual-line)))
;; read motion from keyboard
(setq command (evil-read-motion motion)
motion (nth 0 command)
@@ -611,27 +650,26 @@ RETURN-TYPE is non-nil."
(defmacro evil-define-type (type doc &rest body)
"Define type TYPE.
DOC is a general description and shows up in all docstrings.
-It is followed by a list of keywords and functions:
-
-:expand FUNC Expansion function. This function should accept
- two positions in the current buffer, BEG and END,
- and return a pair of expanded buffer positions.
-:contract FUNC The opposite of :expand, optional.
-:one-to-one BOOL Whether expansion is one-to-one. This means that
- :expand followed by :contract always returns the
- original range.
-:normalize FUNC Normalization function, optional. This function should
- accept two unexpanded positions and adjust them before
- expansion. May be used to deal with buffer boundaries.
-:string FUNC Description function. This takes two buffer positions
- and returns a human-readable string, for example,
- \"2 lines\".
+
+Optional keyword arguments:
+- `:expand' - expansion function. This function should accept two
+ positions in the current buffer, BEG and END,and return a pair of
+ expanded buffer positions.
+- `:contract' - the opposite of `:expand'. Optional.
+- `:one-to-one' - non-nil if expansion is one-to-one. This means that
+ `:expand' followed by `:contract' always return the original range.
+- `:normalize' - normalization function. This function should accept
+ two unexpanded positions and adjust them before expansion. May be
+ used to deal with buffer boundaries.
+- `:string' - description function. Takes two buffer positions and
+ returns a human-readable string. For example \"2 lines\"
If further keywords and functions are specified, they are assumed to
-be transformations on buffer positions, like :expand and :contract.
+be transformations on buffer positions, like `:expand' and `:contract'.
\(fn TYPE DOC [[KEY FUNC]...])"
(declare (indent defun)
+ (doc-string 2)
(debug (&define name
[&optional stringp]
[&rest [keywordp function-form]])))
@@ -642,7 +680,7 @@ be transformations on buffer positions, like :expand and :contract.
(while (keywordp (car-safe body))
(setq key (pop body)
val (pop body))
- (if (plist-member plist key) ; not a function
+ (if (plist-member plist key) ; not a function
(setq plist (plist-put plist key val))
(setq func val
sym (intern (replace-regexp-in-string
@@ -653,8 +691,7 @@ be transformations on buffer positions, like :expand and :contract.
string (if (stringp string)
(format "%s\n\n" string) "")
plist (plist-put plist key `',name))
- (add-to-list
- 'defun-forms
+ (push
(cond
((eq key :string)
`(defun ,name (beg end &rest properties)
@@ -708,7 +745,7 @@ with PROPERTIES.\n\n%s%s" sym type string doc)
(setq properties
(evil-concat-plists properties plist))
(apply #'evil-range beg end type properties)))))))
- t)))
+ defun-forms)))
;; :one-to-one requires both or neither of :expand and :contract
(when (plist-get plist :expand)
(setq plist (plist-put plist :one-to-one
diff --git a/evil-maps.el b/evil-maps.el
index 12262c8..0aaea78 100644
--- a/evil-maps.el
+++ b/evil-maps.el
@@ -1,9 +1,9 @@
-;;; evil-maps.el --- Default keymaps
+;;; evil-maps.el --- Default keymaps -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -29,6 +29,7 @@
(require 'evil-ex)
(require 'evil-commands)
(require 'evil-command-window)
+(require 'evil-common)
;;; Code:
@@ -72,6 +73,7 @@
(define-key evil-normal-state-map "gU" 'evil-upcase)
(define-key evil-normal-state-map "gf" 'find-file-at-point)
(define-key evil-normal-state-map "gF" 'evil-find-file-at-point-with-line)
+(define-key evil-normal-state-map "gx" 'browse-url-at-point)
(define-key evil-normal-state-map "g?" 'evil-rot13)
(define-key evil-normal-state-map "g~" 'evil-invert-case)
(define-key evil-normal-state-map "zo" 'evil-open-fold)
@@ -100,6 +102,10 @@
(define-key evil-normal-state-map [remap cua-paste-pop] 'evil-paste-pop)
(define-key evil-normal-state-map [remap yank-pop] 'evil-paste-pop)
+(when (featurep 'tab-bar)
+ (define-key evil-normal-state-map "gt" 'tab-bar-switch-to-next-tab)
+ (define-key evil-normal-state-map "gT" 'tab-bar-switch-to-prev-tab))
+
;; go to last change
(define-key evil-normal-state-map "g;" 'goto-last-change)
(define-key evil-normal-state-map "g," 'goto-last-change-reverse)
@@ -123,6 +129,7 @@
(define-key evil-window-map "n" 'evil-window-new)
(define-key evil-window-map "o" 'delete-other-windows)
(define-key evil-window-map "p" 'evil-window-mru)
+(define-key evil-window-map "q" 'evil-quit)
(define-key evil-window-map "r" 'evil-window-rotate-downwards)
(define-key evil-window-map "R" 'evil-window-rotate-upwards)
(define-key evil-window-map "s" 'evil-window-split)
@@ -206,7 +213,7 @@
(define-key evil-motion-state-map "g^" 'evil-first-non-blank-of-visual-line)
(define-key evil-motion-state-map "gm" 'evil-middle-of-visual-line)
(define-key evil-motion-state-map "g$" 'evil-end-of-visual-line)
-(define-key evil-motion-state-map "g\C-]" 'find-tag)
+(define-key evil-motion-state-map "g\C-]" 'evil-jump-to-tag)
(define-key evil-motion-state-map "{" 'evil-backward-paragraph)
(define-key evil-motion-state-map "}" 'evil-forward-paragraph)
(define-key evil-motion-state-map "#" 'evil-search-word-backward)
@@ -225,6 +232,8 @@
(define-key evil-motion-state-map "])" 'evil-next-close-paren)
(define-key evil-motion-state-map "[{" 'evil-previous-open-brace)
(define-key evil-motion-state-map "]}" 'evil-next-close-brace)
+(define-key evil-motion-state-map "]s" 'evil-next-flyspell-error)
+(define-key evil-motion-state-map "[s" 'evil-prev-flyspell-error)
(define-key evil-motion-state-map "*" 'evil-search-word-forward)
(define-key evil-motion-state-map "g*" 'evil-search-unbounded-word-forward)
(define-key evil-motion-state-map "," 'evil-repeat-find-char-reverse)
@@ -240,7 +249,6 @@
(define-key evil-motion-state-map (kbd "C-6") 'evil-switch-to-windows-last-buffer)
(define-key evil-motion-state-map "\C-]" 'evil-jump-to-tag)
(define-key evil-motion-state-map (kbd "C-b") 'evil-scroll-page-up)
-(define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down)
(define-key evil-motion-state-map (kbd "C-e") 'evil-scroll-line-down)
(define-key evil-motion-state-map (kbd "C-f") 'evil-scroll-page-down)
(define-key evil-motion-state-map (kbd "C-o") 'evil-jump-backward)
@@ -325,6 +333,9 @@
(when evil-want-C-u-scroll
(define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up))
+(when evil-want-C-d-scroll
+ (define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down))
+
;;; Visual state
(define-key evil-visual-state-map "A" 'evil-append)
@@ -368,6 +379,8 @@
,(if evil-want-C-w-delete
'("\C-w" . evil-delete-backward-word)
'("\C-w" . evil-window-map))
+ ,@(when evil-want-C-u-delete
+ '(("\C-u" . evil-delete-back-to-indentation)))
([mouse-2] . mouse-yank-primary))
"Evil's bindings for insert state (for
`evil-insert-state-map'), excluding <delete>, <escape>, and
@@ -390,13 +403,13 @@ included in `evil-insert-state-bindings' by default."
((and remove
(or force
;; Only remove if the default binding has not changed
- (eq (lookup-key evil-insert-state-map (car binding))
+ (eq (evil-lookup-key evil-insert-state-map (car binding))
(cdr binding))))
(define-key evil-insert-state-map (car binding) nil))
((and (null remove)
(or force
;; Check to see that nothing is bound here before adding
- (null (lookup-key evil-insert-state-map (car binding)))))
+ (not (evil-lookup-key evil-insert-state-map (car binding)))))
(define-key evil-insert-state-map (car binding) (cdr binding))))))
(define-key evil-insert-state-map [delete] 'delete-char)
@@ -447,10 +460,10 @@ included in `evil-insert-state-bindings' by default."
(evil-ex-define-cmd "co[py]" 'evil-copy)
(evil-ex-define-cmd "t" "copy")
(evil-ex-define-cmd "m[ove]" 'evil-move)
-(evil-ex-define-cmd "d[elete]" 'evil-delete)
-(evil-ex-define-cmd "y[ank]" 'evil-yank)
+(evil-ex-define-cmd "d[elete]" 'evil-ex-delete)
+(evil-ex-define-cmd "y[ank]" 'evil-ex-yank)
(evil-ex-define-cmd "go[to]" 'evil-goto-char)
-(evil-ex-define-cmd "j[oin]" 'evil-join)
+(evil-ex-define-cmd "j[oin]" 'evil-ex-join)
(evil-ex-define-cmd "le[ft]" 'evil-align-left)
(evil-ex-define-cmd "ri[ght]" 'evil-align-right)
(evil-ex-define-cmd "ce[nter]" 'evil-align-center)
@@ -502,8 +515,14 @@ included in `evil-insert-state-bindings' by default."
(evil-ex-define-cmd "sor[t]" 'evil-ex-sort)
(evil-ex-define-cmd "res[ize]" 'evil-ex-resize)
+(when (featurep 'tab-bar)
+ (evil-ex-define-cmd "tabnew" 'tab-bar-new-tab)
+ (evil-ex-define-cmd "tabn[ext]" 'tab-bar-switch-to-next-tab)
+ (evil-ex-define-cmd "tabp[revious]" 'tab-bar-switch-to-prev-tab))
+
;; search command line
(define-key evil-ex-search-keymap "\d" #'evil-ex-delete-backward-char)
+(define-key evil-ex-search-keymap "\C-f" 'evil-ex-search-command-window)
(define-key evil-ex-search-keymap "\C-r" 'evil-paste-from-register)
(define-key evil-ex-search-keymap "\C-n" 'next-history-element)
(define-key evil-ex-search-keymap "\C-p" 'previous-history-element)
@@ -517,6 +536,7 @@ included in `evil-insert-state-bindings' by default."
(define-key evil-ex-completion-map "\C-b" 'move-beginning-of-line)
(define-key evil-ex-completion-map "\C-c" 'abort-recursive-edit)
(define-key evil-ex-completion-map "\C-d" 'evil-ex-completion)
+(define-key evil-ex-completion-map "\C-f" 'evil-ex-command-window)
(define-key evil-ex-completion-map "\C-g" 'abort-recursive-edit)
(define-key evil-ex-completion-map "\C-k" 'evil-insert-digraph)
(define-key evil-ex-completion-map "\C-l" 'evil-ex-completion)
@@ -539,6 +559,7 @@ included in `evil-insert-state-bindings' by default."
;; evil-read-key
(define-key evil-read-key-map (kbd "ESC") #'keyboard-quit)
(define-key evil-read-key-map (kbd "C-]") #'keyboard-quit)
+(define-key evil-read-key-map (kbd "C-g") #'keyboard-quit)
(define-key evil-read-key-map (kbd "C-q") #'evil-read-quoted-char)
(define-key evil-read-key-map (kbd "C-v") #'evil-read-quoted-char)
(define-key evil-read-key-map (kbd "C-k") #'evil-read-digraph-char)
diff --git a/evil-pkg.el b/evil-pkg.el
index d537191..e423bea 100644
--- a/evil-pkg.el
+++ b/evil-pkg.el
@@ -1,6 +1,8 @@
(define-package
"evil"
- "1.2.12"
+ "1.14.0"
"Extensible Vi layer for Emacs."
- '((undo-tree "0.6.3")
- (goto-chg "1.6")))
+ '((emacs "24.1")
+ (undo-tree "0.6.3")
+ (goto-chg "1.6")
+ (cl-lib "0.5")))
diff --git a/evil-repeat.el b/evil-repeat.el
index 25b7452..2764b8c 100644
--- a/evil-repeat.el
+++ b/evil-repeat.el
@@ -1,9 +1,9 @@
-;;; evil-repeat.el --- Repeat system
+;;; evil-repeat.el --- Repeat system -*- lexical-binding: t -*-
;; Author: Frank Fischer <frank.fischer at mathematik.tu-chemnitz.de>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -61,7 +61,7 @@
;; of all commands that are executed starting and ending in normal
;; state.
;;
-;; Not all commands are recored. There are several commands that are
+;; Not all commands are recorded. There are several commands that are
;; completely ignored and other commands that even abort the currently
;; active recording, e.g., commands that change the current buffer.
;;
@@ -276,7 +276,8 @@ has :repeat nil."
;; called.
(evil-repeat-abort))
;; ignore those commands completely
- ((null repeat-type))
+ ((or (null repeat-type)
+ (evil-mouse-events-p (this-command-keys))))
;; record command
(t
;; In normal-state or visual state, each command is a single
@@ -320,6 +321,16 @@ invoked the current command"
(clear-this-command-keys t)
(setq evil-repeat-keys ""))
+(defun evil-this-command-keys (&optional post-cmd)
+ "Version of `this-command-keys' with finer control over prefix args."
+ (let ((arg (if post-cmd current-prefix-arg prefix-arg)))
+ (vconcat
+ (when (and (numberp arg)
+ ;; Only add prefix if no repeat info recorded yet
+ (null evil-repeat-info))
+ (string-to-vector (number-to-string arg)))
+ (this-single-command-keys))))
+
(defun evil-repeat-keystrokes (flag)
"Repeation recording function for commands that are repeated by keystrokes."
(cond
@@ -327,11 +338,11 @@ invoked the current command"
(when evil-this-register
(evil-repeat-record
`(set evil-this-register ,evil-this-register)))
- (setq evil-repeat-keys (this-command-keys)))
+ (setq evil-repeat-keys (evil-this-command-keys)))
((eq flag 'post)
- (evil-repeat-record (if (zerop (length (this-command-keys)))
+ (evil-repeat-record (if (zerop (length (evil-this-command-keys t)))
evil-repeat-keys
- (this-command-keys)))
+ (evil-this-command-keys t)))
;; erase commands keys to prevent double recording
(evil-clear-command-keys))))
@@ -396,7 +407,7 @@ buffer between (point) and (mark)."
((eq flag 'post)
(remove-hook 'after-change-functions #'evil-repeat-insert-at-point-hook t))))
-(defun evil-repeat-insert-at-point-hook (beg end length)
+(defun evil-repeat-insert-at-point-hook (beg end _length)
(let ((repeat-type (evil-repeat-type this-command t)))
(when (and (evil-repeat-recording-p)
(eq repeat-type 'evil-repeat-insert-at-point)
diff --git a/evil-search.el b/evil-search.el
index db5c604..546b206 100644
--- a/evil-search.el
+++ b/evil-search.el
@@ -1,9 +1,9 @@
-;;; evil-search.el --- Search and substitute
+;;; evil-search.el --- Search and substitute -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -116,7 +116,7 @@ to display in the echo area."
(let ((lazy-highlight-initial-delay 0)
(isearch-search-fun-function 'evil-isearch-function)
(isearch-case-fold-search case-fold-search)
- (disable #'(lambda (&optional arg) (evil-flash-hook t))))
+ (disable #'(lambda (&optional _arg) (evil-flash-hook t))))
(when evil-flash-timer
(cancel-timer evil-flash-timer))
(unless (or (null string)
@@ -173,12 +173,30 @@ Disable anyway if FORCE is t."
(remove-hook 'evil-operator-state-exit-hook #'evil-flash-hook t))
(put 'evil-flash-hook 'permanent-local-hook t)
-(defun evil-search-function (&optional forward regexp-p wrap)
+(defun evil-search-with-predicate (search-fun pred string bound noerror count)
+ "Execute a search with a predicate function.
+SEARCH-FUN is a search function (e.g. `re-search-forward') and
+PREDICATE is a two-argument function satisfying the interface of
+`isearch-filter-predicate', or `nil'. STRING, BOUND, NOERROR and
+COUNT are passed unchanged to SEARCH-FUN. The first match
+satisfying the predicate (or `nil') is returned."
+ (catch 'done
+ (while t
+ (let ((result (funcall search-fun string bound noerror count)))
+ (cond
+ ((not result) (throw 'done nil))
+ ((not pred) (throw 'done result))
+ ((funcall pred (match-beginning 0) (match-end 0)) (throw 'done result)))))))
+
+(defun evil-search-function (&optional forward regexp-p wrap predicate)
"Return a search function.
If FORWARD is nil, search backward, otherwise forward.
If REGEXP-P is non-nil, the input is a regular expression.
If WRAP is non-nil, the search wraps around the top or bottom
-of the buffer."
+of the buffer.
+If PREDICATE is non-nil, it must be a function accepting two
+arguments: the bounds of a match, returning non-nil if that match is
+acceptable."
`(lambda (string &optional bound noerror count)
(let ((start (point))
(search-fun ',(if regexp-p
@@ -189,12 +207,14 @@ of the buffer."
'search-forward
'search-backward)))
result)
- (setq result (funcall search-fun string bound
- ,(if wrap t 'noerror) count))
+ (setq result (evil-search-with-predicate
+ search-fun ,predicate string
+ bound ,(if wrap t 'noerror) count))
(when (and ,wrap (null result))
(goto-char ,(if forward '(point-min) '(point-max)))
(unwind-protect
- (setq result (funcall search-fun string bound noerror count))
+ (setq result (evil-search-with-predicate
+ search-fun ,predicate string bound noerror count))
(unless result
(goto-char start))))
result)))
@@ -202,7 +222,7 @@ of the buffer."
(defun evil-isearch-function ()
"Return a search function for use with isearch.
Based on `isearch-regexp' and `isearch-forward'."
- (evil-search-function isearch-forward evil-regexp-search evil-search-wrap))
+ (evil-search-function isearch-forward evil-regexp-search evil-search-wrap 'isearch-filter-predicate))
(defun evil-search (string forward &optional regexp-p start)
"Search for STRING and highlight matches.
@@ -224,7 +244,7 @@ one more than the current position."
(not (isearch-no-upper-case-p string nil)))
case-fold-search))
(search-func (evil-search-function
- forward regexp-p evil-search-wrap)))
+ forward regexp-p evil-search-wrap 'isearch-filter-predicate)))
;; no text properties, thank you very much
(set-text-properties 0 (length string) nil string)
;; position to search from
@@ -237,13 +257,6 @@ one more than the current position."
(goto-char orig)
(user-error "\"%s\": %s not found"
string (if regexp-p "pattern" "string"))))
- ;; handle opening and closing of invisible area
- (cond
- ((boundp 'isearch-filter-predicates)
- (dolist (pred isearch-filter-predicates)
- (funcall pred (match-beginning 0) (match-end 0))))
- ((boundp 'isearch-filter-predicate)
- (funcall isearch-filter-predicate (match-beginning 0) (match-end 0))))
;; always position point at the beginning of the match
(goto-char (match-beginning 0))
;; determine message for echo area
@@ -261,9 +274,7 @@ one more than the current position."
If FORWARD is nil, search backward, otherwise forward. If SYMBOL
is non-nil then the functions searches for the symbol at point,
otherwise for the word at point."
- (let ((string (car-safe regexp-search-ring))
- (move (if forward #'forward-char #'backward-char))
- (end (if forward #'eobp #'bobp)))
+ (let ((string (car-safe regexp-search-ring)))
(setq isearch-forward forward)
(cond
((and (memq last-command
@@ -286,8 +297,8 @@ otherwise for the word at point."
(evil-push-search-history string forward)
(evil-search string forward t)))))
-(defun evil-find-thing (forward thing)
- "Return THING near point as a string.
+(defun evil--find-thing (forward thing)
+ "Return a cons of THING near point as a string and its position.
THING should be a symbol understood by `thing-at-point',
e.g. 'symbol or 'word. If FORWARD is nil, search backward,
otherwise forward. Returns nil if nothing is found."
@@ -304,7 +315,14 @@ otherwise forward. Returns nil if nothing is found."
(when (stringp string)
(set-text-properties 0 (length string) nil string))
(when (> (length string) 0)
- string))))
+ (cons string (point))))))
+
+(defun evil-find-thing (forward thing)
+ "Return a THING near point as a string.
+THING should be a symbol understood by `thing-at-point',
+e.g. 'symbol or 'word. If FORWARD is nil, search backward,
+otherwise forward. Returns nil if nothing is found."
+ (car (evil--find-thing forward thing)))
(defun evil-find-word (forward)
"Return word near point as a string.
@@ -566,7 +584,7 @@ The following properties are supported:
pattern))
(evil-ex-hl-idle-update))))
-(defun evil-ex-hl-set-region (name beg end &optional type)
+(defun evil-ex-hl-set-region (name beg end &optional _type)
"Set minimal and maximal position of highlight NAME to BEG and END."
(let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist))))
(when hl
@@ -597,12 +615,13 @@ The following properties are supported:
'all-windows)
(get-buffer-window-list (current-buffer) nil t)
(list (evil-ex-hl-window hl))))
- (let ((beg (max (window-start win)
- (or (evil-ex-hl-min hl) (point-min))))
- (end (min (window-end win)
- (or (evil-ex-hl-max hl) (point-max)))))
- (when (< beg end)
- (push (cons beg end) ranges))))
+ (when (window-live-p win)
+ (let ((beg (max (window-start win)
+ (or (evil-ex-hl-min hl) (point-min))))
+ (end (min (window-end win)
+ (or (evil-ex-hl-max hl) (point-max)))))
+ (when (< beg end)
+ (push (cons beg end) ranges)))))
(setq ranges
(sort ranges #'(lambda (r1 r2) (< (car r1) (car r2)))))
(while ranges
@@ -634,7 +653,10 @@ The following properties are supported:
;; reusing old overlays (if possible)
(while (and (not (eobp))
(evil-ex-search-find-next-pattern pattern)
- (<= (match-end 0) end))
+ (<= (match-end 0) end)
+ (not (and (= (match-end 0) end)
+ (string= (evil-ex-pattern-regex pattern)
+ "^"))))
(let ((ov (or (pop old-ovs) (make-overlay 0 0))))
(move-overlay ov (match-beginning 0) (match-end 0))
(overlay-put ov 'face face)
@@ -643,7 +665,10 @@ The following properties are supported:
(push ov new-ovs)
(when match-hook (funcall match-hook hl ov)))
(cond
- ((not (evil-ex-pattern-whole-line pattern))
+ ((and (not (evil-ex-pattern-whole-line pattern))
+ (not (string-match-p "\n" (buffer-substring-no-properties
+ (match-beginning 0)
+ (match-end 0)))))
(forward-line))
((= (match-beginning 0) (match-end 0))
(forward-char))
@@ -728,7 +753,7 @@ Note that this function ignores the whole-line property of PATTERN."
(evil-ex-hl-update-highlights)))
(setq evil-ex-hl-update-timer nil))
-(defun evil-ex-hl-update-highlights-scroll (win beg)
+(defun evil-ex-hl-update-highlights-scroll (win _beg)
"Update highlights after scrolling in some window."
(with-current-buffer (window-buffer win)
(evil-ex-hl-idle-update)))
@@ -751,7 +776,7 @@ This function does nothing if `evil-ex-search-interactive' or
(with-current-buffer (or evil-ex-current-buffer (current-buffer))
(unless (evil-ex-hl-active-p 'evil-ex-search)
(evil-ex-make-hl 'evil-ex-search
- :win (minibuffer-selected-window)))
+ :win (or (minibuffer-selected-window) (selected-window))))
(if pattern
(evil-ex-hl-change 'evil-ex-search pattern)))))
@@ -764,11 +789,11 @@ the direcion is determined by `evil-ex-search-direction'."
count (or count 1))
(let ((orig (point))
wrapped)
- (dotimes (i (or count 1))
+ (dotimes (_ (or count 1))
(when (eq evil-ex-search-direction 'forward)
(unless (eobp) (forward-char))
;; maybe skip end-of-line
- (when (and evil-move-cursor-back (eolp) (not (eobp)))
+ (when (and (not evil-move-beyond-eol) (eolp) (not (eobp)))
(forward-char)))
(let ((res (evil-ex-find-next nil nil (not evil-search-wrap))))
(cond
@@ -968,7 +993,7 @@ any error conditions."
'forward
'backward)))))))))
-(defun evil-ex-search-update-pattern (beg end range)
+(defun evil-ex-search-update-pattern (_beg _end _range)
"Update the current search pattern."
(save-match-data
(let ((pattern-string (minibuffer-contents)))
@@ -1168,7 +1193,7 @@ This handler highlights the pattern of the current substitution."
(evil-range (line-beginning-position)
(line-end-position)
'line
- :expaned t))))
+ :expanded t))))
(setq evil-ex-substitute-current-replacement replacement)
(evil-expand-range range)
(evil-ex-hl-set-region 'evil-ex-substitute
@@ -1182,12 +1207,12 @@ This handler highlights the pattern of the current substitution."
(evil-ex-pattern-update-ex-info nil
(format "%s" lossage))))))))
-(defun evil-ex-pattern-update-ex-info (hl result)
+(defun evil-ex-pattern-update-ex-info (_hl result)
"Update the Ex info string."
(when (stringp result)
(evil-ex-echo "%s" result)))
-(defun evil-ex-pattern-update-replacement (hl overlay)
+(defun evil-ex-pattern-update-replacement (_hl overlay)
"Update the replacement display."
(when (fboundp 'match-substitute-replacement)
(let ((fixedcase (not case-replace))
@@ -1204,7 +1229,20 @@ This handler highlights the pattern of the current substitution."
(defun evil-ex-parse-global (string)
"Parse STRING as a global argument."
- (evil-delimited-arguments string 2))
+ (let* ((pattern (nth 0 (evil-delimited-arguments string 2)))
+ (command (and pattern
+ (>= (- (length string) (length pattern)) 2)
+ (substring string (+ (length pattern) 2)))))
+ ;; use last pattern if none given
+ (when (zerop (length pattern))
+ (setq pattern
+ (cond
+ ((and (eq evil-search-module 'evil-search) evil-ex-search-pattern)
+ (evil-ex-pattern-regex evil-ex-search-pattern))
+ ((and (eq evil-search-module 'isearch) (not (zerop (length isearch-string))))
+ isearch-string)
+ (t (user-error "No previous pattern")))))
+ (list pattern command)))
(defun evil-ex-get-substitute-info (string &optional implicit-r)
"Returns the substitution info of command line STRING.
diff --git a/evil-states.el b/evil-states.el
index fdb285e..68b2726 100644
--- a/evil-states.el
+++ b/evil-states.el
@@ -1,9 +1,9 @@
-;;; evil-states.el --- States
+;;; evil-states.el --- States -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -128,10 +128,10 @@ commands opening a new line."
(evil-set-marker ?^ nil t)
(unless (eq evil-want-fine-undo t)
(evil-end-undo-step))
- (when evil-move-cursor-back
- (when (or (evil-normal-state-p evil-next-state)
- (evil-motion-state-p evil-next-state))
- (evil-move-cursor-back))))))
+ (when (or (evil-normal-state-p evil-next-state)
+ (evil-motion-state-p evil-next-state))
+ (evil-move-cursor-back
+ (and (eolp) (not evil-move-beyond-eol)))))))
(defun evil-insert-repeat-hook ()
"Record insertion keys in `evil-insert-repeat-info'."
@@ -143,7 +143,7 @@ commands opening a new line."
"Called when Insert state is about to be exited.
Handles the repeat-count of the insertion command."
(when evil-insert-count
- (dotimes (i (1- evil-insert-count))
+ (dotimes (_ (1- evil-insert-count))
(when evil-insert-lines
(evil-insert-newline-below)
(when evil-auto-indent
@@ -176,7 +176,7 @@ Handles the repeat-count of the insertion command."
(if (integerp col)
(move-to-column col t)
(funcall col))
- (dotimes (i (or evil-insert-count 1))
+ (dotimes (_ (or evil-insert-count 1))
(when (fboundp 'evil-execute-repeat-info)
(evil-execute-repeat-info
(cdr evil-insert-repeat-info)))))))))))
@@ -211,12 +211,15 @@ the selection is enabled.
\(fn SELECTION DOC [[KEY VAL]...] BODY...)"
(declare (indent defun)
+ (doc-string 2)
(debug (&define name stringp
[&rest keywordp sexp]
def-body)))
(let* ((name (intern (format "evil-visual-%s" selection)))
(message (intern (format "%s-message" name)))
+ (tagvar (intern (format "%s-tag" name)))
(type selection)
+ (tag " <V> ")
arg key string)
;; collect keywords
(while (keywordp (car-safe body))
@@ -226,12 +229,15 @@ the selection is enabled.
((eq key :message)
(setq string arg))
((eq key :type)
- (setq type arg))))
+ (setq type arg))
+ ((eq key :tag)
+ (setq tag arg))))
;; macro expansion
`(progn
(add-to-list 'evil-visual-alist (cons ',selection ',name))
(defvar ,name ',type ,(format "*%s" doc))
(defvar ,message ,string ,doc)
+ (defvar ,tagvar ,tag ,doc)
(evil-define-command ,name (&optional mark point type message)
,@(when doc `(,doc))
:keep-visual t
@@ -252,15 +258,23 @@ the selection is enabled.
(evil-define-visual-selection char
"Characterwise selection."
:type inclusive
- :message "-- VISUAL --")
+ :message "-- VISUAL --"
+ :tag " <V> ")
(evil-define-visual-selection line
"Linewise selection."
- :message "-- VISUAL LINE --")
+ :message "-- VISUAL LINE --"
+ :tag " <Vl> ")
+
+(evil-define-visual-selection screen-line
+ "Linewise selection in `visual-line-mode'."
+ :message "-- SCREEN LINE --"
+ :tag " <Vs> ")
(evil-define-visual-selection block
"Blockwise selection."
:message "-- VISUAL BLOCK --"
+ :tag " <Vb> "
(evil-transient-mark -1)
;; refresh the :corner property
(setq evil-visual-properties
@@ -269,7 +283,7 @@ the selection is enabled.
(evil-define-state visual
"Visual state."
- :tag " <V> "
+ :tag 'evil-visual-tag
:enable (motion normal)
:message 'evil-visual-message
(cond
@@ -354,15 +368,13 @@ otherwise exit Visual state."
(when (buffer-live-p buf)
(with-current-buffer buf
(when (and (evil-visual-state-p)
- (fboundp 'x-select-text)
- (or (not (boundp 'ns-initialized))
- (with-no-warnings ns-initialized))
+ (display-selections-p)
(not (eq evil-visual-selection 'block)))
- (x-select-text (buffer-substring-no-properties
- evil-visual-beginning
- evil-visual-end)))))))
+ (evil-set-selection 'PRIMARY (buffer-substring-no-properties
+ evil-visual-beginning
+ evil-visual-end)))))))
-(defun evil-visual-activate-hook (&optional command)
+(defun evil-visual-activate-hook (&optional _command)
"Enable Visual state if the region is activated."
(unless (evil-visual-state-p)
(evil-delay nil
@@ -408,6 +420,15 @@ If LATER is non-nil, exit after the current command."
(evil-visual-contract-region))
(evil-change-to-previous-state)))))
+(defun evil-visual-tag (&optional selection)
+ "Return a mode-line tag for SELECTION.
+SELECTION is a kind of selection as defined by
+`evil-define-visual-selection', such as `char', `line'
+or `block'."
+ (setq selection (or selection evil-visual-selection))
+ (when selection
+ (symbol-value (intern (format "evil-visual-%s-tag" selection)))))
+
(defun evil-visual-message (&optional selection)
"Create an echo area message for SELECTION.
SELECTION is a kind of selection as defined by
@@ -608,7 +629,6 @@ Do this by putting an overlay on each line within the rectangle.
Each overlay extends across all the columns of the rectangle.
Reuse overlays where possible to prevent flicker."
(let* ((point (point))
- (mark (or (mark t) point))
(overlays (or overlays 'evil-visual-block-overlays))
(old (symbol-value overlays))
(eol-col (and (memq this-command '(next-line previous-line))
@@ -645,7 +665,7 @@ Reuse overlays where possible to prevent flicker."
;; iterate over those lines of the rectangle which are
;; visible in the currently selected window
(goto-char window-beg)
- (dotimes (i nlines)
+ (dotimes (_ nlines)
(let (before after row-beg row-end)
;; beginning of row
(evil-move-to-column beg-col)
@@ -655,7 +675,7 @@ Reuse overlays where possible to prevent flicker."
(setq before
(propertize
(make-string
- (- beg-col (current-column)) ?\ )
+ (- beg-col (current-column)) ?\s)
'face
(or (get-text-property (1- (point)) 'face)
'default))))
@@ -672,7 +692,7 @@ Reuse overlays where possible to prevent flicker."
(if (= (point) row-beg)
(- end-col beg-col)
(- end-col (current-column)))
- ?\ ) 'face 'region))
+ ?\s) 'face 'region))
;; place cursor on one of the virtual spaces
(if (= point row-beg)
(put-text-property
@@ -858,8 +878,7 @@ CORNER defaults to `upper-left'."
(remove-hook 'pre-command-hook #'evil-replace-pre-command t)
(unless (eq evil-want-fine-undo t)
(evil-end-undo-step))
- (when evil-move-cursor-back
- (evil-move-cursor-back))))
+ (evil-move-cursor-back)))
(setq evil-replace-alist nil))
(defun evil-replace-pre-command ()
diff --git a/evil-test-helpers.el b/evil-test-helpers.el
new file mode 100644
index 0000000..127a114
--- /dev/null
+++ b/evil-test-helpers.el
@@ -0,0 +1,414 @@
+;;; evil-test-helpers.el --- unit test helpers for Evil -*- coding: utf-8; lexical-binding: t -*-
+
+;; Author: Vegard Øye <vegard_oye at hotmail.com>
+;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
+;; Package-Requires: ((evil "1.14.0"))
+;; Version: 1.14.0
+
+;; This file is NOT part of GNU Emacs.
+
+;;; License:
+
+;; This file is part of Evil.
+;;
+;; Evil is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Evil is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Evil. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file contains helper functions for writing tests for
+;; evil-mode. These helpers can also be used by other packages which
+;; extend evil-mode.
+
+;; To write a test use `evil-test-buffer':
+
+;; (require 'evil-test-helpers)
+;;
+;; (ert-deftest evil-test ()
+;; :tags '(evil)
+;; (evil-test-buffer
+;; "[T]his creates a test buffer." ; cursor on "T"
+;; ("w") ; key sequence
+;; "This [c]reates a test buffer."))) ; cursor moved to "c"
+;;
+;; The initial state, the cursor syntax, etc., can be changed
+;; with keyword arguments. See the documentation string of
+;; `evil-test-buffer' for more details.
+;;
+;; This file is NOT part of Evil itself.
+
+(require 'elp)
+(require 'ert)
+(require 'evil)
+
+;;; Code:
+
+(when (fboundp 'font-lock-add-keywords)
+ (font-lock-add-keywords 'emacs-lisp-mode
+ '(("(\\(evil-test-buffer\\)\\>"
+ 1 font-lock-keyword-face))))
+
+(defvar evil-test-point nil
+ "Marker for point.")
+(make-variable-buffer-local 'evil-test-point)
+(defvar evil-test-visual-start nil
+ "Marker for Visual beginning.")
+(make-variable-buffer-local 'evil-test-visual-start)
+(defvar evil-test-visual-end nil
+ "Marker for Visual end.")
+(make-variable-buffer-local 'evil-test-visual-end)
+
+(defmacro evil-test-buffer (&rest body)
+ "Execute FORMS in a temporary buffer.
+The following optional keywords specify the buffer's properties:
+
+:state STATE The initial state, defaults to `normal'.
+:visual SELECTION The Visual selection, defaults to `char'.
+:point-start STRING String for matching beginning of point,
+ defaults to \"[\".
+:point-end STRING String for matching end of point,
+ defaults to \"]\".
+:visual-start STRING String for matching beginning of
+ Visual selection, defaults to \"<\".
+:visual-end STRING String for matching end of
+ Visual selection, defaults to \">\".
+
+Then follows one or more forms. If the first form is a string,
+it is taken to be a buffer description as passed to
+`evil-test-buffer-from-string', and initializes the buffer.
+Subsequent string forms validate the buffer.
+
+If a form is a list of strings or vectors, it is taken to be a
+key sequence and is passed to `execute-kbd-macro'. If the form
+is \(file FILENAME CONTENTS), then the test fails unless the
+contents of FILENAME equal CONTENTS. If the form is \(error
+SYMBOL ...) then the test fails unless an error of type SYMBOL is
+raised. Remaining forms are evaluated as-is.
+
+\(fn [[KEY VALUE]...] FORMS...)"
+ (declare (indent defun))
+ (let ((state 'normal)
+ arg key point-start point-end string
+ visual visual-start visual-end)
+ ;; collect keywords
+ (while (keywordp (car-safe body))
+ (setq key (pop body)
+ arg (pop body))
+ (cond
+ ((eq key :point-start)
+ (setq point-start (or arg "")))
+ ((eq key :point-end)
+ (setq point-end (or arg "")))
+ ((eq key :state)
+ (setq state arg))
+ ((eq key :visual)
+ (setq visual arg))
+ ((eq key :visual-start)
+ (setq visual-start (or arg "")))
+ ((eq key :visual-end)
+ (setq visual-end (or arg "")))))
+ ;; collect buffer initialization
+ (when (stringp (car-safe body))
+ (setq string (pop body)))
+ ;; macro expansion
+ `(let ((buffer (evil-test-buffer-from-string
+ ,string ',state
+ ,point-start ,point-end
+ ',visual ,visual-start ,visual-end))
+ (kill-ring kill-ring)
+ (kill-ring-yank-pointer kill-ring-yank-pointer)
+ x-select-enable-clipboard
+ message-log-max)
+ (unwind-protect
+ (save-window-excursion
+ (with-current-buffer buffer
+ ;; necessary for keyboard macros to work
+ (switch-to-buffer-other-window (current-buffer))
+ (buffer-enable-undo)
+ (undo-tree-mode 1)
+ ;; parse remaining forms
+ ,@(mapcar
+ #'(lambda (form)
+ (let (error-symbol)
+ (when (and (listp form)
+ (eq (car-safe form) 'error))
+ (setq error-symbol (car-safe (cdr-safe form))
+ form (cdr-safe (cdr-safe form))))
+ (let ((result
+ (cond
+ ((stringp form)
+ `(evil-test-buffer-string
+ ,form
+ ',point-start ',point-end
+ ',visual-start ',visual-end))
+ ((eq (car-safe form) 'file)
+ `(evil-test-file-contents ,(cadr form)
+ ,(car (cddr form))))
+ ((or (stringp (car-safe form))
+ (vectorp (car-safe form))
+ (memq (car-safe (car-safe form))
+ '(kbd vconcat)))
+ ;; we need to execute everything as a single
+ ;; sequence for command loop hooks to work
+ `(execute-kbd-macro
+ (apply #'vconcat
+ (mapcar #'listify-key-sequence
+ (mapcar #'eval ',form)))))
+ ((memq (car-safe form) '(kbd vconcat))
+ `(execute-kbd-macro ,form))
+ (t
+ form))))
+ (if error-symbol
+ `(should-error ,result :type ',error-symbol)
+ result))))
+ body)))
+ (and (buffer-name buffer)
+ (kill-buffer buffer))))))
+
+(defmacro evil-test-selection (string &optional end-string
+ before-predicate after-predicate)
+ "Verify that the Visual selection contains STRING."
+ (declare (indent defun))
+ `(progn
+ (save-excursion
+ (goto-char (or evil-visual-beginning (region-beginning)))
+ (evil-test-text nil (or ,string ,end-string) ,before-predicate))
+ (save-excursion
+ (goto-char (or evil-visual-end (region-end)))
+ (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
+
+(defun evil-test-buffer-string (string &optional
+ point-start point-end
+ visual-start visual-end)
+ "Validate the current buffer according to STRING.
+If STRING contains an occurrence of POINT-START immediately
+followed by POINT-END, that position is compared against point.
+If STRING contains an occurrence of VISUAL-START followed by
+VISUAL-END, those positions are compared against the Visual selection.
+POINT-START and POINT-END default to [ and ].
+VISUAL-START and VISUAL-END default to < and >."
+ (let ((actual-buffer (current-buffer))
+ (marker-buffer (evil-test-marker-buffer-from-string
+ string
+ point-start point-end
+ visual-start visual-end))
+ before-point after-point string selection)
+ (unwind-protect
+ (with-current-buffer marker-buffer
+ (setq string (buffer-string))
+ (when evil-test-point
+ (setq before-point (buffer-substring (point-min) evil-test-point)
+ after-point (buffer-substring evil-test-point (point-max))))
+ (when (and evil-test-visual-start evil-test-visual-end)
+ (setq selection (buffer-substring
+ evil-test-visual-start evil-test-visual-end)))
+ (with-current-buffer actual-buffer
+ (if (or before-point after-point)
+ (evil-test-text before-point after-point)
+ ;; if the cursor isn't specified, just test the whole buffer
+ (save-excursion
+ (goto-char (point-min))
+ (evil-test-text nil string #'bobp #'eobp)))
+ (when selection
+ (evil-test-selection selection))))
+ (kill-buffer marker-buffer))))
+
+(defun evil-test-buffer-from-string (string &optional
+ state
+ point-start point-end
+ visual visual-start visual-end)
+ "Create a new buffer according to STRING.
+If STRING contains an occurrence of POINT-START immediately
+followed by POINT-END, then point is moved to that position.
+If STRING contains an occurrence of VISUAL-START followed by
+VISUAL-END, then a Visual selection is created with those boundaries.
+POINT-START and POINT-END default to [ and ].
+VISUAL-START and VISUAL-END default to < and >.
+STATE is the initial state; it defaults to `normal'.
+VISUAL is the Visual selection: it defaults to `char'."
+ (let ((type (evil-visual-type (or visual 'char)))
+ (buffer (evil-test-marker-buffer-from-string
+ string point-start point-end
+ visual-start visual-end)))
+ (with-current-buffer buffer
+ (prog1 buffer
+ (evil-change-state state)
+ ;; let the buffer change its major mode without disabling Evil
+ (add-hook 'after-change-major-mode-hook #'evil-initialize)
+ (when (and (markerp evil-test-visual-start)
+ (markerp evil-test-visual-end))
+ (evil-visual-select
+ evil-test-visual-start evil-test-visual-end type)
+ (when evil-test-point
+ (goto-char evil-test-point)
+ (evil-visual-refresh)
+ (unless (and (= evil-visual-beginning
+ evil-test-visual-start)
+ (= evil-visual-end
+ evil-test-visual-end))
+ (evil-visual-select
+ evil-test-visual-start evil-test-visual-end type -1)
+ (goto-char evil-test-point)
+ (evil-visual-refresh))))
+ (when (markerp evil-test-point)
+ (goto-char evil-test-point))))))
+
+(defun evil-test-marker-buffer-from-string (string &optional
+ point-start point-end
+ visual-start visual-end)
+ "Create a new marker buffer according to STRING.
+If STRING contains an occurrence of POINT-START immediately
+followed by POINT-END, that position is stored in the
+buffer-local variable `evil-test-point'. Similarly,
+if STRING contains an occurrence of VISUAL-START followed by
+VISUAL-END, those positions are stored in the variables
+`evil-test-visual-beginning' and `evil-test-visual-end'.
+POINT-START and POINT-END default to [ and ].
+VISUAL-START and VISUAL-END default to < and >."
+ (let ((string (or string ""))
+ (point-start (regexp-quote
+ (if (characterp point-start)
+ (string point-start)
+ (or point-start "["))))
+ (point-end (regexp-quote
+ (if (characterp point-end)
+ (string point-end)
+ (or point-end "]"))))
+ (visual-start (regexp-quote
+ (if (characterp visual-start)
+ (string visual-start)
+ (or visual-start "<"))))
+ (visual-end (regexp-quote
+ (if (characterp visual-end)
+ (string visual-end)
+ (or visual-end ">")))))
+ (with-current-buffer (generate-new-buffer " *test*")
+ (prog1 (current-buffer)
+ (save-excursion
+ (insert string))
+ (save-excursion
+ (when (> (length point-start) 0)
+ (if (> (length point-end) 0)
+ (when (re-search-forward
+ (format "\\(%s\\)[^%s]?\\(%s\\)"
+ point-start point-end point-end) nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 2) (match-end 2))
+ (delete-region (match-beginning 1) (match-end 1))
+ (setq evil-test-point
+ (move-marker (make-marker) (point))))
+ (when (re-search-forward point-start nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq evil-test-point
+ (move-marker (make-marker) (point)))))))
+ (save-excursion
+ (when (and (> (length visual-start) 0)
+ (> (length visual-end) 0))
+ (when (re-search-forward visual-start nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq evil-test-visual-start
+ (move-marker (make-marker) (point))))
+ (when (re-search-forward visual-end nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq evil-test-visual-end
+ (move-marker (make-marker) (point))))))))))
+
+(defun evil-test-text (before after &optional before-predicate after-predicate)
+ "Verify the text around point.
+BEFORE is the expected text before point, and AFTER is
+the text after point. BEFORE-PREDICATE is a predicate function
+to execute at the beginning of the text, and AFTER-PREDICATE
+is executed at the end."
+ (when before
+ (if (functionp before)
+ (setq before-predicate before
+ before nil)
+ (should (string= (buffer-substring
+ (max (point-min) (- (point) (length before)))
+ (point))
+ before))))
+ (when after
+ (if (functionp after)
+ (setq after-predicate after
+ after nil)
+ (should (string= (buffer-substring
+ (point)
+ (min (point-max) (+ (point) (length after))))
+ after))))
+ (when before-predicate
+ (ert-info ((format "Expect `%s' at the beginning" before-predicate))
+ (save-excursion
+ (backward-char (length before))
+ (should (funcall before-predicate)))))
+ (when after-predicate
+ (ert-info ((format "Expect `%s' at the end" after-predicate))
+ (save-excursion
+ (forward-char (length after))
+ (should (funcall after-predicate))))))
+
+(defmacro evil-test-region (string &optional end-string
+ before-predicate after-predicate)
+ "Verify that the region contains STRING."
+ (declare (indent defun))
+ `(progn
+ (save-excursion
+ (goto-char (region-beginning))
+ (evil-test-text nil (or ,string ,end-string) ,before-predicate))
+ (save-excursion
+ (goto-char (region-end))
+ (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
+
+(defmacro evil-test-overlay (overlay string &optional end-string
+ before-predicate after-predicate)
+ "Verify that OVERLAY contains STRING."
+ (declare (indent defun))
+ `(progn
+ (save-excursion
+ (goto-char (overlay-start ,overlay))
+ (evil-test-text nil (or ,string ,end-string) ,before-predicate))
+ (save-excursion
+ (goto-char (overlay-end ,overlay))
+ (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
+
+(defmacro evil-with-temp-file (file-var content &rest body)
+ "Create a temp file with CONTENT and bind its name to FILE-VAR within BODY.
+FILE-VAR must be a symbol which contains the name of the
+temporary file within the macro body. CONTENT is either a string
+to be used as the content of the temporary file or a form to be
+executed with the temporary file's buffer as \(current-buffer),
+see `with-temp-file'. BODY contains the forms to be executed
+while the temporary file exists. The temporary file is deleted at
+the end of the execution of BODY."
+ (declare (indent 2)
+ (debug (symbolp form body)))
+ `(let ((,file-var (make-temp-file "evil-test")))
+ (with-temp-file ,file-var
+ ,(if (stringp content)
+ `(insert ,content)
+ content))
+ ,@body
+ (delete-file ,file-var)))
+
+(defun evil-test-file-contents (name contents)
+ "Ensure that the contents of file with NAME equal CONTENTS."
+ (with-temp-buffer
+ (insert-file-contents name)
+ (should (string= (buffer-string)
+ contents))))
+
+(provide 'evil-test-helpers)
+
+;;; evil-test-helpers.el ends here
diff --git a/evil-tests.el b/evil-tests.el
index c76d44e..e06fe68 100644
--- a/evil-tests.el
+++ b/evil-tests.el
@@ -3,7 +3,7 @@
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -61,9 +61,11 @@
;;
;; This file is NOT part of Evil itself.
+(require 'cl-lib)
(require 'elp)
(require 'ert)
(require 'evil)
+(require 'evil-test-helpers)
;;; Code:
@@ -114,7 +116,24 @@ with `M-x evil-tests-run'"))
(ert-run-tests-batch tests)
(elp-results))
(t
- (ert-run-tests-batch-and-exit tests)))))
+ ;; We would like to use `ert-run-tests-batch-and-exit'
+ ;; Unfortunately it doesn't work outside of batch mode, and we
+ ;; can't use batch mode because we have tests that need windows.
+ ;; Instead, run the tests interactively, copy the results to a
+ ;; text file, and then exit with an appropriate code.
+ (setq attempt-stack-overflow-recovery nil
+ attempt-orderly-shutdown-on-fatal-signal nil)
+ (unwind-protect
+ (progn
+ (ert-run-tests-interactively tests)
+ (with-current-buffer "*ert*"
+ (append-to-file (point-min) (point-max) "test-results.txt")
+ (kill-emacs (if (zerop (ert-stats-completed-unexpected ert--results-stats)) 0 1))))
+ (unwind-protect
+ (progn
+ (append-to-file "Error running tests\n" nil "test-results.txt")
+ (append-to-file (backtrace-to-string (backtrace-get-frames 'backtrace)) nil "test-results.txt"))
+ (kill-emacs 2)))))))
(defun evil-tests-profiler (&optional force)
"Profile Evil tests."
@@ -122,367 +141,6 @@ with `M-x evil-tests-run'"))
(setq evil-tests-profiler t)
(elp-instrument-package "evil")))
-(defvar evil-test-point nil
- "Marker for point.")
-(make-variable-buffer-local 'evil-test-point)
-(defvar evil-test-visual-start nil
- "Marker for Visual beginning.")
-(make-variable-buffer-local 'evil-test-visual-start)
-(defvar evil-test-visual-end nil
- "Marker for Visual end.")
-(make-variable-buffer-local 'evil-test-visual-end)
-
-(defmacro evil-test-buffer (&rest body)
- "Execute FORMS in a temporary buffer.
-The following optional keywords specify the buffer's properties:
-
-:state STATE The initial state, defaults to `normal'.
-:visual SELECTION The Visual selection, defaults to `char'.
-:point-start STRING String for matching beginning of point,
- defaults to \"[\".
-:point-end STRING String for matching end of point,
- defaults to \"]\".
-:visual-start STRING String for matching beginning of
- Visual selection, defaults to \"<\".
-:visual-end STRING String for matching end of
- Visual selection, defaults to \">\".
-
-Then follows one or more forms. If the first form is a string,
-it is taken to be a buffer description as passed to
-`evil-test-buffer-from-string', and initializes the buffer.
-Subsequent string forms validate the buffer.
-
-If a form is a list of strings or vectors, it is taken to be a
-key sequence and is passed to `execute-kbd-macro'. If the form
-is \(file FILENAME CONTENTS), then the test fails unless the
-contents of FILENAME equal CONTENTS. If the form is \(error
-SYMBOL ...) then the test fails unless an error of type SYMBOL is
-raised. Remaining forms are evaluated as-is.
-
-\(fn [[KEY VALUE]...] FORMS...)"
- (declare (indent defun))
- (let ((state 'normal)
- arg key point-start point-end string
- visual visual-start visual-end)
- ;; collect keywords
- (while (keywordp (car-safe body))
- (setq key (pop body)
- arg (pop body))
- (cond
- ((eq key :point-start)
- (setq point-start (or arg "")))
- ((eq key :point-end)
- (setq point-end (or arg "")))
- ((eq key :state)
- (setq state arg))
- ((eq key :visual)
- (setq visual arg))
- ((eq key :visual-start)
- (setq visual-start (or arg "")))
- ((eq key :visual-end)
- (setq visual-end (or arg "")))))
- ;; collect buffer initialization
- (when (stringp (car-safe body))
- (setq string (pop body)))
- ;; macro expansion
- `(let ((buffer (evil-test-buffer-from-string
- ,string ',state
- ,point-start ,point-end
- ',visual ,visual-start ,visual-end))
- (kill-ring kill-ring)
- (kill-ring-yank-pointer kill-ring-yank-pointer)
- x-select-enable-clipboard
- message-log-max)
- (unwind-protect
- (save-window-excursion
- (with-current-buffer buffer
- ;; necessary for keyboard macros to work
- (switch-to-buffer-other-window (current-buffer))
- (buffer-enable-undo)
- (undo-tree-mode 1)
- ;; parse remaining forms
- ,@(mapcar
- #'(lambda (form)
- (let (error-symbol)
- (when (and (listp form)
- (eq (car-safe form) 'error))
- (setq error-symbol (car-safe (cdr-safe form))
- form (cdr-safe (cdr-safe form))))
- (let ((result
- (cond
- ((stringp form)
- `(evil-test-buffer-string
- ,form
- ',point-start ',point-end
- ',visual-start ',visual-end))
- ((eq (car-safe form) 'file)
- `(evil-test-file-contents ,(cadr form)
- ,(caddr form)))
- ((or (stringp (car-safe form))
- (vectorp (car-safe form))
- (memq (car-safe (car-safe form))
- '(kbd vconcat)))
- ;; we need to execute everything as a single
- ;; sequence for command loop hooks to work
- `(execute-kbd-macro
- (apply #'vconcat
- (mapcar #'listify-key-sequence
- (mapcar #'eval ',form)))))
- ((memq (car-safe form) '(kbd vconcat))
- `(execute-kbd-macro ,form))
- (t
- form))))
- (if error-symbol
- `(should-error ,result :type ',error-symbol)
- result))))
- body)))
- (and (buffer-name buffer)
- (kill-buffer buffer))))))
-
-(when (fboundp 'font-lock-add-keywords)
- (font-lock-add-keywords 'emacs-lisp-mode
- '(("(\\(evil-test-buffer\\)\\>"
- 1 font-lock-keyword-face))))
-
-(defun evil-test-buffer-string (string &optional
- point-start point-end
- visual-start visual-end)
- "Validate the current buffer according to STRING.
-If STRING contains an occurrence of POINT-START immediately
-followed by POINT-END, that position is compared against point.
-If STRING contains an occurrence of VISUAL-START followed by
-VISUAL-END, those positions are compared against the Visual selection.
-POINT-START and POINT-END default to [ and ].
-VISUAL-START and VISUAL-END default to < and >."
- (let ((actual-buffer (current-buffer))
- (marker-buffer (evil-test-marker-buffer-from-string
- string
- point-start point-end
- visual-start visual-end))
- before-point after-point string selection)
- (unwind-protect
- (with-current-buffer marker-buffer
- (setq string (buffer-string))
- (when evil-test-point
- (setq before-point (buffer-substring (point-min) evil-test-point)
- after-point (buffer-substring evil-test-point (point-max))))
- (when (and evil-test-visual-start evil-test-visual-end)
- (setq selection (buffer-substring
- evil-test-visual-start evil-test-visual-end)))
- (with-current-buffer actual-buffer
- (if (or before-point after-point)
- (evil-test-text before-point after-point)
- ;; if the cursor isn't specified, just test the whole buffer
- (save-excursion
- (goto-char (point-min))
- (evil-test-text nil string #'bobp #'eobp)))
- (when selection
- (evil-test-selection selection))))
- (kill-buffer marker-buffer))))
-
-(defun evil-test-buffer-from-string (string &optional
- state
- point-start point-end
- visual visual-start visual-end)
- "Create a new buffer according to STRING.
-If STRING contains an occurrence of POINT-START immediately
-followed by POINT-END, then point is moved to that position.
-If STRING contains an occurrence of VISUAL-START followed by
-VISUAL-END, then a Visual selection is created with those boundaries.
-POINT-START and POINT-END default to [ and ].
-VISUAL-START and VISUAL-END default to < and >.
-STATE is the initial state; it defaults to `normal'.
-VISUAL is the Visual selection: it defaults to `char'."
- (let ((type (evil-visual-type (or visual 'char)))
- (buffer (evil-test-marker-buffer-from-string
- string point-start point-end
- visual-start visual-end)))
- (with-current-buffer buffer
- (prog1 buffer
- (evil-change-state state)
- ;; let the buffer change its major mode without disabling Evil
- (add-hook 'after-change-major-mode-hook #'evil-initialize)
- (when (and (markerp evil-test-visual-start)
- (markerp evil-test-visual-end))
- (evil-visual-select
- evil-test-visual-start evil-test-visual-end type)
- (when evil-test-point
- (goto-char evil-test-point)
- (evil-visual-refresh)
- (unless (and (= evil-visual-beginning
- evil-test-visual-start)
- (= evil-visual-end
- evil-test-visual-end))
- (evil-visual-select
- evil-test-visual-start evil-test-visual-end type -1)
- (goto-char evil-test-point)
- (evil-visual-refresh))))
- (when (markerp evil-test-point)
- (goto-char evil-test-point))))))
-
-(defun evil-test-marker-buffer-from-string (string &optional
- point-start point-end
- visual-start visual-end)
- "Create a new marker buffer according to STRING.
-If STRING contains an occurrence of POINT-START immediately
-followed by POINT-END, that position is stored in the
-buffer-local variable `evil-test-point'. Similarly,
-if STRING contains an occurrence of VISUAL-START followed by
-VISUAL-END, those positions are stored in the variables
-`evil-test-visual-beginning' and `evil-test-visual-end'.
-POINT-START and POINT-END default to [ and ].
-VISUAL-START and VISUAL-END default to < and >."
- (let ((string (or string ""))
- (point-start (regexp-quote
- (if (characterp point-start)
- (string point-start)
- (or point-start "["))))
- (point-end (regexp-quote
- (if (characterp point-end)
- (string point-end)
- (or point-end "]"))))
- (visual-start (regexp-quote
- (if (characterp visual-start)
- (string visual-start)
- (or visual-start "<"))))
- (visual-end (regexp-quote
- (if (characterp visual-end)
- (string visual-end)
- (or visual-end ">")))))
- (with-current-buffer (generate-new-buffer " *test*")
- (prog1 (current-buffer)
- (save-excursion
- (insert string))
- (save-excursion
- (when (> (length point-start) 0)
- (if (> (length point-end) 0)
- (when (re-search-forward
- (format "\\(%s\\)[^%s]?\\(%s\\)"
- point-start point-end point-end) nil t)
- (goto-char (match-beginning 0))
- (delete-region (match-beginning 2) (match-end 2))
- (delete-region (match-beginning 1) (match-end 1))
- (setq evil-test-point
- (move-marker (make-marker) (point))))
- (when (re-search-forward point-start nil t)
- (goto-char (match-beginning 0))
- (delete-region (match-beginning 0) (match-end 0))
- (setq evil-test-point
- (move-marker (make-marker) (point)))))))
- (save-excursion
- (when (and (> (length visual-start) 0)
- (> (length visual-end) 0))
- (when (re-search-forward visual-start nil t)
- (goto-char (match-beginning 0))
- (delete-region (match-beginning 0) (match-end 0))
- (setq evil-test-visual-start
- (move-marker (make-marker) (point))))
- (when (re-search-forward visual-end nil t)
- (goto-char (match-beginning 0))
- (delete-region (match-beginning 0) (match-end 0))
- (setq evil-test-visual-end
- (move-marker (make-marker) (point))))))))))
-
-(defun evil-test-text (before after &optional before-predicate after-predicate)
- "Verify the text around point.
-BEFORE is the expected text before point, and AFTER is
-the text after point. BEFORE-PREDICATE is a predicate function
-to execute at the beginning of the text, and AFTER-PREDICATE
-is executed at the end."
- (when before
- (if (functionp before)
- (setq before-predicate before
- before nil)
- (should (string= (buffer-substring
- (max (point-min) (- (point) (length before)))
- (point))
- before))))
- (when after
- (if (functionp after)
- (setq after-predicate after
- after nil)
- (should (string= (buffer-substring
- (point)
- (min (point-max) (+ (point) (length after))))
- after))))
- (when before-predicate
- (ert-info ((format "Expect `%s' at the beginning" before-predicate))
- (save-excursion
- (backward-char (length before))
- (should (funcall before-predicate)))))
- (when after-predicate
- (ert-info ((format "Expect `%s' at the end" after-predicate))
- (save-excursion
- (forward-char (length after))
- (should (funcall after-predicate))))))
-
-(defmacro evil-test-selection (string &optional end-string
- before-predicate after-predicate)
- "Verify that the Visual selection contains STRING."
- (declare (indent defun))
- `(progn
- (save-excursion
- (goto-char (or evil-visual-beginning (region-beginning)))
- (evil-test-text nil (or ,string ,end-string) ,before-predicate))
- (save-excursion
- (goto-char (or evil-visual-end (region-end)))
- (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
-
-(defmacro evil-test-region (string &optional end-string
- before-predicate after-predicate)
- "Verify that the region contains STRING."
- (declare (indent defun))
- `(progn
- (save-excursion
- (goto-char (region-beginning))
- (evil-test-text nil (or ,string ,end-string) ,before-predicate))
- (save-excursion
- (goto-char (region-end))
- (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
-
-(defmacro evil-test-overlay (overlay string &optional end-string
- before-predicate after-predicate)
- "Verify that OVERLAY contains STRING."
- (declare (indent defun))
- `(progn
- (save-excursion
- (goto-char (overlay-start ,overlay))
- (evil-test-text nil (or ,string ,end-string) ,before-predicate))
- (save-excursion
- (goto-char (overlay-end ,overlay))
- (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
-
-(defun evil-temp-filename ()
- "Return an appropriate temporary filename."
- (make-temp-name (expand-file-name "evil-test"
- temporary-file-directory)))
-
-(defmacro evil-with-temp-file (file-var content &rest body)
- "Create a temp file with CONTENT and bind its name to FILE-VAR within BODY.
-FILE-VAR must be a symbol which contains the name of the
-temporary file within the macro body. CONTENT is either a string
-to be used as the content of the temporary file or a form to be
-executed with the temporary file's buffer as \(current-buffer),
-see `with-temp-file'. BODY contains the forms to be executed
-while the temporary file exists. The temporary file is deleted at
-the end of the execution of BODY."
- (declare (indent 2)
- (debug (symbolp form body)))
- `(let ((,file-var (evil-temp-filename)))
- (with-temp-file ,file-var
- ,(if (stringp content)
- `(insert ,content)
- content))
- ,@body
- (delete-file ,file-var)))
-
-(defun evil-test-file-contents (name contents)
- "Ensure that the contents of file with NAME equal CONTENTS."
- (with-temp-buffer
- (insert-file-contents name)
- (should (string= (buffer-string)
- contents))))
-
;;; States
(defun evil-test-local-mode-enabled ()
@@ -546,6 +204,8 @@ the end of the execution of BODY."
local-mode (evil-state-property state :local)
local-keymap (evil-state-property state :local-keymap t)
tag (evil-state-property state :tag t))
+ (when (functionp tag)
+ (setq tag (funcall tag)))
(ert-info ("Update `evil-state'")
(should (eq evil-state state)))
(ert-info ("Ensure `evil-local-mode' is enabled")
@@ -732,6 +392,33 @@ when exiting Operator-Pending state")
(should (eq (lookup-key aux "f") 'foo))
(should (eq (lookup-key aux "b") 'bar)))))
+(ert-deftest evil-test-global-local-map-binding ()
+ "Test use of `evil-define-key' for binding in global maps."
+ :tags '(evil state)
+ (let ((evil-normal-state-map (copy-keymap evil-normal-state-map))
+ (evil-normal-state-local-map
+ (when (keymapp evil-normal-state-local-map)
+ (copy-keymap evil-normal-state-local-map)))
+ (global-map (copy-keymap global-map))
+ (orig-local-map
+ (when (keymapp (current-local-map))
+ (copy-keymap (current-local-map))))
+ (map (or (current-local-map) (make-sparse-keymap))))
+ (use-local-map map)
+ (ert-info ("Bind in a global state map")
+ (evil-define-key 'normal 'global "f" 'foo)
+ (should (eq (lookup-key evil-normal-state-map "f") 'foo)))
+ (ert-info ("Bind in a local state map")
+ (evil-define-key 'normal 'local "f" 'foo)
+ (should (eq (lookup-key evil-normal-state-local-map "f") 'foo)))
+ (ert-info ("Bind in the global map")
+ (evil-define-key nil 'global "b" 'bar)
+ (should (eq (lookup-key global-map "b") 'bar)))
+ (ert-info ("Bind in the local map")
+ (evil-define-key nil 'local "b" 'bar)
+ (should (eq (lookup-key (current-local-map) "b") 'bar)))
+ (use-local-map orig-local-map)))
+
;;; Type system
(ert-deftest evil-test-exclusive-type ()
@@ -928,6 +615,14 @@ Below some empty line"
("aevil rulz " [escape])
";; Tevil rulz[ ]his buffer is for notes you don't want to save"))
+(ert-deftest evil-test-visual-append ()
+ "Test `evil-append' from visual state"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("veA_evil rulz " [escape])
+ ";; This_evil rulz[ ] buffer is for notes you don't want to save"))
+
(ert-deftest evil-test-open-above ()
"Test `evil-open-above'"
:tags '(evil insert)
@@ -1072,73 +767,73 @@ If nil, KEYS is used."
(should (equal (evil-normalize-repeat-info (ring-ref evil-repeat-ring 0))
(list (vconcat (or recorded keys))))))
-;; (ert-deftest evil-test-normal-repeat-info-simple-command ()
-;; "Save key-sequence after simple editing command in Normal state"
-;; :tags '(evil repeat)
-;; (evil-test-buffer
-;; "[T]his is a test buffer"
-;; (ert-info ("Call simple command without count")
-;; (evil-test-repeat-info "x"))
-;; (ert-info ("Call simple command with count 3")
-;; (evil-test-repeat-info "3x"))))
-
-;; (ert-deftest evil-test-normal-repeat-info-char-command ()
-;; "Save key-sequence after editing command with character in Normal state"
-;; :tags '(evil repeat)
-;; (evil-test-buffer
-;; "[T]his is a test buffer"
-;; (ert-info ("Call command with character argument without count")
-;; (evil-test-repeat-info "r5"))
-;; (ert-info ("Call command with character argument with count 12")
-;; (evil-test-repeat-info "12rX"))))
-
-;; (ert-deftest evil-test-insert-repeat-info ()
-;; "Save key-sequence after Insert state"
-;; :tags '(evil repeat)
-;; (evil-test-buffer
-;; (ert-info ("Insert text without count")
-;; (evil-test-repeat-info (vconcat "iABC" [escape])))
-;; (ert-info ("Insert text with count 42")
-;; (evil-test-repeat-info (vconcat "42iABC" [escape])))))
-
-;; (ert-deftest evil-test-repeat ()
-;; "Repeat several editing commands"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat replace")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save"
-;; ("rX")
-;; "[X]; This buffer is for notes you don't want to save"
-;; ([right right] ".")
-;; "X;[X]This buffer is for notes you don't want to save"))
-;; (ert-info ("Repeat replace with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save"
-;; ("2rX")
-;; "X[X] This buffer is for notes you don't want to save"
-;; ([right right] ".")
-;; "XX X[X]is buffer is for notes you don't want to save"))
-;; (ert-info ("Repeat replace without count with a new count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save"
-;; ("rX")
-;; "[X]; This buffer is for notes you don't want to save"
-;; ([right right] "13.")
-;; "X;XXXXXXXXXXXX[X]is for notes you don't want to save"))
-;; (ert-info ("Repeat replace with count replacing original count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save"
-;; ("10rX")
-;; "XXXXXXXXX[X]ffer is for notes you don't want to save"
-;; ([right right] "20.")
-;; "XXXXXXXXXXfXXXXXXXXXXXXXXXXXXX[X] don't want to save"))
-;; (ert-info ("Repeat movement in Insert state")
-;; (evil-test-buffer
-;; ";; [T]his buffer is for notes you don't want to save"
-;; ("i(\M-f)" [escape])
-;; ";; (This[)] buffer is for notes you don't want to save"
-;; ("w.")
-;; ";; (This) (buffer[)] is for notes you don't want to save")))
+(ert-deftest evil-test-normal-repeat-info-simple-command ()
+ "Save key-sequence after simple editing command in Normal state"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[T]his is a test buffer"
+ (ert-info ("Call simple command without count")
+ (evil-test-repeat-info "x"))
+ (ert-info ("Call simple command with count 3")
+ (evil-test-repeat-info "3x"))))
+
+(ert-deftest evil-test-normal-repeat-info-char-command ()
+ "Save key-sequence after editing command with character in Normal state"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[T]his is a test buffer"
+ (ert-info ("Call command with character argument without count")
+ (evil-test-repeat-info "r5"))
+ (ert-info ("Call command with character argument with count 12")
+ (evil-test-repeat-info "12rX"))))
+
+(ert-deftest evil-test-insert-repeat-info ()
+ "Save key-sequence after Insert state"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ (ert-info ("Insert text without count")
+ (evil-test-repeat-info (vconcat "iABC" [escape])))
+ (ert-info ("Insert text with count 42")
+ (evil-test-repeat-info (vconcat "42iABC" [escape])))))
+
+(ert-deftest evil-test-repeat ()
+ "Repeat several editing commands"
+ :tags '(evil repeat)
+ (ert-info ("Repeat replace")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("rX")
+ "[X]; This buffer is for notes you don't want to save"
+ ([right right] ".")
+ "X;[X]This buffer is for notes you don't want to save"))
+ (ert-info ("Repeat replace with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("2rX")
+ "X[X] This buffer is for notes you don't want to save"
+ ([right right] ".")
+ "XX X[X]is buffer is for notes you don't want to save"))
+ (ert-info ("Repeat replace without count with a new count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("rX")
+ "[X]; This buffer is for notes you don't want to save"
+ ([right right] "13.")
+ "X;XXXXXXXXXXXX[X]is for notes you don't want to save"))
+ (ert-info ("Repeat replace with count replacing original count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("10rX")
+ "XXXXXXXXX[X]ffer is for notes you don't want to save"
+ ([right right] "20.")
+ "XXXXXXXXXXfXXXXXXXXXXXXXXXXXXX[X] don't want to save"))
+ (ert-info ("Repeat movement in Insert state")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("i(\M-f)" [escape])
+ ";; (This[)] buffer is for notes you don't want to save"
+ ("w.")
+ ";; (This) (buffer[)] is for notes you don't want to save")))
(ert-deftest evil-test-repeat-register ()
"Test repeating a register command."
@@ -1198,38 +893,38 @@ If nil, KEYS is used."
("2ievil rulz " [escape])
";; evil rulz evil rulz[ ]This buffer is for notes"))
-;; (ert-deftest evil-test-repeat-insert ()
-;; "Test repeating of `evil-insert'"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat insert")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("iABC" [escape])
-;; "AB[C];; This buffer is for notes"
-;; ("..")
-;; "ABABAB[C]CC;; This buffer is for notes"))
-;; (ert-info ("Repeat insert with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("2iABC" [escape])
-;; "ABCAB[C];; This buffer is for notes"
-;; ("..")
-;; "ABCABABCABABCAB[C]CC;; This buffer is for notes"))
-;; (ert-info ("Repeat insert with repeat count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("iABC" [escape])
-;; "AB[C];; This buffer is for notes"
-;; ("11.")
-;; "ABABCABCABCABCABCABCABCABCABCABCAB[C]C;; This buffer is for notes"))
-;; (ert-info ("Repeat insert with count with repeat with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("10iABC" [escape])
-;; "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
-;; ("11.")
-;; "ABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCABCABCABCABCAB[C]C;; \
-;; This buffer is for notes")))
+(ert-deftest evil-test-repeat-insert ()
+ "Test repeating of `evil-insert'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("iABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("..")
+ "ABABAB[C]CC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("2iABC" [escape])
+ "ABCAB[C];; This buffer is for notes"
+ ("..")
+ "ABCABABCABABCAB[C]CC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("iABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("11.")
+ "ABABCABCABCABCABCABCABCABCABCABCAB[C]C;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("10iABC" [escape])
+ "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
+ ("11.")
+ "ABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCABCABCABCABCAB[C]C;; \
+This buffer is for notes")))
(ert-deftest evil-test-repeat-error ()
"Test whether repeat returns to normal state in case of an error."
@@ -1289,38 +984,38 @@ If nil, KEYS is used."
("2aevil rulz " [escape])
";; Tevil rulz evil rulz[ ]his buffer is for notes"))
-;; (ert-deftest evil-test-repeat-append ()
-;; "Test repeating of `evil-append'"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat insert")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("aABC" [escape])
-;; ";AB[C]; This buffer is for notes"
-;; ("..")
-;; ";ABCABCAB[C]; This buffer is for notes"))
-;; (ert-info ("Repeat insert with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("2aABC" [escape])
-;; ";ABCAB[C]; This buffer is for notes"
-;; ("..")
-;; ";ABCABCABCABCABCAB[C]; This buffer is for notes"))
-;; (ert-info ("Repeat insert with repeat count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("aABC" [escape])
-;; ";AB[C]; This buffer is for notes"
-;; ("11.")
-;; ";ABCABCABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"))
-;; (ert-info ("Repeat insert with count with repeat with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes"
-;; ("10aABC" [escape])
-;; ";ABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"
-;; ("11.")
-;; ";ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]; \
-;; This buffer is for notes")))
+(ert-deftest evil-test-repeat-append ()
+ "Test repeating of `evil-append'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("aABC" [escape])
+ ";AB[C]; This buffer is for notes"
+ ("..")
+ ";ABCABCAB[C]; This buffer is for notes"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("2aABC" [escape])
+ ";ABCAB[C]; This buffer is for notes"
+ ("..")
+ ";ABCABCABCABCABCAB[C]; This buffer is for notes"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("aABC" [escape])
+ ";AB[C]; This buffer is for notes"
+ ("11.")
+ ";ABCABCABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("10aABC" [escape])
+ ";ABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"
+ ("11.")
+ ";ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]; \
+This buffer is for notes")))
(ert-deftest evil-test-append-vcount ()
"Test `evil-append' with vertical repeating"
@@ -1354,44 +1049,44 @@ If nil, KEYS is used."
evil\nrulz\nevil\nrul[z]
;; and for Lisp evaluation."))
-;; (ert-deftest evil-test-repeat-open-above ()
-;; "Test repeating of `evil-open-above'"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat insert")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save."
-;; ("Oevil\nrulz" [escape])
-;; "evil\nrul[z]
-;; ;; This buffer is for notes you don't want to save."
-;; ("..")
-;; "evil\nevil\nevil\nrul[z]\nrulz\nrulz
-;; ;; This buffer is for notes you don't want to save."))
-;; (ert-info ("Repeat insert with count")
-;; (evil-test-buffer
-;; ";; This buffer is for notes you don't want to save."
-;; ("2Oevil\nrulz" [escape])
-;; "evil\nrulz\nevil\nrul[z]
-;; ;; This buffer is for notes you don't want to save."
-;; ("..")
-;; "evil\nrulz\nevil\nevil\nrulz\nevil\nevil\nrulz\nevil\nrul[z]\nrulz\nrulz
-;; ;; This buffer is for notes you don't want to save."))
-;; (ert-info ("Repeat insert with repeat count")
-;; (evil-test-buffer
-;; ";; This buffer is for notes you don't want to save."
-;; ("Oevil\nrulz" [escape])
-;; "evil\nrul[z]\n;; This buffer is for notes you don't want to save."
-;; ("2.")
-;; "evil\nevil\nrulz\nevil\nrul[z]\nrulz
-;; ;; This buffer is for notes you don't want to save."))
-;; (ert-info ("Repeat insert with count with repeat with count")
-;; (evil-test-buffer
-;; ";; This buffer is for notes you don't want to save."
-;; ("2Oevil\nrulz" [escape])
-;; "evil\nrulz\nevil\nrul[z]
-;; ;; This buffer is for notes you don't want to save."
-;; ("3.")
-;; "evil\nrulz\nevil\nevil\nrulz\nevil\nrulz\nevil\nrul[z]\nrulz
-;; ;; This buffer is for notes you don't want to save.")))
+(ert-deftest evil-test-repeat-open-above ()
+ "Test repeating of `evil-open-above'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save."
+ ("Oevil\nrulz" [escape])
+ "evil\nrul[z]
+;; This buffer is for notes you don't want to save."
+ ("..")
+ "evil\nevil\nevil\nrul[z]\nrulz\nrulz
+;; This buffer is for notes you don't want to save."))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save."
+ ("2Oevil\nrulz" [escape])
+ "evil\nrulz\nevil\nrul[z]
+;; This buffer is for notes you don't want to save."
+ ("..")
+ "evil\nrulz\nevil\nevil\nrulz\nevil\nevil\nrulz\nevil\nrul[z]\nrulz\nrulz
+;; This buffer is for notes you don't want to save."))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save."
+ ("Oevil\nrulz" [escape])
+ "evil\nrul[z]\n;; This buffer is for notes you don't want to save."
+ ("2.")
+ "evil\nevil\nrulz\nevil\nrul[z]\nrulz
+;; This buffer is for notes you don't want to save."))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save."
+ ("2Oevil\nrulz" [escape])
+ "evil\nrulz\nevil\nrul[z]
+;; This buffer is for notes you don't want to save."
+ ("3.")
+ "evil\nrulz\nevil\nevil\nrulz\nevil\nrulz\nevil\nrul[z]\nrulz
+;; This buffer is for notes you don't want to save.")))
(ert-deftest evil-test-open-below-with-count ()
"Test insertion of `evil-open-below' with repeat count"
@@ -1404,55 +1099,55 @@ evil\nrulz\nevil\nrul[z]
evil\nrulz\nevil\nrul[z]
;; and for Lisp evaluation."))
-;; (ert-deftest evil-test-repeat-open-below ()
-;; "Test repeating `evil-open-below'"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat insert")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save,
-;; ;; and for Lisp evaluation."
-;; ("oevil\nrulz" [escape])
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrul[z]\n;; and for Lisp evaluation."
-;; ("..")
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; ;; and for Lisp evaluation."))
-;; (ert-info ("Repeat insert with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save,
-;; ;; and for Lisp evaluation."
-;; ("2oevil\nrulz" [escape])
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrulz\nevil\nrul[z]
-;; ;; and for Lisp evaluation."
-;; ("..")
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; ;; and for Lisp evaluation."))
-;; (ert-info ("Repeat insert with repeat count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save,
-;; ;; and for Lisp evaluation."
-;; ("oevil\nrulz" [escape])
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrul[z]\n;; and for Lisp evaluation."
-;; ("2.")
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; ;; and for Lisp evaluation."))
-;; (ert-info ("Repeat insert with count with repeat with count")
-;; (evil-test-buffer
-;; "[;]; This buffer is for notes you don't want to save,
-;; ;; and for Lisp evaluation."
-;; ("2oevil\nrulz" [escape])
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrulz\nevil\nrul[z]
-;; ;; and for Lisp evaluation."
-;; ("3.")
-;; ";; This buffer is for notes you don't want to save,
-;; evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; ;; and for Lisp evaluation.")))
+(ert-deftest evil-test-repeat-open-below ()
+ "Test repeating `evil-open-below'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrul[z]\n;; and for Lisp evaluation."
+ ("..")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."
+ ("..")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrul[z]\n;; and for Lisp evaluation."
+ ("2.")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."
+ ("3.")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation.")))
(ert-deftest evil-test-insert-line-with-count ()
"Test `evil-insert-line' with repeat count"
@@ -1462,37 +1157,37 @@ evil\nrulz\nevil\nrul[z]
("2Ievil rulz " [escape])
"evil rulz evil rulz[ ];; This buffer is for notes"))
-;; (ert-deftest evil-test-repeat-insert-line ()
-;; "Test repeating of `evil-insert-line'"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat insert")
-;; (evil-test-buffer
-;; ";; This buffer is for note[s]"
-;; ("IABC" [escape])
-;; "AB[C];; This buffer is for notes"
-;; ("..")
-;; "AB[C]ABCABC;; This buffer is for notes"))
-;; (ert-info ("Repeat insert with count")
-;; (evil-test-buffer
-;; ";; This buffer is for note[s]"
-;; ("2IABC" [escape])
-;; "ABCAB[C];; This buffer is for notes"
-;; ("..")
-;; "ABCAB[C]ABCABCABCABC;; This buffer is for notes"))
-;; (ert-info ("Repeat insert with repeat count")
-;; (evil-test-buffer
-;; ";; This buffer is for note[s]"
-;; ("IABC" [escape])
-;; "AB[C];; This buffer is for notes"
-;; ("11.")
-;; "ABCABCABCABCABCABCABCABCABCABCAB[C]ABC;; This buffer is for notes"))
-;; (ert-info ("Repeat insert with count with repeat with count")
-;; (evil-test-buffer
-;; ";; This buffer is for note[s]"
-;; ("10IABC" [escape])
-;; "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
-;; ("11.")
-;; "ABCABCABCABCABCABCABCABCABCABCAB[C]ABCABCABCABCABCABCABCABCABCABC;; This buffer is for notes")))
+(ert-deftest evil-test-repeat-insert-line ()
+ "Test repeating of `evil-insert-line'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("IABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("..")
+ "AB[C]ABCABC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("2IABC" [escape])
+ "ABCAB[C];; This buffer is for notes"
+ ("..")
+ "ABCAB[C]ABCABCABCABC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("IABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("11.")
+ "ABCABCABCABCABCABCABCABCABCABCAB[C]ABC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("10IABC" [escape])
+ "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
+ ("11.")
+ "ABCABCABCABCABCABCABCABCABCABCAB[C]ABCABCABCABCABCABCABCABCABCABC;; This buffer is for notes")))
(ert-deftest evil-test-insert-line-vcount ()
"Test `evil-insert-line' with vertical repeating"
@@ -1522,37 +1217,37 @@ ABCABC{
("2Aevil rulz " [escape])
";; This buffer is for notes.evil rulz evil rulz[ ]"))
-;; (ert-deftest evil-test-repeat-append-line ()
-;; "Test repeating of `evil-append-line'"
-;; :tags '(evil repeat)
-;; (ert-info ("Repeat insert")
-;; (evil-test-buffer
-;; ";; [T]his buffer is for notes."
-;; ("AABC" [escape])
-;; ";; This buffer is for notes.AB[C]"
-;; ("..")
-;; ";; This buffer is for notes.ABCABCAB[C]"))
-;; (ert-info ("Repeat insert with count")
-;; (evil-test-buffer
-;; ";; [T]his buffer is for notes."
-;; ("2AABC" [escape])
-;; ";; This buffer is for notes.ABCAB[C]"
-;; ("..")
-;; ";; This buffer is for notes.ABCABCABCABCABCAB[C]"))
-;; (ert-info ("Repeat insert with repeat count")
-;; (evil-test-buffer
-;; ";; [T]his buffer is for notes."
-;; ("AABC" [escape])
-;; ";; This buffer is for notes.ABC"
-;; ("11.")
-;; ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
-;; (ert-info ("Repeat insert with count with repeat with count")
-;; (evil-test-buffer
-;; ";; [T]his buffer is for notes."
-;; ("10AABC" [escape])
-;; ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCAB[C]"
-;; ("11.")
-;; ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]")))
+(ert-deftest evil-test-repeat-append-line ()
+ "Test repeating of `evil-append-line'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("AABC" [escape])
+ ";; This buffer is for notes.AB[C]"
+ ("..")
+ ";; This buffer is for notes.ABCABCAB[C]"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("2AABC" [escape])
+ ";; This buffer is for notes.ABCAB[C]"
+ ("..")
+ ";; This buffer is for notes.ABCABCABCABCABCAB[C]"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("AABC" [escape])
+ ";; This buffer is for notes.ABC"
+ ("11.")
+ ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("10AABC" [escape])
+ ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCAB[C]"
+ ("11.")
+ ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]")))
(ert-deftest evil-test-append-line-vcount ()
"Test `evil-append-line' with vertical repeating"
@@ -2021,7 +1716,7 @@ New Tex[t]
(ert-deftest evil-test-yank ()
"Test `evil-yank'"
- :tags '(evil operator)
+ :tags '(evil operator yank)
(ert-info ("Yank characters")
(evil-test-buffer
";; [T]his buffer is for notes you don't want to save."
@@ -2062,11 +1757,39 @@ New Tex[t]
(should (string= (current-kill 0) "Thi\nIf \nthe"))
(should (eq (car-safe (get-text-property 0 'yank-handler
(current-kill 0)))
- 'evil-yank-block-handler)))))
+ 'evil-yank-block-handler))))
+ (ert-info (":yank, then paste")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":yank" [return] "p")
+ "a\nb\nb\nc\nd\n"))
+ (ert-info (":yank with COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":yank 2" [return] "p")
+ "a\nb\nb\nc\nc\nd\n"))
+ (ert-info (":yank with COUNT in visual state")
+ (evil-test-buffer
+ "a\n<b\nc>\nd\ne\nf\n"
+ (":yank 3" [return] "p")
+ "a\nb\nc\nd\ne\nc\nd\ne\nf\n"))
+ (ert-info (":yank with REGISTER")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":yank r") ;; yank into the 'r' register
+ "a\nb\nc\nd\n"
+ ;; check the 'r' register contains the yanked text
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\n"))))
+ (ert-info (":yank with REGISTER and COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\ne\nf\n"
+ (":yank r 3")
+ "a\nb\nc\nd\ne\nf\n"
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\nc\nd\n")))))
(ert-deftest evil-test-delete ()
"Test `evil-delete'"
- :tags '(evil operator)
+ :tags '(evil operator delete)
(ert-info ("Delete characters")
(evil-test-buffer
";; This buffer is for notes you don't want to save[.]"
@@ -2111,7 +1834,35 @@ New Tex[t]
("d3s")
"[T]his buffer is for notes you don't want to save.
If you want to create a file, visit that file with C-x C-f,
-then enter the text in that file's own buffer.")))
+then enter the text in that file's own buffer."))
+ (ert-info (":delete")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":delete")
+ "a\nc\nd\n"))
+ (ert-info (":delete with COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":delete 2")
+ "a\nd\n"))
+ (ert-info (":delete with COUNT in visual state")
+ (evil-test-buffer
+ "a\n<b\nc>\nd\ne\nf\n"
+ (":delete 3")
+ "a\nb\nf\n"))
+ (ert-info (":delete with REGISTER")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":delete r") ;; delete into the 'r' register
+ "a\nc\nd\n"
+ ;; check the 'r' register contains the deleted text
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\n"))))
+ (ert-info (":delete with REGISTER and COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\ne\nf\n"
+ (":delete r 3")
+ "a\ne\nf\n"
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\nc\nd\n")))))
(ert-deftest evil-test-delete-line ()
"Test `evil-delete-line'"
@@ -2184,6 +1935,29 @@ ine3 line3 line3 l\n")))
(should-error (execute-kbd-macro (concat "i" (kbd "C-w"))))
"abc def\n[k]l\n")))
+(ert-deftest evil-test-delete-back-to-indentation ()
+ "Test `evil-delete-back-to-indentation' in insert state."
+ :tags '(evil)
+ (let ((evil-backspace-join-lines t))
+ (evil-test-buffer
+ "abc def\n ghi j[k]l\n"
+ ("i" (call-interactively #'evil-delete-back-to-indentation))
+ "abc def\n [k]l\n"
+ (left-char 2)
+ "abc def\n [ ] kl\n"
+ (call-interactively #'evil-delete-back-to-indentation)
+ "abc def\n[ ] kl\n"
+ (call-interactively #'evil-delete-back-to-indentation)
+ "abc def[ ] kl\n"))
+ (let (evil-backspace-join-lines)
+ (evil-test-buffer
+ "abc def\n[k]l\n"
+ (should-error
+ (progn
+ (execute-kbd-macro "i")
+ (call-interactively #'evil-delete-back-to-indentation)))
+ "abc def\n[k]l\n")))
+
(ert-deftest evil-test-change ()
"Test `evil-change'"
:tags '(evil operator)
@@ -2255,7 +2029,7 @@ ABCthen enter the text in that file's own buffer.")))
(ert-deftest evil-test-join ()
"Test `evil-join'"
- :tags '(evil operator)
+ :tags '(evil join operator)
(ert-info ("Simple")
(evil-test-buffer
";; [T]his buffer is for notes you don't want to save.
@@ -2270,7 +2044,53 @@ ABCthen enter the text in that file's own buffer.")))
;; If you want to create a file, visit that file with C-x C-f.>"
("J")
";; This buffer is for notes you don't want to save.[ ]\
-;; If you want to create a file, visit that file with C-x C-f.")))
+;; If you want to create a file, visit that file with C-x C-f."))
+ (ert-info ("Join with count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join 3")
+ "line 1 line 2 line 3\nline 4"))
+ (ert-info ("Join with bang and count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join! 3")
+ "line 1line 2line 3\nline 4"))
+ (ert-info ("Join with bang and count, exceeding end-of-buffer")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join! 10")
+ "line 1line 2line 3line 4"))
+ (ert-info ("Join with count 1 should be the same as without count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join 1")
+ "line 1 line 2\nline 3\nline 4"))
+ (ert-info ("Join with count 2 should be the same as with count 1")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join 2")
+ "line 1 line 2\nline 3\nline 4"))
+ (ert-info ("Join with count and single line range")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":2join 3")
+ "line 1\nline 2 line 3 line 4"))
+ (ert-info ("Join with count and range")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":1,2join 3")
+ "line 1\nline 2 line 3 line 4"))
+ (ert-info ("Join with count, range and bang")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":1,2join! 3")
+ "line 1\nline 2line 3line 4"))
+ (ert-info ("Join with range")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":1,3join")
+ "line 1 line 2 line 3\nline 4"))
+ )
(ert-deftest evil-test-substitute ()
"Test `evil-substitute'"
@@ -2574,7 +2394,19 @@ This bufferThis bufferThis buffe[r];; and for Lisp evaluation."))
("p")
";; This buffer is for notes you don't want to save.;;
;; If you want to create a file, visit that file wi;; th C-x C-f,
-;; then enter the text in that file's own buffer. ;;")))
+;; then enter the text in that file's own buffer. ;;"))
+ (ert-info ("Paste preserves preceding text properties")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (put-text-property (point) (line-end-position) 'font-lock-face 'warning)
+ ("yyp")
+ ";; This buffer is for notes you don't want to save.
+[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (should (equal (get-text-property (point-min) 'font-lock-face) 'warning)))))
(ert-deftest evil-test-paste-pop-before ()
"Test `evil-paste-pop' after `evil-paste-before'"
@@ -2904,7 +2736,7 @@ This bufferThis bufferThis buffe[r];; and for Lisp evaluation."))
";[;] This buffer is for notes."))
(ert-info ("End of line")
(let ((evil-cross-lines t)
- (evil-move-cursor-back t))
+ (evil-move-beyond-eol nil))
(evil-test-buffer
";; This buffer is for notes[,]
;; and for Lisp evaluation."
@@ -5336,6 +5168,73 @@ Below some empty line."))
("2])")
"foo ( { ( bar ) baz } [)]")))
+(ert-deftest evil-test-flyspell-motions ()
+ "Test flyspell motions"
+ :tags '(evil motion)
+ (skip-unless (executable-find "aspell"))
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[I] cannt tpye for lyfe"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "I [c]annt tpye for lyfe"
+ ("]s")
+ "I cannt [t]pye for lyfe"
+ ("]s")
+ "I cannt tpye for [l]yfe"
+ ("]s")
+ "I [c]annt tpye for lyfe"
+ ("[s")
+ "I cannt tpye for [l]yfe"
+ ("[s")
+ "I cannt [t]pye for lyfe"))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[I] cannt tpye for lyfe"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("2]s")
+ "I cannt [t]pye for lyfe"
+ ("2]s")
+ "I [c]annt tpye for lyfe"
+ ("2[s")
+ "I cannt [t]pye for lyfe"
+ ("2[s")
+ "I cannt tpye for [l]yfe"))
+ (ert-info ("With evil-search-wrap disabled")
+ (let (evil-search-wrap)
+ (evil-test-buffer
+ "[I] cannt tpye for lyfe"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "I [c]annt tpye for lyfe"
+ ("]s")
+ "I cannt [t]pye for lyfe"
+ ("]s")
+ "I cannt tpye for [l]yfe"
+ ("]s")
+ "I cannt tpye for [l]yfe")))
+ (ert-info ("One mistake")
+ (evil-test-buffer
+ "[I]'m almst there..."
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "I'm [a]lmst there..."
+ ("]s")
+ "I'm [a]lmst there..."))
+ (ert-info ("No mistakes")
+ (evil-test-buffer
+ "[I]'ve learned to type!"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "[I]'ve learned to type!"
+ ("[s")
+ "[I]'ve learned to type!")))
+
;;; Text objects
(ert-deftest evil-test-text-object ()
@@ -6604,6 +6503,44 @@ if no previous selection")
"<;; This buffer is for notes,
;;[ ]>and for Lisp evaluation.")))
+;;; Replace state
+
+(ert-deftest evil-test-replacement ()
+ "Test replacing consecutive characters"
+ :tags '(evil replace)
+ (ert-info ("Replace and restore consecutive characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("Rfoo")
+ ";; foo[s] buffer is for notes"
+ ([backspace backspace backspace])
+ ";; [T]his buffer is for notes"))
+ (ert-info ("Replace and restore consecutive characters beyond eol")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("wwwwRxxxxxxx")
+ ";; This buffer is for xxxxxxx[]"
+ ([backspace backspace backspace backspace backspace backspace backspace])
+ ";; This buffer is for [n]otes"))
+ (ert-info ("Replace from line below and restore")
+ (define-key evil-replace-state-map (kbd "C-e") 'evil-copy-from-below)
+ (evil-test-buffer
+ ";; [f]oo bar\n;; qux quux"
+ ("R\C-e\C-e\C-e")
+ ";; qux[ ]bar\n;; qux quux"
+ ([backspace backspace backspace])
+ ";; [f]oo bar\n;; qux quux")
+ (define-key evil-replace-state-map (kbd "C-e") nil))
+ (ert-info ("Replace from line above and restore")
+ (define-key evil-replace-state-map (kbd "C-y") 'evil-copy-from-above)
+ (evil-test-buffer
+ ";; foo bar\n;; [q]ux quux"
+ ("R\C-y\C-y\C-y")
+ ";; foo bar\n;; foo[ ]quux"
+ ([backspace backspace backspace])
+ ";; foo bar\n;; [q]ux quux")
+ (define-key evil-replace-state-map (kbd "C-y") nil)))
+
;;; Ex
(ert-deftest evil-test-ex-parse ()
@@ -6629,7 +6566,22 @@ if no previous selection")
(evil-ex-line (string-to-number "5") nil)
(evil-ex-line (string-to-number "2") nil))
"arg"
- nil))))
+ nil)))
+ (should (equal (evil-ex-parse "+1,+2t-1")
+ '(evil-ex-call-command
+ (evil-ex-range
+ (evil-ex-line
+ nil
+ (+ (evil-ex-signed-number
+ (intern "+")
+ (string-to-number "1"))))
+ (evil-ex-line
+ nil
+ (+ (evil-ex-signed-number
+ (intern "+")
+ (string-to-number "2")))))
+ "t"
+ "-1"))))
(ert-deftest evil-test-ex-parse-ranges ()
"Test parsing of ranges"
@@ -6710,6 +6662,18 @@ if no previous selection")
(intern "+") (string-to-number "42"))))
nil))))
+(ert-deftest evil-test-ex-parse-emacs-commands ()
+ "Test parsing of Emacs commands"
+ :tags '(evil ex)
+ (should (equal (evil-ex-parse "ido-mode")
+ '(evil-ex-call-command nil "ido-mode" nil)))
+ (should (equal (evil-ex-parse "yas/reload-all")
+ '(evil-ex-call-command nil "yas/reload-all" nil)))
+ (should (equal (evil-ex-parse "mu4e")
+ '(evil-ex-call-command nil "mu4e" nil)))
+ (should (equal (evil-ex-parse "make-frame")
+ '(evil-ex-call-command nil "make-frame" nil))))
+
(ert-deftest evil-text-ex-search-offset ()
"Test for addresses like /base//pattern/"
:tags '(evil ex)
@@ -6887,7 +6851,52 @@ if no previous selection")
(evil-test-buffer
"[a]bc\niiiXiiiXiiiXiii\n"
("\"ayiwj:s/X/\\=@a/g" [return])
- "abc\n[i]iiabciiiabciiiabciii\n")))
+ "abc\n[i]iiabciiiabciiiabciii\n"))
+ (ert-info ("Substitute newlines")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi\n"
+ (":%s/\n/z/" [return])
+ "[a]bczdefzghiz"))
+ (ert-info ("Substitute newlines with g flag")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi\n"
+ (":%s/\n/z/g" [return])
+ "[a]bczdefzghiz"))
+ (ert-info ("Substitute newlines without newline in regexp")
+ (evil-test-buffer
+ "[A]BC\nDEF\nGHI\n"
+ (":%s/[^]]*/z/" [return])
+ "Z"))
+ (ert-info ("Substitute n flag does not replace")
+ (evil-test-buffer
+ "[a]bc\naef\nahi\n"
+ (":%s/a//n" [return])
+ "[a]bc\naef\nahi\n"))
+ (ert-info ("Substitute n flag does not replace with g flag")
+ (evil-test-buffer
+ "[a]bc\naef\nahi\n"
+ (":%s/a//gn" [return])
+ "[a]bc\naef\nahi\n"))
+ (ert-info ("Substitute $ does not loop infinitely")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi"
+ (":%s/$/ END/g" [return])
+ "abc END\ndef END\n[g]hi END"))
+ (ert-info ("Substitute the zero-length beginning of line character")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi"
+ (":s/^/ #/" [return])
+ " [#]abc\ndef\nghi"))
+ (ert-info ("Substitute the zero-length beginning of line character with g flag")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi"
+ (":s/^/ #/g" [return])
+ " [#]abc\ndef\nghi"))
+ (ert-info ("Use Substitute to delete individual characters")
+ (evil-test-buffer
+ "[x]xyxxz"
+ (":%s/x//g" [return])
+ "[y]z")))
(ert-deftest evil-test-ex-repeat-substitute-replacement ()
"Test `evil-ex-substitute' with repeating of previous substitutions."
@@ -7075,7 +7084,18 @@ if no previous selection")
(error search-failed "n")
"foo foo foo\nbar [b]ar\nbaz baz baz\n"
(error search-failed "N")
- "foo foo foo\nbar [b]ar\nbaz baz baz\n"))))
+ "foo foo foo\nbar [b]ar\nbaz baz baz\n"))
+ (ert-info ("Test search for newline")
+ (evil-test-buffer
+ "[s]tart\nline 2\nline 3\n\n"
+ ("/\\n" [return])
+ "star[t]\nline 2\nline 3\n\n"
+ ("n")
+ "start\nline [2]\nline 3\n\n"
+ ("n")
+ "start\nline 2\nline [3]\n\n"
+ ("n")
+ "start\nline 2\nline 3\n[]\n"))))
(ert-deftest evil-test-ex-search-offset ()
"Test search offsets."
@@ -7360,7 +7380,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-global ()
"Test `evil-ex-global'."
- :tags '(evil ex)
+ :tags '(evil ex global)
(ert-info ("global delete")
(evil-test-buffer
"[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
@@ -7372,7 +7392,55 @@ maybe we need one line more with some text\n")
(":g/no/s/[3-6]/x" [return])
"no 1\nno 2\nno x\nyes 4\nno x\nno x\n[n]o 7\n"
("u")
- "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n")))
+ "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n"))
+ (ert-info ("global substitute with trailing slash")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ (":g/no/s/[3-6]/x/" [return])
+ "no 1\nno 2\nno x\nyes 4\nno x\nno x\n[n]o 7\n"
+ ("u")
+ "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n"))
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("global use last match if none given, with evil-search")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ ("/yes" [return])
+ "no 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ (":g//d" [return])
+ "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"
+ (":v//d" [return])
+ ""))
+ (evil-select-search-module 'evil-search-module 'isearch)
+ (ert-info ("global use last match if none given, with isearch")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nisearch 4\nno 5\nno 6\nno 7\n"
+ ("/isearch" [return])
+ "no 1\nno 2\nno 3\nisearch 4\nno 5\nno 6\nno 7\n"
+ (":g//d" [return])
+ "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"
+ (":v//d" [return])
+ ""))
+ (ert-info (":global should take into account evil-ex-search-case")
+ (evil-with-both-search-modules
+ (let ((evil-ex-search-case 'sensitive))
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/this/d" [return])
+ "This\n"))
+ (let ((evil-ex-search-case 'insensitive))
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/this/d" [return])
+ ""))
+ (let ((evil-ex-search-case 'smart))
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/this/d" [return])
+ "")
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/This/d" [return])
+ "this\n")))))
(ert-deftest evil-test-normal ()
"Test `evil-ex-normal'."
@@ -7472,22 +7540,27 @@ maybe we need one line more with some text\n")
"line1\nline2\nline3\nline4\nline5\n"
(":w")
(file filename "line1\nline2\nline3\nline4\nline5\n"))))
- (let ((filename (evil-temp-filename)))
- (ert-info ("Write current buffer to new file")
+ (ert-info ("Write current buffer to new file")
+ (let ((filename (make-temp-file "evil-test-write")))
(evil-test-buffer
"[l]ine1\nline2\nline3\nline4\nline5\n"
+ (delete-file filename)
((vconcat ":w " filename [return]))
(file filename "line1\nline2\nline3\nline4\nline5\n")
- (delete-file filename)))
- (ert-info ("Write part of a buffer")
+ (delete-file filename))))
+ (ert-info ("Write part of a buffer")
+ (let ((filename (make-temp-file "evil-test-write")))
(evil-test-buffer
"[l]ine1\nline2\nline3\nline4\nline5\n"
+ (delete-file filename)
((vconcat ":2,3w " filename [return]))
(file filename "line2\nline3\n")
- (delete-file filename)))
- (ert-info ("Appending a file")
+ (delete-file filename))))
+ (ert-info ("Appending a file")
+ (let ((filename (make-temp-file "evil-test-write")))
(evil-test-buffer
"[l]ine1\nline2\nline3\nline4\nline5\n"
+ (delete-file filename)
((vconcat ":4w " filename [return]))
(file filename "line4\n")
((vconcat ":1,2w >>" filename [return]))
@@ -7530,6 +7603,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-command-window-ex ()
"Test command line window for ex commands"
+ (skip-unless (not noninteractive))
(let (evil-ex-history)
(evil-test-buffer
"[f]oo foo foo"
@@ -7550,6 +7624,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-command-window-recursive ()
"Test that recursive command windows shouldn't be allowed"
+ (skip-unless (not noninteractive))
(let ((evil-command-window-height 0))
(evil-test-buffer
"[f]oo foo foo"
@@ -7559,6 +7634,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-command-window-noop ()
"Test that executing a blank command does nothing"
+ (skip-unless (not noninteractive))
(evil-test-buffer
"[f]oo foo foo"
("q:")
@@ -7568,6 +7644,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-command-window-multiple ()
"Test that multiple command line windows can't be visible at the same time"
+ (skip-unless (not noninteractive))
(let ((evil-command-window-height 0))
(evil-test-buffer
"[f]oo foo foo"
@@ -7588,6 +7665,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-command-window-search-history ()
"Test command window with forward and backward search history"
+ (skip-unless (not noninteractive))
(let ((evil-search-module 'isearch))
(evil-test-buffer
"[f]oo bar baz qux one two three four"
@@ -7618,6 +7696,7 @@ maybe we need one line more with some text\n")
(ert-deftest evil-test-command-window-search-word ()
"Test command window history when searching for word under cursor"
+ (skip-unless (not noninteractive))
(let ((evil-search-module 'isearch))
(evil-test-buffer
"[f]oo bar foo bar foo"
@@ -8153,15 +8232,6 @@ maybe we need one line more with some text\n")
"z z z [z] z z z z z z"
("\C-i\C-i")
"z z z z z [z] z z z z"))
- (ert-info ("Test jumping backward and forward across buffers")
- (evil-test-buffer
- "[z] z z z z z z z z z"
- (":new" [return] "inew buffer" [escape])
- "new buffe[r]"
- ("\C-o")
- "[z] z z z z z z z z z"
- ("\C-i")
- "new buffe[r]"))
(ert-info ("Test jumping backward and forward with counts")
(evil-test-buffer
"[z] z z z z z z z z z"
@@ -8184,6 +8254,167 @@ maybe we need one line more with some text\n")
("3\C-i") ;; even after jumping forward 3 times it can't get past the 3rd z
"z z [z] z z z z z"))))
+(ert-deftest evil-test-jump-buffers ()
+ :tags '(evil jums)
+ (skip-unless nil)
+ (ert-info ("Test jumping backward and forward across buffers")
+ (evil-test-buffer
+ "[z] z z z z z z z z z"
+ (":new" [return] "inew buffer" [escape])
+ "new buffe[r]"
+ ("\C-o")
+ "[z] z z z z z z z z z"
+ ("\C-i")
+ "new buffe[r]")))
+
+(ert-deftest evil-test-abbrev-expand ()
+ :tags '(evil abbrev)
+ (ert-info ("Test abbrev expansion on insert state exit")
+ (define-abbrev-table 'global-abbrev-table
+ '(("undef" "undefined"))) ; add global abbrev
+ (evil-test-buffer
+ "foo unde[f] bar"
+ (abbrev-mode)
+ ("a" [escape])
+ "foo undefine[d] bar") ; 'undef' should be expanded
+ (evil-test-buffer
+ "foo unde[f] bar"
+ ("a" [escape])
+ "foo unde[f] bar") ; 'undef' shouldn't be expanded,
+ ; abbrev-mode is not enabled
+ (evil-test-buffer
+ "fo[o] undef bar"
+ (abbrev-mode)
+ ("a" [escape])
+ "fo[o] undef bar") ; 'foo' shouldn't be expanded,
+ ; it's not an abbrev
+ (kill-all-abbrevs) ; remove all abbrevs
+ (evil-test-buffer
+ "foo unde[f] bar"
+ (abbrev-mode)
+ ("a" [escape])
+ "foo unde[f] bar") ; 'undef' shouldn't be expanded,
+ ; it's not an abbrev
+ (setq abbrevs-changed nil)))
+
+(ert-deftest evil-test-text-object-macro ()
+ :tags '(evil abbrev)
+ (ert-info ("Test pipe character and other delimiters as object delimiters")
+ ;; This is the macro that broke after pull #747.
+ (defmacro evil-test-define-and-bind-text-object (name key start-regex end-regex)
+ (let ((inner-name (make-symbol (concat "evil-inner-" name)))
+ (outer-name (make-symbol (concat "evil-a-" name))))
+ `(progn
+ (evil-define-text-object ,inner-name (count &optional beg end type)
+ (evil-select-paren ,start-regex ,end-regex beg end type count nil))
+ (evil-define-text-object ,outer-name (count &optional beg end type)
+ (evil-select-paren ,start-regex ,end-regex beg end type count t))
+ (define-key evil-inner-text-objects-map ,key #',inner-name)
+ (define-key evil-outer-text-objects-map ,key #',outer-name))))
+ (evil-test-define-and-bind-text-object "pipe" "|" "|" "|")
+ (evil-test-define-and-bind-text-object "rackety" "#" "#|" "|#")
+
+ (evil-test-buffer
+ "#|this i[s] a test #|with rackety|# multiline
+ and nestable comments|#"
+ ("vi#")
+ "#|<this is a test #|with rackety|# multiline
+ and nestable comments>|#")
+ (evil-test-buffer
+ "| foo | aoe[u] | bar |"
+ ("vi|")
+ "| foo |< aoeu >| bar |"
+ ("a|")
+ "| foo <| aoeu |> bar |"
+ ("a|")
+ "<| foo | aoeu | bar |>")
+ (evil-test-buffer
+ "| foo | aoe[u] | bar |"
+ ("ci|testing" [escape])
+ "| foo |testing| bar |")))
+
+(ert-deftest evil-test-undo-kbd-macro ()
+ "Test if evil can undo the changes made by a keyboard macro
+when an error stops the execution of the macro"
+ :tags '(evil undo kbd-macro)
+ (ert-info ("When kbd-macro goes to the end of buffer")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (evil-set-register ?q "jdd")
+ ("jdd")
+ (should-error (execute-kbd-macro "2@q"))
+ ("uu")
+ "line 1\n[l]ine 2\nline 3\nline 4"))
+ (ert-info ("When kbd-macro goes to the end of line")
+ (evil-test-buffer
+ "[f]ofof"
+ (evil-set-register ?q "lx")
+ ("lx")
+ (should-error (execute-kbd-macro "2@q"))
+ ("uu")
+ "f[o]fof"))
+ (ert-info ("When kbd-macro goes to the beginning of buffer")
+ (evil-test-buffer
+ "line 1\nline 2\n[l]ine 3"
+ (evil-set-register ?q "kx")
+ ("kx")
+ (should-error (execute-kbd-macro "2@q"))
+ ("uu")
+ "line 1\n[l]ine 2\nline 3")))
+
+(ert-deftest evil-test-visual-update-x-selection ()
+ "Test `evil-visual-update-x-selection'."
+ :tags '(evil)
+ (ert-info ("Buffer argument isn't a live buffer")
+ ;; create buffer in normal mode, so we don't try to actually copy anything to
+ ;; the X selection.
+ (let ((buf (evil-test-buffer-from-string "foobar")))
+ (kill-buffer buf)
+ ;; should not raise an "Selecting deleted buffer" error
+ (evil-visual-update-x-selection buf))))
+
+;;; Core
+
+(ert-deftest evil-test-initial-state ()
+ "Test `evil-initial-state'"
+ :tags '(evil core)
+ (define-derived-mode test-1-mode prog-mode "Test1")
+ (define-derived-mode test-2-mode test-1-mode "Test2")
+ (evil-set-initial-state 'test-1-mode 'insert)
+ (ert-info ("Check default state")
+ (should (eq (evil-initial-state 'prog-mode 'normal) 'normal)))
+ (ert-info ("Basic functionality 1")
+ (should (eq (evil-initial-state 'test-1-mode) 'insert)))
+ (ert-info ("Basic functionality 2")
+ (evil-test-buffer
+ "abc\ndef\n"
+ (test-1-mode)
+ (should (eq evil-state 'insert))))
+ (ert-info ("Inherit initial state from a parent")
+ (evil-test-buffer
+ "abc\ndef\n"
+ (test-2-mode)
+ (should (eq evil-state 'insert))))
+ (evil-set-initial-state 'test-1-mode nil)
+ (ert-info ("Check for inheritance loops")
+ (evil-test-buffer
+ "abc\ndef\n"
+ (unwind-protect
+ (let ((major-mode 'test-2-mode))
+ (put 'test-1-mode 'derived-mode-parent 'test-2-mode)
+ ;; avoid triggering all of the hooks here, some of which might get
+ ;; caught in loops depending on the environment. settings major-mode
+ ;; is sufficient for `evil-initial-state-for-buffer' to work.
+ (should-error (evil-initial-state-for-buffer)))
+ (put 'test-1-mode 'derived-mode-parent 'prog-mode))))
+ (defalias 'test-1-alias-mode 'test-1-mode)
+ (define-derived-mode test-3-mode test-1-alias-mode "Test3")
+ (evil-set-initial-state 'test-1-mode 'insert)
+ (ert-info ("Check inheritance from major mode aliases")
+ "abc\ndef\n"
+ (test-3-mode)
+ (should (eq evil-state 'insert))))
+
(provide 'evil-tests)
;;; evil-tests.el ends here
diff --git a/evil-types.el b/evil-types.el
index 1729803..d72466e 100644
--- a/evil-types.el
+++ b/evil-types.el
@@ -1,9 +1,9 @@
-;;; evil-types.el --- Type system
+;;; evil-types.el --- Type system -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -141,6 +141,36 @@ line and `evil-want-visual-char-semi-exclusive', then:
(format "%s line%s" height
(if (= height 1) "" "s")))))
+(evil-define-type screen-line
+ "Include whole lines, being aware of `visual-line-mode'
+when `evil-respect-visual-line-mode' is non-nil."
+ :one-to-one nil
+ :expand (lambda (beg end)
+ (if (or (not evil-respect-visual-line-mode)
+ (not visual-line-mode))
+ (evil-line-expand beg end)
+ (evil-range
+ (progn
+ (goto-char beg)
+ (save-excursion
+ (beginning-of-visual-line)))
+ (progn
+ (goto-char end)
+ (save-excursion
+ ;; `beginning-of-visual-line' reverts to the beginning of the
+ ;; last visual line if the end of the last line is the end of
+ ;; the buffer. This would prevent selecting the last screen
+ ;; line.
+ (if (= (line-beginning-position 2) (point-max))
+ (point-max)
+ (beginning-of-visual-line 2)))))))
+ :contract (lambda (beg end)
+ (evil-range beg (max beg (1- end))))
+ :string (lambda (beg end)
+ (let ((height (count-screen-lines beg end)))
+ (format "%s screen line%s" height
+ (if (= height 1) "" "s")))))
+
(evil-define-type block
"Like `inclusive', but for rectangles:
the last column is included."
@@ -370,6 +400,55 @@ If visual state is inactive then those values are nil."
(when (evil-ex-p)
(evil-ex-get-substitute-info evil-ex-argument t)))
+(evil-define-interactive-code "<xc/>"
+ "Ex register and count argument, both optional.
+Can be used for commands such as :delete [REGISTER] [COUNT] where the
+command can be called with either zero, one or two arguments. When the
+argument is one, if it's numeric it's treated as a COUNT, otherwise -
+REGISTER"
+ (when (evil-ex-p)
+ (evil-ex-get-optional-register-and-count evil-ex-argument)))
+
+(defun evil-ex-get-optional-register-and-count (string)
+ "Parse STRING as an ex arg with both optional REGISTER and COUNT.
+Returns a list (REGISTER COUNT)."
+ (let* ((split-args (split-string (or string "")))
+ (arg-count (length split-args))
+ (arg0 (car split-args))
+ (arg1 (cadr split-args))
+ (number-regex "^-?[1-9][0-9]*$")
+ (register nil)
+ (count nil))
+ (cond
+ ;; :command REGISTER or :command COUNT
+ ((= arg-count 1)
+ (if (string-match-p number-regex arg0)
+ (setq count arg0)
+ (setq register arg0)))
+ ;; :command REGISTER COUNT
+ ((eq arg-count 2)
+ (setq register arg0
+ count arg1))
+ ;; more than 2 args aren't allowed
+ ((> arg-count 2)
+ (user-error "Invalid use")))
+
+ ;; if register is given, check it's valid
+ (when register
+ (unless (= (length register) 1)
+ (user-error "Invalid register"))
+ (setq register (string-to-char register)))
+
+ ;; if count is given, check it's valid
+ (when count
+ (unless (string-match-p number-regex count)
+ (user-error "Invalid count"))
+ (setq count (string-to-number count))
+ (unless (> count 0)
+ (user-error "Invalid count")))
+
+ (list register count)))
+
(provide 'evil-types)
;;; evil-types.el ends here
diff --git a/evil-vars.el b/evil-vars.el
index 740785c..97720d0 100644
--- a/evil-vars.el
+++ b/evil-vars.el
@@ -1,9 +1,9 @@
-;;; evil-vars.el --- Settings and variables
+;;; evil-vars.el --- Settings and variables -*- lexical-binding: t -*-
;; Author: Vegard Øye <vegard_oye at hotmail.com>
;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-;; Version: 1.2.12
+;; Version: 1.14.0
;;
;; This file is NOT part of GNU Emacs.
@@ -35,15 +35,24 @@
;;; Hooks
(defvar evil-after-load-hook nil
- "Functions to be run when loading of evil is finished.
+ "Functions to be run when loading of Evil is finished.
This hook can be used the execute some initialization routines
-when evil is completely loaded.")
+when Evil is completely loaded.")
+
+(defcustom evil-goto-definition-functions
+ '(evil-goto-definition-imenu
+ evil-goto-definition-semantic
+ evil-goto-definition-xref
+ evil-goto-definition-search)
+ "List of functions run until success by `evil-goto-definition'."
+ :type 'hook
+ :group 'evil)
;;; Initialization
(defvar evil-pending-custom-initialize nil
"A list of pending initializations for custom variables.
-Each element is a triple (FUNC VAR VALUE). When evil is
+Each element is a triple (FUNC VAR VALUE). When Evil is
completely loaded then the functions (funcall FUNC VAR VALUE) is
called for each element. FUNC should be a function suitable for
the :initialize property of `defcustom'.")
@@ -82,7 +91,7 @@ KEY must be readable by `read-kbd-macro'."
(define-key map key fun)
(define-key map old-key nil))))))))
-(defun evil-set-custom-state-maps (var pending-var key make newlist)
+(defun evil-set-custom-state-maps (var pending-var key _make newlist)
"Changes the list of special keymaps.
VAR is the variable containing the list of keymaps.
PENDING-VAR is the variable containing the list of the currently pending
@@ -99,7 +108,7 @@ NEWLIST the list of new special keymaps."
(set-default var newlist)
(evil-update-pending-maps))
-(defun evil-update-pending-maps (&optional file)
+(defun evil-update-pending-maps (&optional _file)
"Tries to set pending special keymaps.
This function should be called from an `after-load-functions'
hook."
@@ -151,30 +160,36 @@ commands."
:prefix 'evil-)
(defcustom evil-auto-indent t
- "Whether to auto-indent when entering Insert state."
+ "\\<evil-normal-state-map>
+Whether to auto-indent when opening lines with \\[evil-open-below] \
+and \\[evil-open-above]."
:type 'boolean
:group 'evil)
(make-variable-buffer-local 'evil-auto-indent)
(defcustom evil-shift-width 4
- "The offset used by \\<evil-normal-state-map>\\[evil-shift-right] \
-and \\[evil-shift-left]."
+ "\\<evil-normal-state-map>
+The number of columns by which a line is shifted.
+This applies to the shifting operators \\[evil-shift-right] and \
+\\[evil-shift-left]."
:type 'integer
:group 'evil)
(make-variable-buffer-local 'evil-shift-width)
(defcustom evil-shift-round t
- "Whether \\<evil-normal-state-map>\\[evil-shift-right] \
-and \\[evil-shift-left] round to the nearest multiple \
-of `evil-shift-width'."
+ "\\<evil-normal-state-map>
+Whether shifting rounds to the nearest multiple.
+If non-nil, \\[evil-shift-right] and \\[evil-shift-left] adjust line
+indentation to the nearest multiple of `evil-shift-width'."
:type 'boolean
:group 'evil)
(make-variable-buffer-local 'evil-shift-round)
(defcustom evil-indent-convert-tabs t
- "If non-nil `evil-indent' converts between leading tabs and spaces.
- Whether tabs are converted to spaces or vice versa depends on the
- value of `indent-tabs-mode'."
+ "\\<evil-normal-state-map>
+If non-nil, the \\[evil-indent] operator converts between leading tabs and spaces.
+Whether tabs are converted to spaces or vice versa depends on the
+value of `indent-tabs-mode'."
:type 'boolean
:group 'evil)
@@ -190,13 +205,23 @@ cursor, or a list of the above."
"Overwrite the current states default cursor.")
(defcustom evil-repeat-move-cursor t
- "Whether \"\\<evil-normal-state-map>\\[evil-repeat]\" \
-moves the cursor."
+ "\\<evil-normal-state-map>
+Whether repeating commands with \\[evil-repeat] may move the cursor.
+If nil, the original cursor position is preserved, even if the command
+normally would have moved the cursor."
:type 'boolean
:group 'evil)
(defcustom evil-cross-lines nil
- "Whether motions may cross newlines."
+ "\\<evil-motion-state-map>
+Whether horizontal motions may move to other lines. If non-nil,
+certain motions that conventionally operate in a single line may move
+the cursor to other lines. Otherwise, they are restricted to the
+current line. This applies to \\[evil-backward-char], \
+\\[evil-forward-char], \\[evil-find-char], \
+\\[evil-find-char-backward], \\[evil-find-char-to], \
+\\[evil-find-char-to-backward], \
+\\<evil-normal-state-map>\\[evil-invert-char]."
:type 'boolean
:group 'evil)
@@ -206,13 +231,30 @@ moves the cursor."
:group 'evil)
(defcustom evil-move-cursor-back t
- "Whether the cursor is moved backwards when exiting Insert state."
+ "Whether the cursor is moved backwards when exiting insert state.
+If non-nil, the cursor moves \"backwards\" when exiting insert state,
+so that it ends up on the character to the left. Otherwise it remains
+in place, on the character to the right."
:type 'boolean
:group 'evil)
(defcustom evil-move-beyond-eol nil
- "Whether the cursor is allowed to move past the last character of \
-a line."
+ "Whether the cursor can move past the end of the line.
+If non-nil, the cursor is allowed to move one character past the
+end of the line, as in Emacs."
+ :type 'boolean
+ :group 'evil)
+
+(defcustom evil-respect-visual-line-mode nil
+ "\\<evil-motion-state-map>
+Whether movement commands respect `visual-line-mode'.
+If non-nil, `visual-line-mode' is generally respected when it is
+on. In this case, motions such as \\[evil-next-line] and
+\\[evil-previous-line] navigate by visual lines (on the screen) rather
+than \"physical\" lines (defined by newline characters). If nil,
+the setting of `visual-line-mode' is ignored.
+
+This variable must be set before Evil is loaded."
:type 'boolean
:group 'evil)
@@ -222,13 +264,20 @@ a line."
:group 'evil)
(defcustom evil-kbd-macro-suppress-motion-error nil
- "Whether left/right motions signal errors during keyboard-macro definition.
-If this variable is set to non-nil, then the function
-`evil-forward-char' and `evil-backward-char' do not signal
-`end-of-line' or `beginning-of-line' errors when a keyboard macro
-is being defined and/or it is being executed. This may be desired
-because such an error would cause the macro definition/execution
-being terminated."
+ "\\<evil-motion-state-map>
+Whether left/right motions signal errors in keyboard macros.
+This variable only affects beginning-of-line or end-of-line errors
+regarding the motions \\[evil-backward-char] and \\[evil-forward-char]
+respectively. This may be desired since such errors cause macro
+definition or execution to be terminated. There are four
+possibilities:
+
+- `record': errors are suppressed when recording macros, but not when
+ replaying them.
+- `replay': errors are suppressed when replaying macros, but not when
+ recording them.
+- `t': errors are suppressed in both cases.
+- `nil': errors are never suppressed."
:type '(radio (const :tag "No" :value nil)
(const :tag "Record" :value record)
(const :tag "Replay" :value replay)
@@ -236,22 +285,22 @@ being terminated."
:group 'evil)
(defcustom evil-track-eol t
- "If non-nil line moves after a call to `evil-end-of-line' stay at eol.
-This is analogous to `track-eol' but deals with the end-of-line
-interpretation of evil."
+ "\\<evil-motion-state-map>
+Whether \\[evil-end-of-line] \"sticks\" the cursor to the end of the line.
+If non-nil, vertical motions after \\[evil-end-of-line] maintain the cursor at the
+end of the line, even if the target line is longer. This is analogous
+to `track-eol', but respects Evil's interpretation of end-of-line."
:type 'boolean
:group 'evil)
(defcustom evil-mode-line-format 'before
- "The position of the mode line tag.
-Either a symbol or a cons-cell. If it is a symbol it should be
-one of 'before, 'after or 'nil. 'before mean the the tag is
-placed before the mode-list, 'after means it is placed after the
-mode-list, and 'nil means no mode line tag. If it is a cons cell
-it should have the form (WHERE . WHICH) where WHERE is either
-'before or 'after and WHICH is a symbol in
-`mode-line-format'. The tag is then placed right before or after
-that symbol."
+ "The position of the state tag in the mode line.
+If set to `before' or `after', the tag is placed at the beginning
+or the end of the mode-line, respectively. If nil, there is no
+tag. Otherwise it should be a cons cell (WHERE . WHICH), where
+WHERE is either `before' or `after', and WHICH is a symbol in
+`mode-line-format'. The tag is then placed before or after that
+symbol, respectively."
:type '(radio :value 'before
(const before)
(const after)
@@ -266,59 +315,59 @@ that symbol."
"The thing-at-point symbol for double click selection.
The double-click starts visual state in a special word selection
mode. This symbol is used to determine the words to be
-selected. Possible values are 'evil-word or
-'evil-WORD."
+selected. Possible values are `evil-word' or `evil-WORD'."
:type 'symbol
:group 'evil)
(defcustom evil-bigword "^ \t\r\n"
- "The characters to be considered as a big word.
-This should be a regexp set without the enclosing []."
+ "The set of characters to be interpreted as WORD boundaries.
+This is enclosed with square brackets and used as a regular
+expression. By default, whitespace characters are considered
+WORD boundaries."
:type 'string
:group 'evil)
(make-variable-buffer-local 'evil-bigword)
(defcustom evil-want-fine-undo nil
- "Whether actions like \"cw\" are undone in several steps.
-There are three possible choices. \"No\" means all changes made
-during insert state including a possible delete after a change
-operation are collected in a single undo step. If \"Yes\" is
-selected, undo steps are determined according to Emacs heuristics
-and no attempt is made to further aggregate changes.
-
-As of 1.2.13, the option \"fine\" is ignored and means the same
-thing as \"No\". It used to be the case that fine would only try
-to merge the first two changes in an insert operation. For
-example, merging the delete and first insert operation after
-\"cw\", but this option was removed because it did not work
-consistently."
+ "Whether actions are undone in several steps.
+There are two possible choices: nil (\"no\") means that all
+changes made during insert state, including a possible delete
+after a change operation, are collected in a single undo step.
+Non-nil (\"yes\") means that undo steps are determined according
+to Emacs heuristics, and no attempt is made to aggregate changes.
+
+For backward compatibility purposes, the value `fine' is
+interpreted as `nil'. This option was removed because it did not
+work consistently."
:type '(radio (const :tag "No" :value nil)
(const :tag "Fine (obsolete)" :value fine)
(const :tag "Yes" :value t))
:group 'evil)
(defcustom evil-regexp-search t
- "Whether to use regular expressions for searching."
+ "\\<evil-motion-state-map>
+Whether to use regular expressions for searching in \
+\\[evil-search-forward] and \\[evil-search-backward]."
:type 'boolean
:group 'evil)
(defcustom evil-search-wrap t
- "Whether search wraps around."
+ "\\<evil-motion-state-map>
+Whether search with \\[evil-search-forward] and \
+\\[evil-search-backward] wraps around the buffer.
+If this is non-nil, search stops at the buffer boundaries."
:type 'boolean
:group 'evil)
(defcustom evil-flash-delay 2
- "Time in seconds to flash search matches."
+ "\\<evil-motion-state-map>
+Time in seconds to flash search matches after \\[evil-search-next] and \
+\\[evil-search-previous]."
:type 'number
:group 'evil)
-(defcustom evil-fold-level 0
- "Default fold level."
- :type 'integer
- :group 'evil)
-
(defcustom evil-auto-balance-windows t
- "If non-nil creating/deleting a window causes a rebalance."
+ "If non-nil window creation and deletion trigger rebalancing."
:type 'boolean
:group 'evil)
@@ -328,12 +377,16 @@ consistently."
:group 'evil)
(defcustom evil-vsplit-window-right nil
- "If non-nil vsplit windows are created to the right."
+ "If non-nil vertically split windows with are created to the right."
:type 'boolean
:group 'evil)
(defcustom evil-esc-delay 0.01
- "Time in seconds to wait for another key after ESC."
+ "The time, in seconds, to wait for another key after escape.
+If no further event arrives during this time, the event is
+translated to `ESC'. Otherwise, it is translated according to
+`input-decode-map'. This does not apply in Emacs state, and may
+also be inhibited by setting `evil-inhibit-esc'."
:type 'number
:group 'evil)
@@ -348,14 +401,14 @@ Used by `evil-esc-mode'.")
"If non-nil, the \\e event will never be translated to 'escape.")
(defcustom evil-intercept-esc 'always
- "Whether evil should intercept the ESC key.
-In terminal, a plain ESC key and a meta-key-sequence both
-generate the same event. In order to distinguish both evil
-modifies `input-decode-map'. This is necessary in terminal but
-not in X mode. However, the terminal ESC is equivalent to C-[, so
-if you want to use C-[ instead of ESC in X, then Evil must
-intercept the ESC event in X, too. This variable determines when
-Evil should intercept the event."
+ "Whether Evil should intercept the escape key.
+In the terminal, escape and a meta key sequence both generate the
+same event. In order to distingush these, Evil uses
+`input-decode-map'. It is not necessary to do this in a graphical
+Emacs session. However, if you prefer to use `C-[' as escape (which
+is identical to the terminal escape key code), this interception must
+also happen in graphical Emacs sessions. Set this variable to
+`always', t (only in the terminal) or nil (never intercept)."
:type '(radio (const :tag "Never" :value nil)
(const :tag "In terminal only" :value t)
(const :tag "Always" :value always))
@@ -378,16 +431,24 @@ rate allows highlights to update while scrolling."
'(not emacs insert replace)
"The states in which the closing parenthesis at point should be highlighted.
All states listed here highlight the closing parenthesis at
-point (which is Vim default behavior), all others highlight the
+point (which is Vim's default behavior). All others highlight the
parenthesis before point (which is Emacs default behavior). If
-this list contains the symbol 'not then its meaning is inverted,
-i.e., all states listed here highlight the closing parenthesis
+this list contains the symbol `not' then its meaning is inverted,
+i.e. all states listed here highlight the closing parenthesis
before point."
:type '(repeat symbol)
:group 'evil)
+(defcustom evil-kill-on-visual-paste t
+ "Whether pasting in visual state adds the replaced text to the
+kill ring, making it the default for the next paste. The default,
+replicates the default Vim behavior."
+ :type 'boolean
+ :group 'evil)
+
(defcustom evil-want-C-i-jump t
- "Whether \"C-i\" jumps forward like in Vim."
+ "Whether `C-i' jumps forward in the jump list (like Vim).
+Otherwise, `C-i' inserts a tab character."
:type 'boolean
:group 'evil
:set #'(lambda (sym value)
@@ -403,7 +464,10 @@ before point."
(define-key evil-motion-state-map (kbd "C-i") 'evil-jump-forward))))))
(defcustom evil-want-C-u-scroll nil
- "Whether \"C-u\" scrolls like in Vim."
+ "Whether `C-u' scrolls up (like Vim).
+Otherwise, `C-u' applies a prefix argument. The binding of
+`C-u' mirrors Emacs behaviour by default due to the relative
+ubiquity of prefix arguments."
:type 'boolean
:group 'evil
:set #'(lambda (sym value)
@@ -419,7 +483,7 @@ before point."
(define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up))))))
(defcustom evil-want-C-d-scroll t
- "Whether \"C-d\" scrolls like in Vim."
+ "Whether `C-d' scrolls down (like Vim)."
:type 'boolean
:group 'evil
:set #'(lambda (sym value)
@@ -434,8 +498,27 @@ before point."
(not (lookup-key evil-motion-state-map (kbd "C-d"))))
(define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down))))))
+(defcustom evil-want-C-u-delete nil
+ "Whether `C-u' deletes back to indentation in insert state.
+Otherwise, `C-u' applies a prefix argument. The binding of
+`C-u' mirrors Emacs behaviour by default due to the relative
+ubiquity of prefix arguments."
+ :type 'boolean
+ :group 'evil
+ :set #'(lambda (sym value)
+ (set-default sym value)
+ (when (boundp 'evil-insert-state-map)
+ (cond
+ ((and (not value)
+ (eq (lookup-key evil-insert-state-map (kbd "C-u"))
+ 'evil-delete-back-to-indentation))
+ (define-key evil-insert-state-map (kbd "C-u") nil))
+ ((and value
+ (not (lookup-key evil-insert-state-map (kbd "C-u"))))
+ (define-key evil-insert-state-map (kbd "C-u") 'evil-delete-back-to-indentation))))))
+
(defcustom evil-want-C-w-delete t
- "Whether \"C-w\" deletes a word in Insert state."
+ "Whether `C-w' deletes a word in Insert state."
:type 'boolean
:group 'evil
:set #'(lambda (sym value)
@@ -452,7 +535,7 @@ before point."
(define-key evil-insert-state-map (kbd "C-w") 'evil-delete-backward-word))))))
(defcustom evil-want-C-w-in-emacs-state nil
- "Whether \"C-w\" prefixes windows commands in Emacs state."
+ "Whether `C-w' prefixes windows commands in Emacs state."
:type 'boolean
:group 'evil
:set #'(lambda (sym value)
@@ -468,24 +551,28 @@ before point."
(define-key evil-emacs-state-map (kbd "C-w") 'evil-window-map))))))
(defcustom evil-want-change-word-to-end t
- "Whether \"cw\" behaves like \"ce\"."
+ "Whether `cw' behaves like `ce'."
:type 'boolean
:group 'evil)
(defcustom evil-want-Y-yank-to-eol nil
- "Whether \"Y\" yanks to the end of the line.
-The default behavior is to yank the whole line."
+ "Whether `Y' yanks to the end of the line.
+The default behavior is to yank the whole line, like Vim."
:group 'evil
:type 'boolean
:initialize #'evil-custom-initialize-pending-reset
- :set #'(lambda (sym value)
+ :set #'(lambda (_sym value)
(evil-add-command-properties
'evil-yank-line
- :motion (if value 'evil-end-of-line 'evil-line))))
+ :motion (if value
+ 'evil-end-of-line-or-visual-line
+ 'evil-line-or-visual-line))))
(defcustom evil-disable-insert-state-bindings nil
- "Whether insert state bindings should be used. Excludes
-bindings for escape, delete and `evil-toggle-key'."
+ "Whether insert state bindings should be used.
+Bindings for escape, delete and `evil-toggle-key' are always
+available. If this is non-nil, default Emacs bindings are by and
+large accessible in insert state."
:group 'evil
:type 'boolean
:initialize #'evil-custom-initialize-pending-reset
@@ -497,10 +584,15 @@ bindings for escape, delete and `evil-toggle-key'."
:group 'evil)
(defcustom evil-complete-all-buffers t
- "Whether completion looks for matches in all buffers."
+ "\\<evil-insert-state-map>
+Whether completion looks for matches in all buffers.
+This applies to \\[evil-complete-next] and \\[evil-complete-previous] \
+in insert state."
:type 'boolean
:group 'evil)
+(defvar dabbrev-search-these-buffers-only)
+(defvar dabbrev-case-distinction)
(defcustom evil-complete-next-func
#'(lambda (arg)
(require 'dabbrev)
@@ -577,42 +669,46 @@ Must be readable by `read-kbd-macro'. For example: \"C-z\"."
(set-default sym value)))
(defcustom evil-default-state 'normal
- "The default state.
-This is the state a mode comes up in when it is not listed
-in `evil-emacs-state-modes', `evil-insert-state-modes' or
-`evil-motion-state-modes'. The value may be one of `normal',
-`insert', `visual', `replace', `operator', `motion' and
-`emacs'."
+ "The default Evil state.
+This is the state a buffer starts in when it is not otherwise
+configured (see `evil-set-initial-state' and
+`evil-buffer-regexps'). The value may be one of `normal',
+`insert', `visual', `replace', `operator', `motion' and `emacs'."
:type 'symbol
:group 'evil)
(defcustom evil-buffer-regexps
'(("^ \\*load\\*" . nil))
- "Regular expression determining the initial state for a buffer.
+ "Regular expressions determining the initial state for a buffer.
Entries have the form (REGEXP . STATE), where REGEXP is a regular
expression matching the buffer's name and STATE is one of `normal',
-`insert', `visual', `replace', `operator', `motion', `emacs' and nil.
-If STATE is nil, Evil is disabled in the buffer."
+`insert', `visual', `replace', `operator', `motion', `emacs' and
+`nil'. If STATE is `nil', Evil is disabled in the buffer."
:type '(alist :key-type string :value-type symbol)
:group 'evil)
(defcustom evil-emacs-state-modes
- '(archive-mode
+ '(5x5-mode
+ archive-mode
bbdb-mode
biblio-selection-mode
+ blackbox-mode
bookmark-bmenu-mode
bookmark-edit-annotation-mode
browse-kill-ring-mode
+ bubbles-mode
bzr-annotate-mode
calc-mode
cfw:calendar-mode
completion-list-mode
Custom-mode
+ custom-theme-choose-mode
debugger-mode
delicious-search-mode
desktop-menu-blist-mode
desktop-menu-mode
doc-view-mode
+ dun-mode
dvc-bookmarks-mode
dvc-diff-mode
dvc-info-buffer-mode
@@ -641,13 +737,13 @@ If STATE is nil, Evil is disabled in the buffer."
gdb-registers-mode
gdb-threads-mode
gist-list-mode
- git-commit-mode
git-rebase-mode
gnus-article-mode
gnus-browse-mode
gnus-group-mode
gnus-server-mode
gnus-summary-mode
+ gomoku-mode
google-maps-static-mode
ibuffer-mode
jde-javadoc-checker-report-mode
@@ -664,22 +760,16 @@ If STATE is nil, Evil is disabled in the buffer."
magit-stash-mode
magit-stashes-mode
magit-status-mode
- ;; Obsolete as of Magit v2.1.0
- magit-mode
- magit-branch-manager-mode
- magit-commit-mode
- magit-key-mode
- magit-rebase-mode
- magit-wazzup-mode
- ;; end obsolete
mh-folder-mode
monky-mode
+ mpuz-mode
mu4e-main-mode
mu4e-headers-mode
mu4e-view-mode
notmuch-hello-mode
notmuch-search-mode
notmuch-show-mode
+ notmuch-tree-mode
occur-mode
org-agenda-mode
package-menu-mode
@@ -696,6 +786,8 @@ If STATE is nil, Evil is disabled in the buffer."
slime-inspector-mode
slime-thread-control-mode
slime-xref-mode
+ snake-mode
+ solitaire-mode
sr-buttons-mode
sr-mode
sr-tree-mode
@@ -782,7 +874,6 @@ If STATE is nil, Evil is disabled in the buffer."
Man-mode
speedbar-mode
undo-tree-visualizer-mode
- view-mode
woman-mode)
"Modes that should come up in Motion state."
:type '(repeat symbol)
@@ -813,7 +904,7 @@ should be overridden. If STATE is nil, all states are
overridden."
:type '(alist :key-type symbol :value-type symbol)
:group 'evil
- :set #'(lambda (var values)
+ :set #'(lambda (_var values)
(evil-set-custom-state-maps 'evil-overriding-maps
'evil-pending-overriding-maps
'override-state
@@ -832,7 +923,7 @@ should be intercepted. If STATE is nil, all states are
intercepted."
:type '(alist :key-type symbol :value-type symbol)
:group 'evil
- :set #'(lambda (var values)
+ :set #'(lambda (_var values)
(evil-set-custom-state-maps 'evil-intercept-maps
'evil-pending-intercept-maps
'intercept-state
@@ -999,7 +1090,8 @@ preserved."
used in `evil-cjk-word-boundary-p'. See the documentation of
`word-separating-categories'. Use `describe-categories' to see
the list of categories."
- :type '((character . character))
+ :type '(alist :key-type (choice character (const nil))
+ :value-type (choice character (const nil)))
:group 'evil-cjk)
(defcustom evil-cjk-word-combining-categories
@@ -1018,7 +1110,8 @@ the list of categories."
used in `evil-cjk-word-boundary-p'. See the documentation of
`word-combining-categories'. Use `describe-categories' to see the
list of categories."
- :type '((character . character))
+ :type '(alist :key-type (choice character (const nil))
+ :value-type (choice character (const nil)))
:group 'evil-cjk)
(defcustom evil-ex-complete-emacs-commands 'in-turn
@@ -1034,7 +1127,7 @@ available for completion."
(defface evil-ex-commands '(( nil
:underline t
:slant italic))
- "Face for the evil command in completion in ex mode."
+ "Face for the Evil command in completion in ex mode."
:group 'evil)
(defface evil-ex-info '(( ((supports :slant))
@@ -1063,7 +1156,7 @@ be extended to contain full lines."
(defcustom evil-magic t
"Meaning which characters in a pattern are magic.
The meaning of those values is the same as in Vim. Note that it
-only has influence if the evil search module is chosen in
+only has influence if the Evil search module is chosen in
`evil-search-module'."
:group 'evil
:type '(radio (const :tag "Very magic." :value very-magic)
@@ -1088,7 +1181,7 @@ always uses plain Emacs regular expressions."
:group 'evil)
(defcustom evil-ex-search-persistent-highlight t
- "If non-nil matches remained highlighted when the search ends."
+ "If non-nil matches remain highlighted when the search ends."
:type 'boolean
:group 'evil)
@@ -1137,7 +1230,7 @@ the replacement is shown interactively."
:group 'evil)
(defcustom evil-ex-substitute-global nil
- "If non-nil substitute patterns a global by default.
+ "If non-nil substitute patterns are global by default.
Usually (if this variable is nil) a substitution works only on
the first match of a pattern in a line unless the 'g' flag is
given, in which case the substitution happens on all matches in a
@@ -1175,11 +1268,17 @@ Set to 0 to use the default height for `split-window'."
"Show error output of a shell command in the error buffer.
If this variable is non-nil the error output of a shell command
goes to the messages buffer instead of being mixed with the
-regular output. This happens only of the exit status of the
+regular output. This happens only if the exit status of the
command is non-zero."
:type 'boolean
:group 'evil)
+(defcustom evil-want-abbrev-expand-on-insert-exit t
+ "If non-nil abbrevs will be expanded when leaving insert state
+like in Vim, if `abbrev-mode' is on."
+ :type 'boolean
+ :group 'evil)
+
;;; Variables
(defmacro evil-define-local-var (symbol &optional initvalue docstring)
@@ -1187,6 +1286,7 @@ command is non-zero."
The parameters are the same as for `defvar', but the variable
SYMBOL is made permanent buffer local."
(declare (indent defun)
+ (doc-string 3)
(debug (symbolp &optional form stringp)))
`(progn
(defvar ,symbol ,initvalue ,docstring)
@@ -1199,12 +1299,6 @@ and `evil-scroll-down'.
Determines how many lines should be scrolled.
Default value is 0 - scroll half the screen.")
-(evil-define-local-var evil-scroll-line-count 1
- "Holds last used prefix for `evil-scroll-line-up'
-and `evil-scroll-line-down'.
-Determines how many lines should be scrolled.
-Default value is 1 line.")
-
(evil-define-local-var evil-state nil
"The current Evil state.
To change the state, use `evil-change-state'
@@ -1242,7 +1336,7 @@ reinitialized in each buffer. Entries have the form
the keymap for MODE.")
(defvar evil-minor-mode-keymaps-alist nil
- "Association list of evil states to minor-mode keymap alists.
+ "Association list of Evil states to minor-mode keymap alists.
Entries have the form (STATE . MODE-MAP-ALIST), where
MODE-MAP-ALIST is an alist taking the form of
`minor-mode-map-alist'.")
@@ -1261,6 +1355,11 @@ having higher priority.")
(defvar evil-command-properties nil
"Specifications made by `evil-define-command'.")
+(defvar evil-change-commands '(evil-change)
+ "Commands that wrap or replace `evil-change'.
+This list exists to apply an inconsistency with vim's change command
+to commands that wrap or redefine it. See emacs-evil/evil#916.")
+
(defvar evil-transient-vars '(cua-mode transient-mark-mode select-active-regions)
"List of variables pertaining to Transient Mark mode.")
@@ -1296,7 +1395,7 @@ type.")
(evil-define-local-var evil-this-register nil
"Current register.")
-(evil-define-local-var evil-this-macro nil
+(defvar evil-this-macro nil
"Current macro register.")
(evil-define-local-var evil-this-operator nil
@@ -1584,15 +1683,29 @@ Elements have the form (NAME . FUNCTION).")
(defvar evil-visual-x-select-timeout 0.1
"Time in seconds for the update of the X selection.")
-(declare-function origami-open-all-nodes "origami.el")
-(declare-function origami-close-all-nodes "origami.el")
-(declare-function origami-toggle-node "origami.el")
-(declare-function origami-open-node "origami.el")
-(declare-function origami-open-node-recursively "origami.el")
-(declare-function origami-close-node "origami.el")
+(declare-function origami-open-all-nodes "ext:origami.el")
+(declare-function origami-close-all-nodes "ext:origami.el")
+(declare-function origami-toggle-node "ext:origami.el")
+(declare-function origami-open-node "ext:origami.el")
+(declare-function origami-open-node-recursively "ext:origami.el")
+(declare-function origami-close-node "ext:origami.el")
(defvar evil-fold-list
- `(((hs-minor-mode)
+ `(((vdiff-mode)
+ :open-all vdiff-open-all-folds
+ :close-all vdiff-close-all-folds
+ :toggle ,(lambda () (call-interactively 'vdiff-toggle-fold))
+ :open ,(lambda () (call-interactively 'vdiff-open-fold))
+ :open-rec ,(lambda () (call-interactively 'vdiff-open-fold))
+ :close ,(lambda () (call-interactively 'vdiff-close-fold)))
+ ((vdiff-3way-mode)
+ :open-all vdiff-open-all-folds
+ :close-all vdiff-close-all-folds
+ :toggle ,(lambda () (call-interactively 'vdiff-toggle-fold))
+ :open ,(lambda () (call-interactively 'vdiff-open-fold))
+ :open-rec ,(lambda () (call-interactively 'vdiff-open-fold))
+ :close ,(lambda () (call-interactively 'vdiff-close-fold)))
+ ((hs-minor-mode)
:open-all hs-show-all
:close-all hs-hide-all
:toggle hs-toggle-hiding
@@ -1799,6 +1912,7 @@ Otherwise the previous command is assumed as substitute.")
(defvar evil-ex-search-keymap (make-sparse-keymap)
"Keymap used in ex-search-mode.")
+(define-key evil-ex-search-keymap [escape] 'abort-recursive-edit)
(set-keymap-parent evil-ex-search-keymap minibuffer-local-map)
(defconst evil-version
@@ -1806,32 +1920,47 @@ Otherwise the previous command is assumed as substitute.")
(with-temp-buffer
(let ((dir (file-name-directory (or load-file-name
byte-compile-current-file))))
- (cond
- ;; git repository
- ((and (file-exists-p (concat dir "/.git"))
- (condition-case nil
+ ;; git repository
+ (if (and (file-exists-p (concat dir "/.git"))
+ (ignore-errors
(zerop (call-process "git" nil '(t nil) nil
"rev-parse"
- "--short" "HEAD"))
- (error nil)))
- (goto-char (point-min))
- (concat "evil-git-"
- (buffer-substring (point-min)
- (line-end-position))))
- ;; mercurial repository
- ((and (file-exists-p (concat dir "/.hg"))
- (condition-case nil
- (zerop (call-process "hg" nil '(t nil) nil
- "parents"
- "--template"
- "evil-hg-{node|short}"))
- (error nil)))
- (goto-char (point-min))
- (buffer-substring (point-min) (line-end-position)))
- ;; no repo, use plain version
- (t "1.2.12")))))
+ "--short" "HEAD"))))
+ (progn
+ (goto-char (point-min))
+ (concat "evil-git-"
+ (buffer-substring (point-min)
+ (line-end-position))))
+ ;; no repo, use plain version
+ "1.14.0"))))
"The current version of Evil")
+(defcustom evil-want-integration t
+ "Whether to load evil-integration.el.
+This variable must be set before Evil is loaded."
+ :type 'boolean
+ :group 'evil)
+
+(defcustom evil-want-keybinding t
+ "Whether to load evil-keybindings.el.
+
+This loads a set of keybindings for evil in other modes as well as
+setting the initial evil state in those modes.
+
+This variable must be set before evil is loaded."
+ :type 'boolean
+ :group 'evil)
+
+(defcustom evil-want-minibuffer nil
+ "Whether to enable Evil in minibuffer(s)."
+ :type 'boolean
+ :group 'evil
+ :set #'(lambda (sym value)
+ (set-default sym value)
+ (if value
+ (add-hook 'minibuffer-setup-hook 'evil-initialize)
+ (remove-hook 'minibuffer-setup-hook 'evil-initialize))))
+
(defun evil-version ()
(interactive)
(message "Evil version %s" evil-version))
diff --git a/evil.el b/evil.el
index 6f18340..14d2b81 100644
--- a/evil.el
+++ b/evil.el
@@ -1,6 +1,9 @@
;;; evil.el --- extensible vi layer
-;; Authors:
+;; The following list of authors was kept up to date until the beginning of
+;; 2017, when evil moved under new maintainers. For authors since then, please
+;; consult the git logs.
+
;; Alessandro Piras <laynor at gmail.com>
;; Alexander Baier <alexander.baier at mailbox.org>
;; Antono Vasiljev <antono.vasiljev at gmail.com>
@@ -48,16 +51,16 @@
;; Xiao Hanyu <xiaohanyu1988 at gmail.com>
;; York Zhao <yzhao at telecor.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
+;; Maintainers: The emacs-evil team. <https://github.com/orgs/emacs-evil/people>
;; To get in touch, please use the bug tracker or the
;; mailing list (see below).
;; Created: 2011-03-01
-;; Version: 1.2.12
+;; Version: 1.14.0
;; Keywords: emulation, vim
-;; URL: http://gitorious.org/evil
-;; Repository: git://gitorious.org/evil/evil.git
+;; URL: https://github.com/emacs-evil/evil
+;; Repository: https://github.com/emacs-evil/evil.git
;; EmacsWiki: http://www.emacswiki.org/emacs/Evil
-;; Bug tracker: https://bitbucket.org/lyro/evil/issues
+;; Bug tracker: https://github.com/emacs-evil/evil/issues
;; If you have bug reports, suggestions or patches, please
;; create an issue at the bug tracker (open for everyone).
;; Other discussions (tips, extensions) go to the mailing list.
@@ -95,7 +98,7 @@
;;
;; Evil lives in a Git repository. To obtain Evil, do
;;
-;; git clone git://gitorious.org/evil/evil.git
+;; git clone git://github.com/emacs-evil/evil.git
;;
;; Move Evil to ~/.emacs.d/evil (or somewhere else in the `load-path').
;; Then add the following lines to ~/.emacs:
@@ -134,7 +137,12 @@
(require 'evil-commands)
(require 'evil-jumps)
(require 'evil-maps)
-(require 'evil-integration)
+
+(when evil-want-integration
+ (require 'evil-integration))
+
+(when evil-want-keybinding
+ (require 'evil-keybindings))
(run-hooks 'evil-after-load-hook)
diff --git a/lib/ert.el b/lib/ert.el
deleted file mode 100644
index 5bd8fd0..0000000
--- a/lib/ert.el
+++ /dev/null
@@ -1,2549 +0,0 @@
-;;; ert.el --- Emacs Lisp Regression Testing
-
-;; Copyright (C) 2007-2008, 2010-2011 Free Software Foundation, Inc.
-
-;; Author: Christian Ohler <ohler@gnu.org>
-;; Keywords: lisp, tools
-
-;; This file is part of GNU Emacs.
-
-;; This program is free software: you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License as
-;; published by the Free Software Foundation, either version 3 of the
-;; License, or (at your option) any later version.
-;;
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see `http://www.gnu.org/licenses/'.
-
-;;; Commentary:
-
-;; ERT is a tool for automated testing in Emacs Lisp. Its main
-;; features are facilities for defining and running test cases and
-;; reporting the results as well as for debugging test failures
-;; interactively.
-;;
-;; The main entry points are `ert-deftest', which is similar to
-;; `defun' but defines a test, and `ert-run-tests-interactively',
-;; which runs tests and offers an interactive interface for inspecting
-;; results and debugging. There is also
-;; `ert-run-tests-batch-and-exit' for non-interactive use.
-;;
-;; The body of `ert-deftest' forms resembles a function body, but the
-;; additional operators `should', `should-not' and `should-error' are
-;; available. `should' is similar to cl's `assert', but signals a
-;; different error when its condition is violated that is caught and
-;; processed by ERT. In addition, it analyzes its argument form and
-;; records information that helps debugging (`assert' tries to do
-;; something similar when its second argument SHOW-ARGS is true, but
-;; `should' is more sophisticated). For information on `should-not'
-;; and `should-error', see their docstrings.
-;;
-;; See ERT's info manual as well as the docstrings for more details.
-;; To compile the manual, run `makeinfo ert.texinfo' in the ERT
-;; directory, then C-u M-x info ert.info in Emacs to view it.
-;;
-;; To see some examples of tests written in ERT, see its self-tests in
-;; ert-tests.el. Some of these are tricky due to the bootstrapping
-;; problem of writing tests for a testing tool, others test simple
-;; functions and are straightforward.
-
-;;; Code:
-
-(eval-when-compile
- (require 'cl))
-(require 'button)
-(require 'debug)
-(require 'easymenu)
-(require 'ewoc)
-(require 'find-func)
-(require 'help)
-
-
-;;; UI customization options.
-
-(defgroup ert ()
- "ERT, the Emacs Lisp regression testing tool."
- :prefix "ert-"
- :group 'lisp)
-
-(defface ert-test-result-expected '((((class color) (background light))
- :background "green1")
- (((class color) (background dark))
- :background "green3"))
- "Face used for expected results in the ERT results buffer."
- :group 'ert)
-
-(defface ert-test-result-unexpected '((((class color) (background light))
- :background "red1")
- (((class color) (background dark))
- :background "red3"))
- "Face used for unexpected results in the ERT results buffer."
- :group 'ert)
-
-
-;;; Copies/reimplementations of cl functions.
-
-(defun ert--cl-do-remf (plist tag)
- "Copy of `cl-do-remf'. Modify PLIST by removing TAG."
- (let ((p (cdr plist)))
- (while (and (cdr p) (not (eq (car (cdr p)) tag))) (setq p (cdr (cdr p))))
- (and (cdr p) (progn (setcdr p (cdr (cdr (cdr p)))) t))))
-
-(defun ert--remprop (sym tag)
- "Copy of `cl-remprop'. Modify SYM's plist by removing TAG."
- (let ((plist (symbol-plist sym)))
- (if (and plist (eq tag (car plist)))
- (progn (setplist sym (cdr (cdr plist))) t)
- (ert--cl-do-remf plist tag))))
-
-(defun ert--remove-if-not (ert-pred ert-list)
- "A reimplementation of `remove-if-not'.
-
-ERT-PRED is a predicate, ERT-LIST is the input list."
- (loop for ert-x in ert-list
- if (funcall ert-pred ert-x)
- collect ert-x))
-
-(defun ert--intersection (a b)
- "A reimplementation of `intersection'. Intersect the sets A and B.
-
-Elements are compared using `eql'."
- (loop for x in a
- if (memql x b)
- collect x))
-
-(defun ert--set-difference (a b)
- "A reimplementation of `set-difference'. Subtract the set B from the set A.
-
-Elements are compared using `eql'."
- (loop for x in a
- unless (memql x b)
- collect x))
-
-(defun ert--set-difference-eq (a b)
- "A reimplementation of `set-difference'. Subtract the set B from the set A.
-
-Elements are compared using `eq'."
- (loop for x in a
- unless (memq x b)
- collect x))
-
-(defun ert--union (a b)
- "A reimplementation of `union'. Compute the union of the sets A and B.
-
-Elements are compared using `eql'."
- (append a (ert--set-difference b a)))
-
-(eval-and-compile
- (defvar ert--gensym-counter 0))
-
-(eval-and-compile
- (defun ert--gensym (&optional prefix)
- "Only allows string PREFIX, not compatible with CL."
- (unless prefix (setq prefix "G"))
- (make-symbol (format "%s%s"
- prefix
- (prog1 ert--gensym-counter
- (incf ert--gensym-counter))))))
-
-(defun ert--coerce-to-vector (x)
- "Coerce X to a vector."
- (when (char-table-p x) (error "Not supported"))
- (if (vectorp x)
- x
- (vconcat x)))
-
-(defun* ert--remove* (x list &key key test)
- "Does not support all the keywords of remove*."
- (unless key (setq key #'identity))
- (unless test (setq test #'eql))
- (loop for y in list
- unless (funcall test x (funcall key y))
- collect y))
-
-(defun ert--string-position (c s)
- "Return the position of the first occurrence of C in S, or nil if none."
- (loop for i from 0
- for x across s
- when (eql x c) return i))
-
-(defun ert--mismatch (a b)
- "Return index of first element that differs between A and B.
-
-Like `mismatch'. Uses `equal' for comparison."
- (cond ((or (listp a) (listp b))
- (ert--mismatch (ert--coerce-to-vector a)
- (ert--coerce-to-vector b)))
- ((> (length a) (length b))
- (ert--mismatch b a))
- (t
- (let ((la (length a))
- (lb (length b)))
- (assert (arrayp a) t)
- (assert (arrayp b) t)
- (assert (<= la lb) t)
- (loop for i below la
- when (not (equal (aref a i) (aref b i))) return i
- finally (return (if (/= la lb)
- la
- (assert (equal a b) t)
- nil)))))))
-
-(defun ert--subseq (seq start &optional end)
- "Return a subsequence of SEQ from START to END."
- (when (char-table-p seq) (error "Not supported"))
- (let ((vector (substring (ert--coerce-to-vector seq) start end)))
- (etypecase seq
- (vector vector)
- (string (concat vector))
- (list (append vector nil))
- (bool-vector (loop with result = (make-bool-vector (length vector) nil)
- for i below (length vector) do
- (setf (aref result i) (aref vector i))
- finally (return result)))
- (char-table (assert nil)))))
-
-(defun ert-equal-including-properties (a b)
- "Return t if A and B have similar structure and contents.
-
-This is like `equal-including-properties' except that it compares
-the property values of text properties structurally (by
-recursing) rather than with `eq'. Perhaps this is what
-`equal-including-properties' should do in the first place; see
-Emacs bug 6581 at URL `http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6581'."
- ;; This implementation is inefficient. Rather than making it
- ;; efficient, let's hope bug 6581 gets fixed so that we can delete
- ;; it altogether.
- (not (ert--explain-equal-including-properties a b)))
-
-
-;;; Defining and locating tests.
-
-;; The data structure that represents a test case.
-(defstruct ert-test
- (name nil)
- (documentation nil)
- (body (assert nil))
- (most-recent-result nil)
- (expected-result-type ':passed)
- (tags '()))
-
-(defun ert-test-boundp (symbol)
- "Return non-nil if SYMBOL names a test."
- (and (get symbol 'ert--test) t))
-
-(defun ert-get-test (symbol)
- "If SYMBOL names a test, return that. Signal an error otherwise."
- (unless (ert-test-boundp symbol) (error "No test named `%S'" symbol))
- (get symbol 'ert--test))
-
-(defun ert-set-test (symbol definition)
- "Make SYMBOL name the test DEFINITION, and return DEFINITION."
- (when (eq symbol 'nil)
- ;; We disallow nil since `ert-test-at-point' and related functions
- ;; want to return a test name, but also need an out-of-band value
- ;; on failure. Nil is the most natural out-of-band value; using 0
- ;; or "" or signalling an error would be too awkward.
- ;;
- ;; Note that nil is still a valid value for the `name' slot in
- ;; ert-test objects. It designates an anonymous test.
- (error "Attempt to define a test named nil"))
- (put symbol 'ert--test definition)
- definition)
-
-(defun ert-make-test-unbound (symbol)
- "Make SYMBOL name no test. Return SYMBOL."
- (ert--remprop symbol 'ert--test)
- symbol)
-
-(defun ert--parse-keys-and-body (keys-and-body)
- "Split KEYS-AND-BODY into keyword-and-value pairs and the remaining body.
-
-KEYS-AND-BODY should have the form of a property list, with the
-exception that only keywords are permitted as keys and that the
-tail -- the body -- is a list of forms that does not start with a
-keyword.
-
-Returns a two-element list containing the keys-and-values plist
-and the body."
- (let ((extracted-key-accu '())
- (remaining keys-and-body))
- (while (and (consp remaining) (keywordp (first remaining)))
- (let ((keyword (pop remaining)))
- (unless (consp remaining)
- (error "Value expected after keyword %S in %S"
- keyword keys-and-body))
- (when (assoc keyword extracted-key-accu)
- (warn "Keyword %S appears more than once in %S" keyword
- keys-and-body))
- (push (cons keyword (pop remaining)) extracted-key-accu)))
- (setq extracted-key-accu (nreverse extracted-key-accu))
- (list (loop for (key . value) in extracted-key-accu
- collect key
- collect value)
- remaining)))
-
-;;;###autoload
-(defmacro* ert-deftest (name () &body docstring-keys-and-body)
- "Define NAME (a symbol) as a test.
-
-BODY is evaluated as a `progn' when the test is run. It should
-signal a condition on failure or just return if the test passes.
-
-`should', `should-not' and `should-error' are useful for
-assertions in BODY.
-
-Use `ert' to run tests interactively.
-
-Tests that are expected to fail can be marked as such
-using :expected-result. See `ert-test-result-type-p' for a
-description of valid values for RESULT-TYPE.
-
-\(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] \
-\[:tags '(TAG...)] BODY...)"
- (declare (debug (&define :name test
- name sexp [&optional stringp]
- [&rest keywordp sexp] def-body))
- (doc-string 3)
- (indent 2))
- (let ((documentation nil)
- (documentation-supplied-p nil))
- (when (stringp (first docstring-keys-and-body))
- (setq documentation (pop docstring-keys-and-body)
- documentation-supplied-p t))
- (destructuring-bind ((&key (expected-result nil expected-result-supplied-p)
- (tags nil tags-supplied-p))
- body)
- (ert--parse-keys-and-body docstring-keys-and-body)
- `(progn
- (ert-set-test ',name
- (make-ert-test
- :name ',name
- ,@(when documentation-supplied-p
- `(:documentation ,documentation))
- ,@(when expected-result-supplied-p
- `(:expected-result-type ,expected-result))
- ,@(when tags-supplied-p
- `(:tags ,tags))
- :body (lambda () ,@body)))
- ;; This hack allows `symbol-file' to associate `ert-deftest'
- ;; forms with files, and therefore enables `find-function' to
- ;; work with tests. However, it leads to warnings in
- ;; `unload-feature', which doesn't know how to undefine tests
- ;; and has no mechanism for extension.
- (push '(ert-deftest . ,name) current-load-list)
- ',name))))
-
-;; We use these `put' forms in addition to the (declare (indent)) in
-;; the defmacro form since the `declare' alone does not lead to
-;; correct indentation before the .el/.elc file is loaded.
-;; Autoloading these `put' forms solves this.
-;;;###autoload
-(progn
- ;; TODO(ohler): Figure out what these mean and make sure they are correct.
- (put 'ert-deftest 'lisp-indent-function 2)
- (put 'ert-info 'lisp-indent-function 1))
-
-(defvar ert--find-test-regexp
- (concat "^\\s-*(ert-deftest"
- find-function-space-re
- "%s\\(\\s-\\|$\\)")
- "The regexp the `find-function' mechanisms use for finding test definitions.")
-
-
-(put 'ert-test-failed 'error-conditions '(error ert-test-failed))
-(put 'ert-test-failed 'error-message "Test failed")
-
-(defun ert-pass ()
- "Terminate the current test and mark it passed. Does not return."
- (throw 'ert--pass nil))
-
-(defun ert-fail (data)
- "Terminate the current test and mark it failed. Does not return.
-DATA is displayed to the user and should state the reason of the failure."
- (signal 'ert-test-failed (list data)))
-
-
-;;; The `should' macros.
-
-(defvar ert--should-execution-observer nil)
-
-(defun ert--signal-should-execution (form-description)
- "Tell the current `should' form observer (if any) about FORM-DESCRIPTION."
- (when ert--should-execution-observer
- (funcall ert--should-execution-observer form-description)))
-
-(defun ert--special-operator-p (thing)
- "Return non-nil if THING is a symbol naming a special operator."
- (and (symbolp thing)
- (let ((definition (indirect-function thing t)))
- (and (subrp definition)
- (eql (cdr (subr-arity definition)) 'unevalled)))))
-
-(defun ert--expand-should-1 (whole form inner-expander)
- "Helper function for the `should' macro and its variants."
- (let ((form
- ;; If `cl-macroexpand' isn't bound, the code that we're
- ;; compiling doesn't depend on cl and thus doesn't need an
- ;; environment arg for `macroexpand'.
- (if (fboundp 'cl-macroexpand)
- ;; Suppress warning about run-time call to cl funtion: we
- ;; only call it if it's fboundp.
- (with-no-warnings
- (cl-macroexpand form (and (boundp 'cl-macro-environment)
- cl-macro-environment)))
- (macroexpand form))))
- (cond
- ((or (atom form) (ert--special-operator-p (car form)))
- (let ((value (ert--gensym "value-")))
- `(let ((,value (ert--gensym "ert-form-evaluation-aborted-")))
- ,(funcall inner-expander
- `(setq ,value ,form)
- `(list ',whole :form ',form :value ,value)
- value)
- ,value)))
- (t
- (let ((fn-name (car form))
- (arg-forms (cdr form)))
- (assert (or (symbolp fn-name)
- (and (consp fn-name)
- (eql (car fn-name) 'lambda)
- (listp (cdr fn-name)))))
- (let ((fn (ert--gensym "fn-"))
- (args (ert--gensym "args-"))
- (value (ert--gensym "value-"))
- (default-value (ert--gensym "ert-form-evaluation-aborted-")))
- `(let ((,fn (function ,fn-name))
- (,args (list ,@arg-forms)))
- (let ((,value ',default-value))
- ,(funcall inner-expander
- `(setq ,value (apply ,fn ,args))
- `(nconc (list ',whole)
- (list :form `(,,fn ,@,args))
- (unless (eql ,value ',default-value)
- (list :value ,value))
- (let ((-explainer-
- (and (symbolp ',fn-name)
- (get ',fn-name 'ert-explainer))))
- (when -explainer-
- (list :explanation
- (apply -explainer- ,args)))))
- value)
- ,value))))))))
-
-(defun ert--expand-should (whole form inner-expander)
- "Helper function for the `should' macro and its variants.
-
-Analyzes FORM and returns an expression that has the same
-semantics under evaluation but records additional debugging
-information.
-
-INNER-EXPANDER should be a function and is called with two
-arguments: INNER-FORM and FORM-DESCRIPTION-FORM, where INNER-FORM
-is an expression equivalent to FORM, and FORM-DESCRIPTION-FORM is
-an expression that returns a description of FORM. INNER-EXPANDER
-should return code that calls INNER-FORM and performs the checks
-and error signalling specific to the particular variant of
-`should'. The code that INNER-EXPANDER returns must not call
-FORM-DESCRIPTION-FORM before it has called INNER-FORM."
- (lexical-let ((inner-expander inner-expander))
- (ert--expand-should-1
- whole form
- (lambda (inner-form form-description-form value-var)
- (let ((form-description (ert--gensym "form-description-")))
- `(let (,form-description)
- ,(funcall inner-expander
- `(unwind-protect
- ,inner-form
- (setq ,form-description ,form-description-form)
- (ert--signal-should-execution ,form-description))
- `,form-description
- value-var)))))))
-
-(defmacro* should (form)
- "Evaluate FORM. If it returns nil, abort the current test as failed.
-
-Returns the value of FORM."
- (ert--expand-should `(should ,form) form
- (lambda (inner-form form-description-form value-var)
- `(unless ,inner-form
- (ert-fail ,form-description-form)))))
-
-(defmacro* should-not (form)
- "Evaluate FORM. If it returns non-nil, abort the current test as failed.
-
-Returns nil."
- (ert--expand-should `(should-not ,form) form
- (lambda (inner-form form-description-form value-var)
- `(unless (not ,inner-form)
- (ert-fail ,form-description-form)))))
-
-(defun ert--should-error-handle-error (form-description-fn
- condition type exclude-subtypes)
- "Helper function for `should-error'.
-
-Determines whether CONDITION matches TYPE and EXCLUDE-SUBTYPES,
-and aborts the current test as failed if it doesn't."
- (let ((signalled-conditions (get (car condition) 'error-conditions))
- (handled-conditions (etypecase type
- (list type)
- (symbol (list type)))))
- (assert signalled-conditions)
- (unless (ert--intersection signalled-conditions handled-conditions)
- (ert-fail (append
- (funcall form-description-fn)
- (list
- :condition condition
- :fail-reason (concat "the error signalled did not"
- " have the expected type")))))
- (when exclude-subtypes
- (unless (member (car condition) handled-conditions)
- (ert-fail (append
- (funcall form-description-fn)
- (list
- :condition condition
- :fail-reason (concat "the error signalled was a subtype"
- " of the expected type"))))))))
-
-;; FIXME: The expansion will evaluate the keyword args (if any) in
-;; nonstandard order.
-(defmacro* should-error (form &rest keys &key type exclude-subtypes)
- "Evaluate FORM and check that it signals an error.
-
-The error signalled needs to match TYPE. TYPE should be a list
-of condition names. (It can also be a non-nil symbol, which is
-equivalent to a singleton list containing that symbol.) If
-EXCLUDE-SUBTYPES is nil, the error matches TYPE if one of its
-condition names is an element of TYPE. If EXCLUDE-SUBTYPES is
-non-nil, the error matches TYPE if it is an element of TYPE.
-
-If the error matches, returns (ERROR-SYMBOL . DATA) from the
-error. If not, or if no error was signalled, abort the test as
-failed."
- (unless type (setq type ''error))
- (ert--expand-should
- `(should-error ,form ,@keys)
- form
- (lambda (inner-form form-description-form value-var)
- (let ((errorp (ert--gensym "errorp"))
- (form-description-fn (ert--gensym "form-description-fn-")))
- `(let ((,errorp nil)
- (,form-description-fn (lambda () ,form-description-form)))
- (condition-case -condition-
- ,inner-form
- ;; We can't use ,type here because we want to evaluate it.
- (error
- (setq ,errorp t)
- (ert--should-error-handle-error ,form-description-fn
- -condition-
- ,type ,exclude-subtypes)
- (setq ,value-var -condition-)))
- (unless ,errorp
- (ert-fail (append
- (funcall ,form-description-fn)
- (list
- :fail-reason "did not signal an error")))))))))
-
-
-;;; Explanation of `should' failures.
-
-;; TODO(ohler): Rework explanations so that they are displayed in a
-;; similar way to `ert-info' messages; in particular, allow text
-;; buttons in explanations that give more detail or open an ediff
-;; buffer. Perhaps explanations should be reported through `ert-info'
-;; rather than as part of the condition.
-
-(defun ert--proper-list-p (x)
- "Return non-nil if X is a proper list, nil otherwise."
- (loop
- for firstp = t then nil
- for fast = x then (cddr fast)
- for slow = x then (cdr slow) do
- (when (null fast) (return t))
- (when (not (consp fast)) (return nil))
- (when (null (cdr fast)) (return t))
- (when (not (consp (cdr fast))) (return nil))
- (when (and (not firstp) (eq fast slow)) (return nil))))
-
-(defun ert--explain-format-atom (x)
- "Format the atom X for `ert--explain-equal'."
- (typecase x
- (fixnum (list x (format "#x%x" x) (format "?%c" x)))
- (t x)))
-
-(defun ert--explain-equal-rec (a b)
- "Returns a programmer-readable explanation of why A and B are not `equal'.
-
-Returns nil if they are."
- (if (not (equal (type-of a) (type-of b)))
- `(different-types ,a ,b)
- (etypecase a
- (cons
- (let ((a-proper-p (ert--proper-list-p a))
- (b-proper-p (ert--proper-list-p b)))
- (if (not (eql (not a-proper-p) (not b-proper-p)))
- `(one-list-proper-one-improper ,a ,b)
- (if a-proper-p
- (if (not (equal (length a) (length b)))
- `(proper-lists-of-different-length ,(length a) ,(length b)
- ,a ,b
- first-mismatch-at
- ,(ert--mismatch a b))
- (loop for i from 0
- for ai in a
- for bi in b
- for xi = (ert--explain-equal-rec ai bi)
- do (when xi (return `(list-elt ,i ,xi)))
- finally (assert (equal a b) t)))
- (let ((car-x (ert--explain-equal-rec (car a) (car b))))
- (if car-x
- `(car ,car-x)
- (let ((cdr-x (ert--explain-equal-rec (cdr a) (cdr b))))
- (if cdr-x
- `(cdr ,cdr-x)
- (assert (equal a b) t)
- nil))))))))
- (array (if (not (equal (length a) (length b)))
- `(arrays-of-different-length ,(length a) ,(length b)
- ,a ,b
- ,@(unless (char-table-p a)
- `(first-mismatch-at
- ,(ert--mismatch a b))))
- (loop for i from 0
- for ai across a
- for bi across b
- for xi = (ert--explain-equal-rec ai bi)
- do (when xi (return `(array-elt ,i ,xi)))
- finally (assert (equal a b) t))))
- (atom (if (not (equal a b))
- (if (and (symbolp a) (symbolp b) (string= a b))
- `(different-symbols-with-the-same-name ,a ,b)
- `(different-atoms ,(ert--explain-format-atom a)
- ,(ert--explain-format-atom b)))
- nil)))))
-
-(defun ert--explain-equal (a b)
- "Explainer function for `equal'."
- ;; Do a quick comparison in C to avoid running our expensive
- ;; comparison when possible.
- (if (equal a b)
- nil
- (ert--explain-equal-rec a b)))
-(put 'equal 'ert-explainer 'ert--explain-equal)
-
-(defun ert--significant-plist-keys (plist)
- "Return the keys of PLIST that have non-null values, in order."
- (assert (zerop (mod (length plist) 2)) t)
- (loop for (key value . rest) on plist by #'cddr
- unless (or (null value) (memq key accu)) collect key into accu
- finally (return accu)))
-
-(defun ert--plist-difference-explanation (a b)
- "Return a programmer-readable explanation of why A and B are different plists.
-
-Returns nil if they are equivalent, i.e., have the same value for
-each key, where absent values are treated as nil. The order of
-key/value pairs in each list does not matter."
- (assert (zerop (mod (length a) 2)) t)
- (assert (zerop (mod (length b) 2)) t)
- ;; Normalizing the plists would be another way to do this but it
- ;; requires a total ordering on all lisp objects (since any object
- ;; is valid as a text property key). Perhaps defining such an
- ;; ordering is useful in other contexts, too, but it's a lot of
- ;; work, so let's punt on it for now.
- (let* ((keys-a (ert--significant-plist-keys a))
- (keys-b (ert--significant-plist-keys b))
- (keys-in-a-not-in-b (ert--set-difference-eq keys-a keys-b))
- (keys-in-b-not-in-a (ert--set-difference-eq keys-b keys-a)))
- (flet ((explain-with-key (key)
- (let ((value-a (plist-get a key))
- (value-b (plist-get b key)))
- (assert (not (equal value-a value-b)) t)
- `(different-properties-for-key
- ,key ,(ert--explain-equal-including-properties value-a
- value-b)))))
- (cond (keys-in-a-not-in-b
- (explain-with-key (first keys-in-a-not-in-b)))
- (keys-in-b-not-in-a
- (explain-with-key (first keys-in-b-not-in-a)))
- (t
- (loop for key in keys-a
- when (not (equal (plist-get a key) (plist-get b key)))
- return (explain-with-key key)))))))
-
-(defun ert--abbreviate-string (s len suffixp)
- "Shorten string S to at most LEN chars.
-
-If SUFFIXP is non-nil, returns a suffix of S, otherwise a prefix."
- (let ((n (length s)))
- (cond ((< n len)
- s)
- (suffixp
- (substring s (- n len)))
- (t
- (substring s 0 len)))))
-
-;; TODO(ohler): Once bug 6581 is fixed, rename this to
-;; `ert--explain-equal-including-properties-rec' and add a fast-path
-;; wrapper like `ert--explain-equal'.
-(defun ert--explain-equal-including-properties (a b)
- "Explainer function for `ert-equal-including-properties'.
-
-Returns a programmer-readable explanation of why A and B are not
-`ert-equal-including-properties', or nil if they are."
- (if (not (equal a b))
- (ert--explain-equal a b)
- (assert (stringp a) t)
- (assert (stringp b) t)
- (assert (eql (length a) (length b)) t)
- (loop for i from 0 to (length a)
- for props-a = (text-properties-at i a)
- for props-b = (text-properties-at i b)
- for difference = (ert--plist-difference-explanation props-a props-b)
- do (when difference
- (return `(char ,i ,(substring-no-properties a i (1+ i))
- ,difference
- context-before
- ,(ert--abbreviate-string
- (substring-no-properties a 0 i)
- 10 t)
- context-after
- ,(ert--abbreviate-string
- (substring-no-properties a (1+ i))
- 10 nil))))
- ;; TODO(ohler): Get `equal-including-properties' fixed in
- ;; Emacs, delete `ert-equal-including-properties', and
- ;; re-enable this assertion.
- ;;finally (assert (equal-including-properties a b) t)
- )))
-(put 'ert-equal-including-properties
- 'ert-explainer
- 'ert--explain-equal-including-properties)
-
-
-;;; Implementation of `ert-info'.
-
-;; TODO(ohler): The name `info' clashes with
-;; `ert--test-execution-info'. One or both should be renamed.
-(defvar ert--infos '()
- "The stack of `ert-info' infos that currently apply.
-
-Bound dynamically. This is a list of (PREFIX . MESSAGE) pairs.")
-
-(defmacro* ert-info ((message-form &key ((:prefix prefix-form) "Info: "))
- &body body)
- "Evaluate MESSAGE-FORM and BODY, and report the message if BODY fails.
-
-To be used within ERT tests. MESSAGE-FORM should evaluate to a
-string that will be displayed together with the test result if
-the test fails. PREFIX-FORM should evaluate to a string as well
-and is displayed in front of the value of MESSAGE-FORM."
- (declare (debug ((form &rest [sexp form]) body))
- (indent 1))
- `(let ((ert--infos (cons (cons ,prefix-form ,message-form) ert--infos)))
- ,@body))
-
-
-
-;;; Facilities for running a single test.
-
-(defvar ert-debug-on-error nil
- "Non-nil means enter debugger when a test fails or terminates with an error.")
-
-;; The data structures that represent the result of running a test.
-(defstruct ert-test-result
- (messages nil)
- (should-forms nil)
- )
-(defstruct (ert-test-passed (:include ert-test-result)))
-(defstruct (ert-test-result-with-condition (:include ert-test-result))
- (condition (assert nil))
- (backtrace (assert nil))
- (infos (assert nil)))
-(defstruct (ert-test-quit (:include ert-test-result-with-condition)))
-(defstruct (ert-test-failed (:include ert-test-result-with-condition)))
-(defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result)))
-
-
-(defun ert--record-backtrace ()
- "Record the current backtrace (as a list) and return it."
- ;; Since the backtrace is stored in the result object, result
- ;; objects must only be printed with appropriate limits
- ;; (`print-level' and `print-length') in place. For interactive
- ;; use, the cost of ensuring this possibly outweighs the advantage
- ;; of storing the backtrace for
- ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we
- ;; already have `ert-results-rerun-test-debugging-errors-at-point'.
- ;; For batch use, however, printing the backtrace may be useful.
- (loop
- ;; 6 is the number of frames our own debugger adds (when
- ;; compiled; more when interpreted). FIXME: Need to describe a
- ;; procedure for determining this constant.
- for i from 6
- for frame = (backtrace-frame i)
- while frame
- collect frame))
-
-(defun ert--print-backtrace (backtrace)
- "Format the backtrace BACKTRACE to the current buffer."
- ;; This is essentially a reimplementation of Fbacktrace
- ;; (src/eval.c), but for a saved backtrace, not the current one.
- (let ((print-escape-newlines t)
- (print-level 8)
- (print-length 50))
- (dolist (frame backtrace)
- (ecase (first frame)
- ((nil)
- ;; Special operator.
- (destructuring-bind (special-operator &rest arg-forms)
- (cdr frame)
- (insert
- (format " %S\n" (list* special-operator arg-forms)))))
- ((t)
- ;; Function call.
- (destructuring-bind (fn &rest args) (cdr frame)
- (insert (format " %S(" fn))
- (loop for firstp = t then nil
- for arg in args do
- (unless firstp
- (insert " "))
- (insert (format "%S" arg)))
- (insert ")\n")))))))
-
-;; A container for the state of the execution of a single test and
-;; environment data needed during its execution.
-(defstruct ert--test-execution-info
- (test (assert nil))
- (result (assert nil))
- ;; A thunk that may be called when RESULT has been set to its final
- ;; value and test execution should be terminated. Should not
- ;; return.
- (exit-continuation (assert nil))
- ;; The binding of `debugger' outside of the execution of the test.
- next-debugger
- ;; The binding of `ert-debug-on-error' that is in effect for the
- ;; execution of the current test. We store it to avoid being
- ;; affected by any new bindings the test itself may establish. (I
- ;; don't remember whether this feature is important.)
- ert-debug-on-error)
-
-(defun ert--run-test-debugger (info debugger-args)
- "During a test run, `debugger' is bound to a closure that calls this function.
-
-This function records failures and errors and either terminates
-the test silently or calls the interactive debugger, as
-appropriate.
-
-INFO is the ert--test-execution-info corresponding to this test
-run. DEBUGGER-ARGS are the arguments to `debugger'."
- (destructuring-bind (first-debugger-arg &rest more-debugger-args)
- debugger-args
- (ecase first-debugger-arg
- ((lambda debug t exit nil)
- (apply (ert--test-execution-info-next-debugger info) debugger-args))
- (error
- (let* ((condition (first more-debugger-args))
- (type (case (car condition)
- ((quit) 'quit)
- (otherwise 'failed)))
- (backtrace (ert--record-backtrace))
- (infos (reverse ert--infos)))
- (setf (ert--test-execution-info-result info)
- (ecase type
- (quit
- (make-ert-test-quit :condition condition
- :backtrace backtrace
- :infos infos))
- (failed
- (make-ert-test-failed :condition condition
- :backtrace backtrace
- :infos infos))))
- ;; Work around Emacs' heuristic (in eval.c) for detecting
- ;; errors in the debugger.
- (incf num-nonmacro-input-events)
- ;; FIXME: We should probably implement more fine-grained
- ;; control a la non-t `debug-on-error' here.
- (cond
- ((ert--test-execution-info-ert-debug-on-error info)
- (apply (ert--test-execution-info-next-debugger info) debugger-args))
- (t))
- (funcall (ert--test-execution-info-exit-continuation info)))))))
-
-(defun ert--run-test-internal (ert-test-execution-info)
- "Low-level function to run a test according to ERT-TEST-EXECUTION-INFO.
-
-This mainly sets up debugger-related bindings."
- (lexical-let ((info ert-test-execution-info))
- (setf (ert--test-execution-info-next-debugger info) debugger
- (ert--test-execution-info-ert-debug-on-error info) ert-debug-on-error)
- (catch 'ert--pass
- ;; For now, each test gets its own temp buffer and its own
- ;; window excursion, just to be safe. If this turns out to be
- ;; too expensive, we can remove it.
- (with-temp-buffer
- (save-window-excursion
- (let ((debugger (lambda (&rest debugger-args)
- (ert--run-test-debugger info debugger-args)))
- (debug-on-error t)
- (debug-on-quit t)
- ;; FIXME: Do we need to store the old binding of this
- ;; and consider it in `ert--run-test-debugger'?
- (debug-ignored-errors nil)
- (ert--infos '()))
- (funcall (ert-test-body (ert--test-execution-info-test info))))))
- (ert-pass))
- (setf (ert--test-execution-info-result info) (make-ert-test-passed)))
- nil)
-
-(defun ert--force-message-log-buffer-truncation ()
- "Immediately truncate *Messages* buffer according to `message-log-max'.
-
-This can be useful after reducing the value of `message-log-max'."
- (with-current-buffer (get-buffer-create "*Messages*")
- ;; This is a reimplementation of this part of message_dolog() in xdisp.c:
- ;; if (NATNUMP (Vmessage_log_max))
- ;; {
- ;; scan_newline (Z, Z_BYTE, BEG, BEG_BYTE,
- ;; -XFASTINT (Vmessage_log_max) - 1, 0);
- ;; del_range_both (BEG, BEG_BYTE, PT, PT_BYTE, 0);
- ;; }
- (when (and (integerp message-log-max) (>= message-log-max 0))
- (let ((begin (point-min))
- (end (save-excursion
- (goto-char (point-max))
- (forward-line (- message-log-max))
- (point))))
- (delete-region begin end)))))
-
-(defvar ert--running-tests nil
- "List of tests that are currently in execution.
-
-This list is empty while no test is running, has one element
-while a test is running, two elements while a test run from
-inside a test is running, etc. The list is in order of nesting,
-innermost test first.
-
-The elements are of type `ert-test'.")
-
-(defun ert-run-test (ert-test)
- "Run ERT-TEST.
-
-Returns the result and stores it in ERT-TEST's `most-recent-result' slot."
- (setf (ert-test-most-recent-result ert-test) nil)
- (block error
- (lexical-let ((begin-marker
- (with-current-buffer (get-buffer-create "*Messages*")
- (set-marker (make-marker) (point-max)))))
- (unwind-protect
- (lexical-let ((info (make-ert--test-execution-info
- :test ert-test
- :result
- (make-ert-test-aborted-with-non-local-exit)
- :exit-continuation (lambda ()
- (return-from error nil))))
- (should-form-accu (list)))
- (unwind-protect
- (let ((ert--should-execution-observer
- (lambda (form-description)
- (push form-description should-form-accu)))
- (message-log-max t)
- (ert--running-tests (cons ert-test ert--running-tests)))
- (ert--run-test-internal info))
- (let ((result (ert--test-execution-info-result info)))
- (setf (ert-test-result-messages result)
- (with-current-buffer (get-buffer-create "*Messages*")
- (buffer-substring begin-marker (point-max))))
- (ert--force-message-log-buffer-truncation)
- (setq should-form-accu (nreverse should-form-accu))
- (setf (ert-test-result-should-forms result)
- should-form-accu)
- (setf (ert-test-most-recent-result ert-test) result))))
- (set-marker begin-marker nil))))
- (ert-test-most-recent-result ert-test))
-
-(defun ert-running-test ()
- "Return the top-level test currently executing."
- (car (last ert--running-tests)))
-
-
-;;; Test selectors.
-
-(defun ert-test-result-type-p (result result-type)
- "Return non-nil if RESULT matches type RESULT-TYPE.
-
-Valid result types:
-
-nil -- Never matches.
-t -- Always matches.
-:failed, :passed -- Matches corresponding results.
-\(and TYPES...\) -- Matches if all TYPES match.
-\(or TYPES...\) -- Matches if some TYPES match.
-\(not TYPE\) -- Matches if TYPE does not match.
-\(satisfies PREDICATE\) -- Matches if PREDICATE returns true when called with
- RESULT."
- ;; It would be easy to add `member' and `eql' types etc., but I
- ;; haven't bothered yet.
- (etypecase result-type
- ((member nil) nil)
- ((member t) t)
- ((member :failed) (ert-test-failed-p result))
- ((member :passed) (ert-test-passed-p result))
- (cons
- (destructuring-bind (operator &rest operands) result-type
- (ecase operator
- (and
- (case (length operands)
- (0 t)
- (t
- (and (ert-test-result-type-p result (first operands))
- (ert-test-result-type-p result `(and ,@(rest operands)))))))
- (or
- (case (length operands)
- (0 nil)
- (t
- (or (ert-test-result-type-p result (first operands))
- (ert-test-result-type-p result `(or ,@(rest operands)))))))
- (not
- (assert (eql (length operands) 1))
- (not (ert-test-result-type-p result (first operands))))
- (satisfies
- (assert (eql (length operands) 1))
- (funcall (first operands) result)))))))
-
-(defun ert-test-result-expected-p (test result)
- "Return non-nil if TEST's expected result type matches RESULT."
- (ert-test-result-type-p result (ert-test-expected-result-type test)))
-
-(defun ert-select-tests (selector universe)
- "Return the tests that match SELECTOR.
-
-UNIVERSE specifies the set of tests to select from; it should be
-a list of tests, or t, which refers to all tests named by symbols
-in `obarray'.
-
-Returns the set of tests as a list.
-
-Valid selectors:
-
-nil -- Selects the empty set.
-t -- Selects UNIVERSE.
-:new -- Selects all tests that have not been run yet.
-:failed, :passed -- Select tests according to their most recent result.
-:expected, :unexpected -- Select tests according to their most recent result.
-a string -- Selects all tests that have a name that matches the string,
- a regexp.
-a test -- Selects that test.
-a symbol -- Selects the test that the symbol names, errors if none.
-\(member TESTS...\) -- Selects TESTS, a list of tests or symbols naming tests.
-\(eql TEST\) -- Selects TEST, a test or a symbol naming a test.
-\(and SELECTORS...\) -- Selects the tests that match all SELECTORS.
-\(or SELECTORS...\) -- Selects the tests that match any SELECTOR.
-\(not SELECTOR\) -- Selects all tests that do not match SELECTOR.
-\(tag TAG) -- Selects all tests that have TAG on their tags list.
-\(satisfies PREDICATE\) -- Selects all tests that satisfy PREDICATE.
-
-Only selectors that require a superset of tests, such
-as (satisfies ...), strings, :new, etc. make use of UNIVERSE.
-Selectors that do not, such as \(member ...\), just return the
-set implied by them without checking whether it is really
-contained in UNIVERSE."
- ;; This code needs to match the etypecase in
- ;; `ert-insert-human-readable-selector'.
- (etypecase selector
- ((member nil) nil)
- ((member t) (etypecase universe
- (list universe)
- ((member t) (ert-select-tests "" universe))))
- ((member :new) (ert-select-tests
- `(satisfies ,(lambda (test)
- (null (ert-test-most-recent-result test))))
- universe))
- ((member :failed) (ert-select-tests
- `(satisfies ,(lambda (test)
- (ert-test-result-type-p
- (ert-test-most-recent-result test)
- ':failed)))
- universe))
- ((member :passed) (ert-select-tests
- `(satisfies ,(lambda (test)
- (ert-test-result-type-p
- (ert-test-most-recent-result test)
- ':passed)))
- universe))
- ((member :expected) (ert-select-tests
- `(satisfies
- ,(lambda (test)
- (ert-test-result-expected-p
- test
- (ert-test-most-recent-result test))))
- universe))
- ((member :unexpected) (ert-select-tests `(not :expected) universe))
- (string
- (etypecase universe
- ((member t) (mapcar #'ert-get-test
- (apropos-internal selector #'ert-test-boundp)))
- (list (ert--remove-if-not (lambda (test)
- (and (ert-test-name test)
- (string-match selector
- (ert-test-name test))))
- universe))))
- (ert-test (list selector))
- (symbol
- (assert (ert-test-boundp selector))
- (list (ert-get-test selector)))
- (cons
- (destructuring-bind (operator &rest operands) selector
- (ecase operator
- (member
- (mapcar (lambda (purported-test)
- (etypecase purported-test
- (symbol (assert (ert-test-boundp purported-test))
- (ert-get-test purported-test))
- (ert-test purported-test)))
- operands))
- (eql
- (assert (eql (length operands) 1))
- (ert-select-tests `(member ,@operands) universe))
- (and
- ;; Do these definitions of AND, NOT and OR satisfy de
- ;; Morgan's laws? Should they?
- (case (length operands)
- (0 (ert-select-tests 't universe))
- (t (ert-select-tests `(and ,@(rest operands))
- (ert-select-tests (first operands)
- universe)))))
- (not
- (assert (eql (length operands) 1))
- (let ((all-tests (ert-select-tests 't universe)))
- (ert--set-difference all-tests
- (ert-select-tests (first operands)
- all-tests))))
- (or
- (case (length operands)
- (0 (ert-select-tests 'nil universe))
- (t (ert--union (ert-select-tests (first operands) universe)
- (ert-select-tests `(or ,@(rest operands))
- universe)))))
- (tag
- (assert (eql (length operands) 1))
- (let ((tag (first operands)))
- (ert-select-tests `(satisfies
- ,(lambda (test)
- (member tag (ert-test-tags test))))
- universe)))
- (satisfies
- (assert (eql (length operands) 1))
- (ert--remove-if-not (first operands)
- (ert-select-tests 't universe))))))))
-
-(defun ert--insert-human-readable-selector (selector)
- "Insert a human-readable presentation of SELECTOR into the current buffer."
- ;; This is needed to avoid printing the (huge) contents of the
- ;; `backtrace' slot of the result objects in the
- ;; `most-recent-result' slots of test case objects in (eql ...) or
- ;; (member ...) selectors.
- (labels ((rec (selector)
- ;; This code needs to match the etypecase in `ert-select-tests'.
- (etypecase selector
- ((or (member nil t
- :new :failed :passed
- :expected :unexpected)
- string
- symbol)
- selector)
- (ert-test
- (if (ert-test-name selector)
- (make-symbol (format "<%S>" (ert-test-name selector)))
- (make-symbol "<unnamed test>")))
- (cons
- (destructuring-bind (operator &rest operands) selector
- (ecase operator
- ((member eql and not or)
- `(,operator ,@(mapcar #'rec operands)))
- ((member tag satisfies)
- selector)))))))
- (insert (format "%S" (rec selector)))))
-
-
-;;; Facilities for running a whole set of tests.
-
-;; The data structure that contains the set of tests being executed
-;; during one particular test run, their results, the state of the
-;; execution, and some statistics.
-;;
-;; The data about results and expected results of tests may seem
-;; redundant here, since the test objects also carry such information.
-;; However, the information in the test objects may be more recent, it
-;; may correspond to a different test run. We need the information
-;; that corresponds to this run in order to be able to update the
-;; statistics correctly when a test is re-run interactively and has a
-;; different result than before.
-(defstruct ert--stats
- (selector (assert nil))
- ;; The tests, in order.
- (tests (assert nil) :type vector)
- ;; A map of test names (or the test objects themselves for unnamed
- ;; tests) to indices into the `tests' vector.
- (test-map (assert nil) :type hash-table)
- ;; The results of the tests during this run, in order.
- (test-results (assert nil) :type vector)
- ;; The start times of the tests, in order, as reported by
- ;; `current-time'.
- (test-start-times (assert nil) :type vector)
- ;; The end times of the tests, in order, as reported by
- ;; `current-time'.
- (test-end-times (assert nil) :type vector)
- (passed-expected 0)
- (passed-unexpected 0)
- (failed-expected 0)
- (failed-unexpected 0)
- (start-time nil)
- (end-time nil)
- (aborted-p nil)
- (current-test nil)
- ;; The time at or after which the next redisplay should occur, as a
- ;; float.
- (next-redisplay 0.0))
-
-(defun ert-stats-completed-expected (stats)
- "Return the number of tests in STATS that had expected results."
- (+ (ert--stats-passed-expected stats)
- (ert--stats-failed-expected stats)))
-
-(defun ert-stats-completed-unexpected (stats)
- "Return the number of tests in STATS that had unexpected results."
- (+ (ert--stats-passed-unexpected stats)
- (ert--stats-failed-unexpected stats)))
-
-(defun ert-stats-completed (stats)
- "Number of tests in STATS that have run so far."
- (+ (ert-stats-completed-expected stats)
- (ert-stats-completed-unexpected stats)))
-
-(defun ert-stats-total (stats)
- "Number of tests in STATS, regardless of whether they have run yet."
- (length (ert--stats-tests stats)))
-
-;; The stats object of the current run, dynamically bound. This is
-;; used for the mode line progress indicator.
-(defvar ert--current-run-stats nil)
-
-(defun ert--stats-test-key (test)
- "Return the key used for TEST in the test map of ert--stats objects.
-
-Returns the name of TEST if it has one, or TEST itself otherwise."
- (or (ert-test-name test) test))
-
-(defun ert--stats-set-test-and-result (stats pos test result)
- "Change STATS by replacing the test at position POS with TEST and RESULT.
-
-Also changes the counters in STATS to match."
- (let* ((tests (ert--stats-tests stats))
- (results (ert--stats-test-results stats))
- (old-test (aref tests pos))
- (map (ert--stats-test-map stats)))
- (flet ((update (d)
- (if (ert-test-result-expected-p (aref tests pos)
- (aref results pos))
- (etypecase (aref results pos)
- (ert-test-passed (incf (ert--stats-passed-expected stats) d))
- (ert-test-failed (incf (ert--stats-failed-expected stats) d))
- (null)
- (ert-test-aborted-with-non-local-exit)
- (ert-test-quit))
- (etypecase (aref results pos)
- (ert-test-passed (incf (ert--stats-passed-unexpected stats) d))
- (ert-test-failed (incf (ert--stats-failed-unexpected stats) d))
- (null)
- (ert-test-aborted-with-non-local-exit)
- (ert-test-quit)))))
- ;; Adjust counters to remove the result that is currently in stats.
- (update -1)
- ;; Put new test and result into stats.
- (setf (aref tests pos) test
- (aref results pos) result)
- (remhash (ert--stats-test-key old-test) map)
- (setf (gethash (ert--stats-test-key test) map) pos)
- ;; Adjust counters to match new result.
- (update +1)
- nil)))
-
-(defun ert--make-stats (tests selector)
- "Create a new `ert--stats' object for running TESTS.
-
-SELECTOR is the selector that was used to select TESTS."
- (setq tests (ert--coerce-to-vector tests))
- (let ((map (make-hash-table :size (length tests))))
- (loop for i from 0
- for test across tests
- for key = (ert--stats-test-key test) do
- (assert (not (gethash key map)))
- (setf (gethash key map) i))
- (make-ert--stats :selector selector
- :tests tests
- :test-map map
- :test-results (make-vector (length tests) nil)
- :test-start-times (make-vector (length tests) nil)
- :test-end-times (make-vector (length tests) nil))))
-
-(defun ert-run-or-rerun-test (stats test listener)
- ;; checkdoc-order: nil
- "Run the single test TEST and record the result using STATS and LISTENER."
- (let ((ert--current-run-stats stats)
- (pos (ert--stats-test-pos stats test)))
- (ert--stats-set-test-and-result stats pos test nil)
- ;; Call listener after setting/before resetting
- ;; (ert--stats-current-test stats); the listener might refresh the
- ;; mode line display, and if the value is not set yet/any more
- ;; during this refresh, the mode line will flicker unnecessarily.
- (setf (ert--stats-current-test stats) test)
- (funcall listener 'test-started stats test)
- (setf (ert-test-most-recent-result test) nil)
- (setf (aref (ert--stats-test-start-times stats) pos) (current-time))
- (unwind-protect
- (ert-run-test test)
- (setf (aref (ert--stats-test-end-times stats) pos) (current-time))
- (let ((result (ert-test-most-recent-result test)))
- (ert--stats-set-test-and-result stats pos test result)
- (funcall listener 'test-ended stats test result))
- (setf (ert--stats-current-test stats) nil))))
-
-(defun ert-run-tests (selector listener)
- "Run the tests specified by SELECTOR, sending progress updates to LISTENER."
- (let* ((tests (ert-select-tests selector t))
- (stats (ert--make-stats tests selector)))
- (setf (ert--stats-start-time stats) (current-time))
- (funcall listener 'run-started stats)
- (let ((abortedp t))
- (unwind-protect
- (let ((ert--current-run-stats stats))
- (force-mode-line-update)
- (unwind-protect
- (progn
- (loop for test in tests do
- (ert-run-or-rerun-test stats test listener))
- (setq abortedp nil))
- (setf (ert--stats-aborted-p stats) abortedp)
- (setf (ert--stats-end-time stats) (current-time))
- (funcall listener 'run-ended stats abortedp)))
- (force-mode-line-update))
- stats)))
-
-(defun ert--stats-test-pos (stats test)
- ;; checkdoc-order: nil
- "Return the position (index) of TEST in the run represented by STATS."
- (gethash (ert--stats-test-key test) (ert--stats-test-map stats)))
-
-
-;;; Formatting functions shared across UIs.
-
-(defun ert--format-time-iso8601 (time)
- "Format TIME in the variant of ISO 8601 used for timestamps in ERT."
- (format-time-string "%Y-%m-%d %T%z" time))
-
-(defun ert-char-for-test-result (result expectedp)
- "Return a character that represents the test result RESULT.
-
-EXPECTEDP specifies whether the result was expected."
- (let ((s (etypecase result
- (ert-test-passed ".P")
- (ert-test-failed "fF")
- (null "--")
- (ert-test-aborted-with-non-local-exit "aA")
- (ert-test-quit "qQ"))))
- (elt s (if expectedp 0 1))))
-
-(defun ert-string-for-test-result (result expectedp)
- "Return a string that represents the test result RESULT.
-
-EXPECTEDP specifies whether the result was expected."
- (let ((s (etypecase result
- (ert-test-passed '("passed" "PASSED"))
- (ert-test-failed '("failed" "FAILED"))
- (null '("unknown" "UNKNOWN"))
- (ert-test-aborted-with-non-local-exit '("aborted" "ABORTED"))
- (ert-test-quit '("quit" "QUIT")))))
- (elt s (if expectedp 0 1))))
-
-(defun ert--pp-with-indentation-and-newline (object)
- "Pretty-print OBJECT, indenting it to the current column of point.
-Ensures a final newline is inserted."
- (let ((begin (point)))
- (pp object (current-buffer))
- (unless (bolp) (insert "\n"))
- (save-excursion
- (goto-char begin)
- (indent-sexp))))
-
-(defun ert--insert-infos (result)
- "Insert `ert-info' infos from RESULT into current buffer.
-
-RESULT must be an `ert-test-result-with-condition'."
- (check-type result ert-test-result-with-condition)
- (dolist (info (ert-test-result-with-condition-infos result))
- (destructuring-bind (prefix . message) info
- (let ((begin (point))
- (indentation (make-string (+ (length prefix) 4) ?\s))
- (end nil))
- (unwind-protect
- (progn
- (insert message "\n")
- (setq end (copy-marker (point)))
- (goto-char begin)
- (insert " " prefix)
- (forward-line 1)
- (while (< (point) end)
- (insert indentation)
- (forward-line 1)))
- (when end (set-marker end nil)))))))
-
-
-;;; Running tests in batch mode.
-
-(defvar ert-batch-backtrace-right-margin 70
- "*The maximum line length for printing backtraces in `ert-run-tests-batch'.")
-
-;;;###autoload
-(defun ert-run-tests-batch (&optional selector)
- "Run the tests specified by SELECTOR, printing results to the terminal.
-
-SELECTOR works as described in `ert-select-tests', except if
-SELECTOR is nil, in which case all tests rather than none will be
-run; this makes the command line \"emacs -batch -l my-tests.el -f
-ert-run-tests-batch-and-exit\" useful.
-
-Returns the stats object."
- (unless selector (setq selector 't))
- (ert-run-tests
- selector
- (lambda (event-type &rest event-args)
- (ecase event-type
- (run-started
- (destructuring-bind (stats) event-args
- (message "Running %s tests (%s)"
- (length (ert--stats-tests stats))
- (ert--format-time-iso8601 (ert--stats-start-time stats)))))
- (run-ended
- (destructuring-bind (stats abortedp) event-args
- (let ((unexpected (ert-stats-completed-unexpected stats))
- (expected-failures (ert--stats-failed-expected stats)))
- (message "\n%sRan %s tests, %s results as expected%s (%s)%s\n"
- (if (not abortedp)
- ""
- "Aborted: ")
- (ert-stats-total stats)
- (ert-stats-completed-expected stats)
- (if (zerop unexpected)
- ""
- (format ", %s unexpected" unexpected))
- (ert--format-time-iso8601 (ert--stats-end-time stats))
- (if (zerop expected-failures)
- ""
- (format "\n%s expected failures" expected-failures)))
- (unless (zerop unexpected)
- (message "%s unexpected results:" unexpected)
- (loop for test across (ert--stats-tests stats)
- for result = (ert-test-most-recent-result test) do
- (when (not (ert-test-result-expected-p test result))
- (message "%9s %S"
- (ert-string-for-test-result result nil)
- (ert-test-name test))))
- (message "%s" "")))))
- (test-started
- )
- (test-ended
- (destructuring-bind (stats test result) event-args
- (unless (ert-test-result-expected-p test result)
- (etypecase result
- (ert-test-passed
- (message "Test %S passed unexpectedly" (ert-test-name test)))
- (ert-test-result-with-condition
- (message "Test %S backtrace:" (ert-test-name test))
- (with-temp-buffer
- (ert--print-backtrace (ert-test-result-with-condition-backtrace
- result))
- (goto-char (point-min))
- (while (not (eobp))
- (let ((start (point))
- (end (progn (end-of-line) (point))))
- (setq end (min end
- (+ start ert-batch-backtrace-right-margin)))
- (message "%s" (buffer-substring-no-properties
- start end)))
- (forward-line 1)))
- (with-temp-buffer
- (ert--insert-infos result)
- (insert " ")
- (let ((print-escape-newlines t)
- (print-level 5)
- (print-length 10))
- (let ((begin (point)))
- (ert--pp-with-indentation-and-newline
- (ert-test-result-with-condition-condition result))))
- (goto-char (1- (point-max)))
- (assert (looking-at "\n"))
- (delete-char 1)
- (message "Test %S condition:" (ert-test-name test))
- (message "%s" (buffer-string))))
- (ert-test-aborted-with-non-local-exit
- (message "Test %S aborted with non-local exit"
- (ert-test-name test)))
- (ert-test-quit
- (message "Quit during %S" (ert-test-name test)))))
- (let* ((max (prin1-to-string (length (ert--stats-tests stats))))
- (format-string (concat "%9s %"
- (prin1-to-string (length max))
- "s/" max " %S")))
- (message format-string
- (ert-string-for-test-result result
- (ert-test-result-expected-p
- test result))
- (1+ (ert--stats-test-pos stats test))
- (ert-test-name test)))))))))
-
-;;;###autoload
-(defun ert-run-tests-batch-and-exit (&optional selector)
- "Like `ert-run-tests-batch', but exits Emacs when done.
-
-The exit status will be 0 if all test results were as expected, 1
-on unexpected results, or 2 if the tool detected an error outside
-of the tests (e.g. invalid SELECTOR or bug in the code that runs
-the tests)."
- (unwind-protect
- (let ((stats (ert-run-tests-batch selector)))
- (kill-emacs (if (zerop (ert-stats-completed-unexpected stats)) 0 1)))
- (unwind-protect
- (progn
- (message "Error running tests")
- (backtrace))
- (kill-emacs 2))))
-
-
-;;; Utility functions for load/unload actions.
-
-(defun ert--activate-font-lock-keywords ()
- "Activate font-lock keywords for some of ERT's symbols."
- (font-lock-add-keywords
- nil
- '(("(\\(\\<ert-deftest\\)\\>\\s *\\(\\sw+\\)?"
- (1 font-lock-keyword-face nil t)
- (2 font-lock-function-name-face nil t)))))
-
-(defun* ert--remove-from-list (list-var element &key key test)
- "Remove ELEMENT from the value of LIST-VAR if present.
-
-This can be used as an inverse of `add-to-list'."
- (unless key (setq key #'identity))
- (unless test (setq test #'equal))
- (setf (symbol-value list-var)
- (ert--remove* element
- (symbol-value list-var)
- :key key
- :test test)))
-
-
-;;; Some basic interactive functions.
-
-(defun ert-read-test-name (prompt &optional default history
- add-default-to-prompt)
- "Read the name of a test and return it as a symbol.
-
-Prompt with PROMPT. If DEFAULT is a valid test name, use it as a
-default. HISTORY is the history to use; see `completing-read'.
-If ADD-DEFAULT-TO-PROMPT is non-nil, PROMPT will be modified to
-include the default, if any.
-
-Signals an error if no test name was read."
- (etypecase default
- (string (let ((symbol (intern-soft default)))
- (unless (and symbol (ert-test-boundp symbol))
- (setq default nil))))
- (symbol (setq default
- (if (ert-test-boundp default)
- (symbol-name default)
- nil)))
- (ert-test (setq default (ert-test-name default))))
- (when add-default-to-prompt
- (setq prompt (if (null default)
- (format "%s: " prompt)
- (format "%s (default %s): " prompt default))))
- (let ((input (completing-read prompt obarray #'ert-test-boundp
- t nil history default nil)))
- ;; completing-read returns an empty string if default was nil and
- ;; the user just hit enter.
- (let ((sym (intern-soft input)))
- (if (ert-test-boundp sym)
- sym
- (error "Input does not name a test")))))
-
-(defun ert-read-test-name-at-point (prompt)
- "Read the name of a test and return it as a symbol.
-As a default, use the symbol at point, or the test at point if in
-the ERT results buffer. Prompt with PROMPT, augmented with the
-default (if any)."
- (ert-read-test-name prompt (ert-test-at-point) nil t))
-
-(defun ert-find-test-other-window (test-name)
- "Find, in another window, the definition of TEST-NAME."
- (interactive (list (ert-read-test-name-at-point "Find test definition: ")))
- (find-function-do-it test-name 'ert-deftest 'switch-to-buffer-other-window))
-
-(defun ert-delete-test (test-name)
- "Make the test TEST-NAME unbound.
-
-Nothing more than an interactive interface to `ert-make-test-unbound'."
- (interactive (list (ert-read-test-name-at-point "Delete test")))
- (ert-make-test-unbound test-name))
-
-(defun ert-delete-all-tests ()
- "Make all symbols in `obarray' name no test."
- (interactive)
- (when (interactive-p)
- (unless (y-or-n-p "Delete all tests? ")
- (error "Aborted")))
- ;; We can't use `ert-select-tests' here since that gives us only
- ;; test objects, and going from them back to the test name symbols
- ;; can fail if the `ert-test' defstruct has been redefined.
- (mapc #'ert-make-test-unbound (apropos-internal "" #'ert-test-boundp))
- t)
-
-
-;;; Display of test progress and results.
-
-;; An entry in the results buffer ewoc. There is one entry per test.
-(defstruct ert--ewoc-entry
- (test (assert nil))
- ;; If the result of this test was expected, its ewoc entry is hidden
- ;; initially.
- (hidden-p (assert nil))
- ;; An ewoc entry may be collapsed to hide details such as the error
- ;; condition.
- ;;
- ;; I'm not sure the ability to expand and collapse entries is still
- ;; a useful feature.
- (expanded-p t)
- ;; By default, the ewoc entry presents the error condition with
- ;; certain limits on how much to print (`print-level',
- ;; `print-length'). The user can interactively switch to a set of
- ;; higher limits.
- (extended-printer-limits-p nil))
-
-;; Variables local to the results buffer.
-
-;; The ewoc.
-(defvar ert--results-ewoc)
-;; The stats object.
-(defvar ert--results-stats)
-;; A string with one character per test. Each character represents
-;; the result of the corresponding test. The string is displayed near
-;; the top of the buffer and serves as a progress bar.
-(defvar ert--results-progress-bar-string)
-;; The position where the progress bar button begins.
-(defvar ert--results-progress-bar-button-begin)
-;; The test result listener that updates the buffer when tests are run.
-(defvar ert--results-listener)
-
-(defun ert-insert-test-name-button (test-name)
- "Insert a button that links to TEST-NAME."
- (insert-text-button (format "%S" test-name)
- :type 'ert--test-name-button
- 'ert-test-name test-name))
-
-(defun ert--results-format-expected-unexpected (expected unexpected)
- "Return a string indicating EXPECTED expected results, UNEXPECTED unexpected."
- (if (zerop unexpected)
- (format "%s" expected)
- (format "%s (%s unexpected)" (+ expected unexpected) unexpected)))
-
-(defun ert--results-update-ewoc-hf (ewoc stats)
- "Update the header and footer of EWOC to show certain information from STATS.
-
-Also sets `ert--results-progress-bar-button-begin'."
- (let ((run-count (ert-stats-completed stats))
- (results-buffer (current-buffer))
- ;; Need to save buffer-local value.
- (font-lock font-lock-mode))
- (ewoc-set-hf
- ewoc
- ;; header
- (with-temp-buffer
- (insert "Selector: ")
- (ert--insert-human-readable-selector (ert--stats-selector stats))
- (insert "\n")
- (insert
- (format (concat "Passed: %s\n"
- "Failed: %s\n"
- "Total: %s/%s\n\n")
- (ert--results-format-expected-unexpected
- (ert--stats-passed-expected stats)
- (ert--stats-passed-unexpected stats))
- (ert--results-format-expected-unexpected
- (ert--stats-failed-expected stats)
- (ert--stats-failed-unexpected stats))
- run-count
- (ert-stats-total stats)))
- (insert
- (format "Started at: %s\n"
- (ert--format-time-iso8601 (ert--stats-start-time stats))))
- ;; FIXME: This is ugly. Need to properly define invariants of
- ;; the `stats' data structure.
- (let ((state (cond ((ert--stats-aborted-p stats) 'aborted)
- ((ert--stats-current-test stats) 'running)
- ((ert--stats-end-time stats) 'finished)
- (t 'preparing))))
- (ecase state
- (preparing
- (insert ""))
- (aborted
- (cond ((ert--stats-current-test stats)
- (insert "Aborted during test: ")
- (ert-insert-test-name-button
- (ert-test-name (ert--stats-current-test stats))))
- (t
- (insert "Aborted."))))
- (running
- (assert (ert--stats-current-test stats))
- (insert "Running test: ")
- (ert-insert-test-name-button (ert-test-name
- (ert--stats-current-test stats))))
- (finished
- (assert (not (ert--stats-current-test stats)))
- (insert "Finished.")))
- (insert "\n")
- (if (ert--stats-end-time stats)
- (insert
- (format "%s%s\n"
- (if (ert--stats-aborted-p stats)
- "Aborted at: "
- "Finished at: ")
- (ert--format-time-iso8601 (ert--stats-end-time stats))))
- (insert "\n"))
- (insert "\n"))
- (let ((progress-bar-string (with-current-buffer results-buffer
- ert--results-progress-bar-string)))
- (let ((progress-bar-button-begin
- (insert-text-button progress-bar-string
- :type 'ert--results-progress-bar-button
- 'face (or (and font-lock
- (ert-face-for-stats stats))
- 'button))))
- ;; The header gets copied verbatim to the results buffer,
- ;; and all positions remain the same, so
- ;; `progress-bar-button-begin' will be the right position
- ;; even in the results buffer.
- (with-current-buffer results-buffer
- (set (make-local-variable 'ert--results-progress-bar-button-begin)
- progress-bar-button-begin))))
- (insert "\n\n")
- (buffer-string))
- ;; footer
- ;;
- ;; We actually want an empty footer, but that would trigger a bug
- ;; in ewoc, sometimes clearing the entire buffer. (It's possible
- ;; that this bug has been fixed since this has been tested; we
- ;; should test it again.)
- "\n")))
-
-
-(defvar ert-test-run-redisplay-interval-secs .1
- "How many seconds ERT should wait between redisplays while running tests.
-
-While running tests, ERT shows the current progress, and this variable
-determines how frequently the progress display is updated.")
-
-(defun ert--results-update-stats-display (ewoc stats)
- "Update EWOC and the mode line to show data from STATS."
- ;; TODO(ohler): investigate using `make-progress-reporter'.
- (ert--results-update-ewoc-hf ewoc stats)
- (force-mode-line-update)
- (redisplay t)
- (setf (ert--stats-next-redisplay stats)
- (+ (float-time) ert-test-run-redisplay-interval-secs)))
-
-(defun ert--results-update-stats-display-maybe (ewoc stats)
- "Call `ert--results-update-stats-display' if not called recently.
-
-EWOC and STATS are arguments for `ert--results-update-stats-display'."
- (when (>= (float-time) (ert--stats-next-redisplay stats))
- (ert--results-update-stats-display ewoc stats)))
-
-(defun ert--tests-running-mode-line-indicator ()
- "Return a string for the mode line that shows the test run progress."
- (let* ((stats ert--current-run-stats)
- (tests-total (ert-stats-total stats))
- (tests-completed (ert-stats-completed stats)))
- (if (>= tests-completed tests-total)
- (format " ERT(%s/%s,finished)" tests-completed tests-total)
- (format " ERT(%s/%s):%s"
- (1+ tests-completed)
- tests-total
- (if (null (ert--stats-current-test stats))
- "?"
- (format "%S"
- (ert-test-name (ert--stats-current-test stats))))))))
-
-(defun ert--make-xrefs-region (begin end)
- "Attach cross-references to function names between BEGIN and END.
-
-BEGIN and END specify a region in the current buffer."
- (save-excursion
- (save-restriction
- (narrow-to-region begin (point))
- ;; Inhibit optimization in `debugger-make-xrefs' that would
- ;; sometimes insert unrelated backtrace info into our buffer.
- (let ((debugger-previous-backtrace nil))
- (debugger-make-xrefs)))))
-
-(defun ert--string-first-line (s)
- "Return the first line of S, or S if it contains no newlines.
-
-The return value does not include the line terminator."
- (substring s 0 (ert--string-position ?\n s)))
-
-(defun ert-face-for-test-result (expectedp)
- "Return a face that shows whether a test result was expected or unexpected.
-
-If EXPECTEDP is nil, returns the face for unexpected results; if
-non-nil, returns the face for expected results.."
- (if expectedp 'ert-test-result-expected 'ert-test-result-unexpected))
-
-(defun ert-face-for-stats (stats)
- "Return a face that represents STATS."
- (cond ((ert--stats-aborted-p stats) 'nil)
- ((plusp (ert-stats-completed-unexpected stats))
- (ert-face-for-test-result nil))
- ((eql (ert-stats-completed-expected stats) (ert-stats-total stats))
- (ert-face-for-test-result t))
- (t 'nil)))
-
-(defun ert--print-test-for-ewoc (entry)
- "The ewoc print function for ewoc test entries. ENTRY is the entry to print."
- (let* ((test (ert--ewoc-entry-test entry))
- (stats ert--results-stats)
- (result (let ((pos (ert--stats-test-pos stats test)))
- (assert pos)
- (aref (ert--stats-test-results stats) pos)))
- (hiddenp (ert--ewoc-entry-hidden-p entry))
- (expandedp (ert--ewoc-entry-expanded-p entry))
- (extended-printer-limits-p (ert--ewoc-entry-extended-printer-limits-p
- entry)))
- (cond (hiddenp)
- (t
- (let ((expectedp (ert-test-result-expected-p test result)))
- (insert-text-button (format "%c" (ert-char-for-test-result
- result expectedp))
- :type 'ert--results-expand-collapse-button
- 'face (or (and font-lock-mode
- (ert-face-for-test-result
- expectedp))
- 'button)))
- (insert " ")
- (ert-insert-test-name-button (ert-test-name test))
- (insert "\n")
- (when (and expandedp (not (eql result 'nil)))
- (when (ert-test-documentation test)
- (insert " "
- (propertize
- (ert--string-first-line (ert-test-documentation test))
- 'font-lock-face 'font-lock-doc-face)
- "\n"))
- (etypecase result
- (ert-test-passed
- (if (ert-test-result-expected-p test result)
- (insert " passed\n")
- (insert " passed unexpectedly\n"))
- (insert ""))
- (ert-test-result-with-condition
- (ert--insert-infos result)
- (let ((print-escape-newlines t)
- (print-level (if extended-printer-limits-p 12 6))
- (print-length (if extended-printer-limits-p 100 10)))
- (insert " ")
- (let ((begin (point)))
- (ert--pp-with-indentation-and-newline
- (ert-test-result-with-condition-condition result))
- (ert--make-xrefs-region begin (point)))))
- (ert-test-aborted-with-non-local-exit
- (insert " aborted\n"))
- (ert-test-quit
- (insert " quit\n")))
- (insert "\n")))))
- nil)
-
-(defun ert--results-font-lock-function (enabledp)
- "Redraw the ERT results buffer after font-lock-mode was switched on or off.
-
-ENABLEDP is true if font-lock-mode is switched on, false
-otherwise."
- (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats)
- (ewoc-refresh ert--results-ewoc)
- (font-lock-default-function enabledp))
-
-(defun ert--setup-results-buffer (stats listener buffer-name)
- "Set up a test results buffer.
-
-STATS is the stats object; LISTENER is the results listener;
-BUFFER-NAME, if non-nil, is the buffer name to use."
- (unless buffer-name (setq buffer-name "*ert*"))
- (let ((buffer (get-buffer-create buffer-name)))
- (with-current-buffer buffer
- (let ((inhibit-read-only t))
- (buffer-disable-undo)
- (erase-buffer)
- (ert-results-mode)
- ;; Erase buffer again in case switching out of the previous
- ;; mode inserted anything. (This happens e.g. when switching
- ;; from ert-results-mode to ert-results-mode when
- ;; font-lock-mode turns itself off in change-major-mode-hook.)
- (erase-buffer)
- (set (make-local-variable 'font-lock-function)
- 'ert--results-font-lock-function)
- (let ((ewoc (ewoc-create 'ert--print-test-for-ewoc nil nil t)))
- (set (make-local-variable 'ert--results-ewoc) ewoc)
- (set (make-local-variable 'ert--results-stats) stats)
- (set (make-local-variable 'ert--results-progress-bar-string)
- (make-string (ert-stats-total stats)
- (ert-char-for-test-result nil t)))
- (set (make-local-variable 'ert--results-listener) listener)
- (loop for test across (ert--stats-tests stats) do
- (ewoc-enter-last ewoc
- (make-ert--ewoc-entry :test test :hidden-p t)))
- (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats)
- (goto-char (1- (point-max)))
- buffer)))))
-
-
-(defvar ert--selector-history nil
- "List of recent test selectors read from terminal.")
-
-;; Should OUTPUT-BUFFER-NAME and MESSAGE-FN really be arguments here?
-;; They are needed only for our automated self-tests at the moment.
-;; Or should there be some other mechanism?
-;;;###autoload
-(defun ert-run-tests-interactively (selector
- &optional output-buffer-name message-fn)
- "Run the tests specified by SELECTOR and display the results in a buffer.
-
-SELECTOR works as described in `ert-select-tests'.
-OUTPUT-BUFFER-NAME and MESSAGE-FN should normally be nil; they
-are used for automated self-tests and specify which buffer to use
-and how to display message."
- (interactive
- (list (let ((default (if ert--selector-history
- ;; Can't use `first' here as this form is
- ;; not compiled, and `first' is not
- ;; defined without cl.
- (car ert--selector-history)
- "t")))
- (read-from-minibuffer (if (null default)
- "Run tests: "
- (format "Run tests (default %s): " default))
- nil nil t 'ert--selector-history
- default nil))
- nil))
- (unless message-fn (setq message-fn 'message))
- (lexical-let ((output-buffer-name output-buffer-name)
- buffer
- listener
- (message-fn message-fn))
- (setq listener
- (lambda (event-type &rest event-args)
- (ecase event-type
- (run-started
- (destructuring-bind (stats) event-args
- (setq buffer (ert--setup-results-buffer stats
- listener
- output-buffer-name))
- (pop-to-buffer buffer)))
- (run-ended
- (destructuring-bind (stats abortedp) event-args
- (funcall message-fn
- "%sRan %s tests, %s results were as expected%s"
- (if (not abortedp)
- ""
- "Aborted: ")
- (ert-stats-total stats)
- (ert-stats-completed-expected stats)
- (let ((unexpected
- (ert-stats-completed-unexpected stats)))
- (if (zerop unexpected)
- ""
- (format ", %s unexpected" unexpected))))
- (ert--results-update-stats-display (with-current-buffer buffer
- ert--results-ewoc)
- stats)))
- (test-started
- (destructuring-bind (stats test) event-args
- (with-current-buffer buffer
- (let* ((ewoc ert--results-ewoc)
- (pos (ert--stats-test-pos stats test))
- (node (ewoc-nth ewoc pos)))
- (assert node)
- (setf (ert--ewoc-entry-test (ewoc-data node)) test)
- (aset ert--results-progress-bar-string pos
- (ert-char-for-test-result nil t))
- (ert--results-update-stats-display-maybe ewoc stats)
- (ewoc-invalidate ewoc node)))))
- (test-ended
- (destructuring-bind (stats test result) event-args
- (with-current-buffer buffer
- (let* ((ewoc ert--results-ewoc)
- (pos (ert--stats-test-pos stats test))
- (node (ewoc-nth ewoc pos)))
- (when (ert--ewoc-entry-hidden-p (ewoc-data node))
- (setf (ert--ewoc-entry-hidden-p (ewoc-data node))
- (ert-test-result-expected-p test result)))
- (aset ert--results-progress-bar-string pos
- (ert-char-for-test-result result
- (ert-test-result-expected-p
- test result)))
- (ert--results-update-stats-display-maybe ewoc stats)
- (ewoc-invalidate ewoc node))))))))
- (ert-run-tests
- selector
- listener)))
-;;;###autoload
-(defalias 'ert 'ert-run-tests-interactively)
-
-
-;;; Simple view mode for auxiliary information like stack traces or
-;;; messages. Mainly binds "q" for quit.
-
-(define-derived-mode ert-simple-view-mode special-mode "ERT-View"
- "Major mode for viewing auxiliary information in ERT.")
-
-;;; Commands and button actions for the results buffer.
-
-(define-derived-mode ert-results-mode special-mode "ERT-Results"
- "Major mode for viewing results of ERT test runs.")
-
-(loop for (key binding) in
- '(;; Stuff that's not in the menu.
- ("\t" forward-button)
- ([backtab] backward-button)
- ("j" ert-results-jump-between-summary-and-result)
- ("L" ert-results-toggle-printer-limits-for-test-at-point)
- ("n" ert-results-next-test)
- ("p" ert-results-previous-test)
- ;; Stuff that is in the menu.
- ("R" ert-results-rerun-all-tests)
- ("r" ert-results-rerun-test-at-point)
- ("d" ert-results-rerun-test-at-point-debugging-errors)
- ("." ert-results-find-test-at-point-other-window)
- ("b" ert-results-pop-to-backtrace-for-test-at-point)
- ("m" ert-results-pop-to-messages-for-test-at-point)
- ("l" ert-results-pop-to-should-forms-for-test-at-point)
- ("h" ert-results-describe-test-at-point)
- ("D" ert-delete-test)
- ("T" ert-results-pop-to-timings)
- )
- do
- (define-key ert-results-mode-map key binding))
-
-(easy-menu-define ert-results-mode-menu ert-results-mode-map
- "Menu for `ert-results-mode'."
- '("ERT Results"
- ["Re-run all tests" ert-results-rerun-all-tests]
- "--"
- ["Re-run test" ert-results-rerun-test-at-point]
- ["Debug test" ert-results-rerun-test-at-point-debugging-errors]
- ["Show test definition" ert-results-find-test-at-point-other-window]
- "--"
- ["Show backtrace" ert-results-pop-to-backtrace-for-test-at-point]
- ["Show messages" ert-results-pop-to-messages-for-test-at-point]
- ["Show `should' forms" ert-results-pop-to-should-forms-for-test-at-point]
- ["Describe test" ert-results-describe-test-at-point]
- "--"
- ["Delete test" ert-delete-test]
- "--"
- ["Show execution time of each test" ert-results-pop-to-timings]
- ))
-
-(define-button-type 'ert--results-progress-bar-button
- 'action #'ert--results-progress-bar-button-action
- 'help-echo "mouse-2, RET: Reveal test result")
-
-(define-button-type 'ert--test-name-button
- 'action #'ert--test-name-button-action
- 'help-echo "mouse-2, RET: Find test definition")
-
-(define-button-type 'ert--results-expand-collapse-button
- 'action #'ert--results-expand-collapse-button-action
- 'help-echo "mouse-2, RET: Expand/collapse test result")
-
-(defun ert--results-test-node-or-null-at-point ()
- "If point is on a valid ewoc node, return it; return nil otherwise.
-
-To be used in the ERT results buffer."
- (let* ((ewoc ert--results-ewoc)
- (node (ewoc-locate ewoc)))
- ;; `ewoc-locate' will return an arbitrary node when point is on
- ;; header or footer, or when all nodes are invisible. So we need
- ;; to validate its return value here.
- ;;
- ;; Update: I'm seeing nil being returned in some cases now,
- ;; perhaps this has been changed?
- (if (and node
- (>= (point) (ewoc-location node))
- (not (ert--ewoc-entry-hidden-p (ewoc-data node))))
- node
- nil)))
-
-(defun ert--results-test-node-at-point ()
- "If point is on a valid ewoc node, return it; signal an error otherwise.
-
-To be used in the ERT results buffer."
- (or (ert--results-test-node-or-null-at-point)
- (error "No test at point")))
-
-(defun ert-results-next-test ()
- "Move point to the next test.
-
-To be used in the ERT results buffer."
- (interactive)
- (ert--results-move (ewoc-locate ert--results-ewoc) 'ewoc-next
- "No tests below"))
-
-(defun ert-results-previous-test ()
- "Move point to the previous test.
-
-To be used in the ERT results buffer."
- (interactive)
- (ert--results-move (ewoc-locate ert--results-ewoc) 'ewoc-prev
- "No tests above"))
-
-(defun ert--results-move (node ewoc-fn error-message)
- "Move point from NODE to the previous or next node.
-
-EWOC-FN specifies the direction and should be either `ewoc-prev'
-or `ewoc-next'. If there are no more nodes in that direction, an
-error is signalled with the message ERROR-MESSAGE."
- (loop
- (setq node (funcall ewoc-fn ert--results-ewoc node))
- (when (null node)
- (error "%s" error-message))
- (unless (ert--ewoc-entry-hidden-p (ewoc-data node))
- (goto-char (ewoc-location node))
- (return))))
-
-(defun ert--results-expand-collapse-button-action (button)
- "Expand or collapse the test node BUTTON belongs to."
- (let* ((ewoc ert--results-ewoc)
- (node (save-excursion
- (goto-char (ert--button-action-position))
- (ert--results-test-node-at-point)))
- (entry (ewoc-data node)))
- (setf (ert--ewoc-entry-expanded-p entry)
- (not (ert--ewoc-entry-expanded-p entry)))
- (ewoc-invalidate ewoc node)))
-
-(defun ert-results-find-test-at-point-other-window ()
- "Find the definition of the test at point in another window.
-
-To be used in the ERT results buffer."
- (interactive)
- (let ((name (ert-test-at-point)))
- (unless name
- (error "No test at point"))
- (ert-find-test-other-window name)))
-
-(defun ert--test-name-button-action (button)
- "Find the definition of the test BUTTON belongs to, in another window."
- (let ((name (button-get button 'ert-test-name)))
- (ert-find-test-other-window name)))
-
-(defun ert--ewoc-position (ewoc node)
- ;; checkdoc-order: nil
- "Return the position of NODE in EWOC, or nil if NODE is not in EWOC."
- (loop for i from 0
- for node-here = (ewoc-nth ewoc 0) then (ewoc-next ewoc node-here)
- do (when (eql node node-here)
- (return i))
- finally (return nil)))
-
-(defun ert-results-jump-between-summary-and-result ()
- "Jump back and forth between the test run summary and individual test results.
-
-From an ewoc node, jumps to the character that represents the
-same test in the progress bar, and vice versa.
-
-To be used in the ERT results buffer."
- ;; Maybe this command isn't actually needed much, but if it is, it
- ;; seems like an indication that the UI design is not optimal. If
- ;; jumping back and forth between a summary at the top of the buffer
- ;; and the error log in the remainder of the buffer is useful, then
- ;; the summary apparently needs to be easily accessible from the
- ;; error log, and perhaps it would be better to have it in a
- ;; separate buffer to keep it visible.
- (interactive)
- (let ((ewoc ert--results-ewoc)
- (progress-bar-begin ert--results-progress-bar-button-begin))
- (cond ((ert--results-test-node-or-null-at-point)
- (let* ((node (ert--results-test-node-at-point))
- (pos (ert--ewoc-position ewoc node)))
- (goto-char (+ progress-bar-begin pos))))
- ((and (<= progress-bar-begin (point))
- (< (point) (button-end (button-at progress-bar-begin))))
- (let* ((node (ewoc-nth ewoc (- (point) progress-bar-begin)))
- (entry (ewoc-data node)))
- (when (ert--ewoc-entry-hidden-p entry)
- (setf (ert--ewoc-entry-hidden-p entry) nil)
- (ewoc-invalidate ewoc node))
- (ewoc-goto-node ewoc node)))
- (t
- (goto-char progress-bar-begin)))))
-
-(defun ert-test-at-point ()
- "Return the name of the test at point as a symbol, or nil if none."
- (or (and (eql major-mode 'ert-results-mode)
- (let ((test (ert--results-test-at-point-no-redefinition)))
- (and test (ert-test-name test))))
- (let* ((thing (thing-at-point 'symbol))
- (sym (intern-soft thing)))
- (and (ert-test-boundp sym)
- sym))))
-
-(defun ert--results-test-at-point-no-redefinition ()
- "Return the test at point, or nil.
-
-To be used in the ERT results buffer."
- (assert (eql major-mode 'ert-results-mode))
- (if (ert--results-test-node-or-null-at-point)
- (let* ((node (ert--results-test-node-at-point))
- (test (ert--ewoc-entry-test (ewoc-data node))))
- test)
- (let ((progress-bar-begin ert--results-progress-bar-button-begin))
- (when (and (<= progress-bar-begin (point))
- (< (point) (button-end (button-at progress-bar-begin))))
- (let* ((test-index (- (point) progress-bar-begin))
- (test (aref (ert--stats-tests ert--results-stats)
- test-index)))
- test)))))
-
-(defun ert--results-test-at-point-allow-redefinition ()
- "Look up the test at point, and check whether it has been redefined.
-
-To be used in the ERT results buffer.
-
-Returns a list of two elements: the test (or nil) and a symbol
-specifying whether the test has been redefined.
-
-If a new test has been defined with the same name as the test at
-point, replaces the test at point with the new test, and returns
-the new test and the symbol `redefined'.
-
-If the test has been deleted, returns the old test and the symbol
-`deleted'.
-
-If the test is still current, returns the test and the symbol nil.
-
-If there is no test at point, returns a list with two nils."
- (let ((test (ert--results-test-at-point-no-redefinition)))
- (cond ((null test)
- `(nil nil))
- ((null (ert-test-name test))
- `(,test nil))
- (t
- (let* ((name (ert-test-name test))
- (new-test (and (ert-test-boundp name)
- (ert-get-test name))))
- (cond ((eql test new-test)
- `(,test nil))
- ((null new-test)
- `(,test deleted))
- (t
- (ert--results-update-after-test-redefinition
- (ert--stats-test-pos ert--results-stats test)
- new-test)
- `(,new-test redefined))))))))
-
-(defun ert--results-update-after-test-redefinition (pos new-test)
- "Update results buffer after the test at pos POS has been redefined.
-
-Also updates the stats object. NEW-TEST is the new test
-definition."
- (let* ((stats ert--results-stats)
- (ewoc ert--results-ewoc)
- (node (ewoc-nth ewoc pos))
- (entry (ewoc-data node)))
- (ert--stats-set-test-and-result stats pos new-test nil)
- (setf (ert--ewoc-entry-test entry) new-test
- (aref ert--results-progress-bar-string pos) (ert-char-for-test-result
- nil t))
- (ewoc-invalidate ewoc node))
- nil)
-
-(defun ert--button-action-position ()
- "The buffer position where the last button action was triggered."
- (cond ((integerp last-command-event)
- (point))
- ((eventp last-command-event)
- (posn-point (event-start last-command-event)))
- (t (assert nil))))
-
-(defun ert--results-progress-bar-button-action (button)
- "Jump to details for the test represented by the character clicked in BUTTON."
- (goto-char (ert--button-action-position))
- (ert-results-jump-between-summary-and-result))
-
-(defun ert-results-rerun-all-tests ()
- "Re-run all tests, using the same selector.
-
-To be used in the ERT results buffer."
- (interactive)
- (assert (eql major-mode 'ert-results-mode))
- (let ((selector (ert--stats-selector ert--results-stats)))
- (ert-run-tests-interactively selector (buffer-name))))
-
-(defun ert-results-rerun-test-at-point ()
- "Re-run the test at point.
-
-To be used in the ERT results buffer."
- (interactive)
- (destructuring-bind (test redefinition-state)
- (ert--results-test-at-point-allow-redefinition)
- (when (null test)
- (error "No test at point"))
- (let* ((stats ert--results-stats)
- (progress-message (format "Running %stest %S"
- (ecase redefinition-state
- ((nil) "")
- (redefined "new definition of ")
- (deleted "deleted "))
- (ert-test-name test))))
- ;; Need to save and restore point manually here: When point is on
- ;; the first visible ewoc entry while the header is updated, point
- ;; moves to the top of the buffer. This is undesirable, and a
- ;; simple `save-excursion' doesn't prevent it.
- (let ((point (point)))
- (unwind-protect
- (unwind-protect
- (progn
- (message "%s..." progress-message)
- (ert-run-or-rerun-test stats test
- ert--results-listener))
- (ert--results-update-stats-display ert--results-ewoc stats)
- (message "%s...%s"
- progress-message
- (let ((result (ert-test-most-recent-result test)))
- (ert-string-for-test-result
- result (ert-test-result-expected-p test result)))))
- (goto-char point))))))
-
-(defun ert-results-rerun-test-at-point-debugging-errors ()
- "Re-run the test at point with `ert-debug-on-error' bound to t.
-
-To be used in the ERT results buffer."
- (interactive)
- (let ((ert-debug-on-error t))
- (ert-results-rerun-test-at-point)))
-
-(defun ert-results-pop-to-backtrace-for-test-at-point ()
- "Display the backtrace for the test at point.
-
-To be used in the ERT results buffer."
- (interactive)
- (let* ((test (ert--results-test-at-point-no-redefinition))
- (stats ert--results-stats)
- (pos (ert--stats-test-pos stats test))
- (result (aref (ert--stats-test-results stats) pos)))
- (etypecase result
- (ert-test-passed (error "Test passed, no backtrace available"))
- (ert-test-result-with-condition
- (let ((backtrace (ert-test-result-with-condition-backtrace result))
- (buffer (get-buffer-create "*ERT Backtrace*")))
- (pop-to-buffer buffer)
- (let ((inhibit-read-only t))
- (buffer-disable-undo)
- (erase-buffer)
- (ert-simple-view-mode)
- ;; Use unibyte because `debugger-setup-buffer' also does so.
- (set-buffer-multibyte nil)
- (setq truncate-lines t)
- (ert--print-backtrace backtrace)
- (debugger-make-xrefs)
- (goto-char (point-min))
- (insert "Backtrace for test `")
- (ert-insert-test-name-button (ert-test-name test))
- (insert "':\n")))))))
-
-(defun ert-results-pop-to-messages-for-test-at-point ()
- "Display the part of the *Messages* buffer generated during the test at point.
-
-To be used in the ERT results buffer."
- (interactive)
- (let* ((test (ert--results-test-at-point-no-redefinition))
- (stats ert--results-stats)
- (pos (ert--stats-test-pos stats test))
- (result (aref (ert--stats-test-results stats) pos)))
- (let ((buffer (get-buffer-create "*ERT Messages*")))
- (pop-to-buffer buffer)
- (let ((inhibit-read-only t))
- (buffer-disable-undo)
- (erase-buffer)
- (ert-simple-view-mode)
- (insert (ert-test-result-messages result))
- (goto-char (point-min))
- (insert "Messages for test `")
- (ert-insert-test-name-button (ert-test-name test))
- (insert "':\n")))))
-
-(defun ert-results-pop-to-should-forms-for-test-at-point ()
- "Display the list of `should' forms executed during the test at point.
-
-To be used in the ERT results buffer."
- (interactive)
- (let* ((test (ert--results-test-at-point-no-redefinition))
- (stats ert--results-stats)
- (pos (ert--stats-test-pos stats test))
- (result (aref (ert--stats-test-results stats) pos)))
- (let ((buffer (get-buffer-create "*ERT list of should forms*")))
- (pop-to-buffer buffer)
- (let ((inhibit-read-only t))
- (buffer-disable-undo)
- (erase-buffer)
- (ert-simple-view-mode)
- (if (null (ert-test-result-should-forms result))
- (insert "\n(No should forms during this test.)\n")
- (loop for form-description in (ert-test-result-should-forms result)
- for i from 1 do
- (insert "\n")
- (insert (format "%s: " i))
- (let ((begin (point)))
- (ert--pp-with-indentation-and-newline form-description)
- (ert--make-xrefs-region begin (point)))))
- (goto-char (point-min))
- (insert "`should' forms executed during test `")
- (ert-insert-test-name-button (ert-test-name test))
- (insert "':\n")
- (insert "\n")
- (insert (concat "(Values are shallow copies and may have "
- "looked different during the test if they\n"
- "have been modified destructively.)\n"))
- (forward-line 1)))))
-
-(defun ert-results-toggle-printer-limits-for-test-at-point ()
- "Toggle how much of the condition to print for the test at point.
-
-To be used in the ERT results buffer."
- (interactive)
- (let* ((ewoc ert--results-ewoc)
- (node (ert--results-test-node-at-point))
- (entry (ewoc-data node)))
- (setf (ert--ewoc-entry-extended-printer-limits-p entry)
- (not (ert--ewoc-entry-extended-printer-limits-p entry)))
- (ewoc-invalidate ewoc node)))
-
-(defun ert-results-pop-to-timings ()
- "Display test timings for the last run.
-
-To be used in the ERT results buffer."
- (interactive)
- (let* ((stats ert--results-stats)
- (start-times (ert--stats-test-start-times stats))
- (end-times (ert--stats-test-end-times stats))
- (buffer (get-buffer-create "*ERT timings*"))
- (data (loop for test across (ert--stats-tests stats)
- for start-time across (ert--stats-test-start-times stats)
- for end-time across (ert--stats-test-end-times stats)
- collect (list test
- (float-time (subtract-time end-time
- start-time))))))
- (setq data (sort data (lambda (a b)
- (> (second a) (second b)))))
- (pop-to-buffer buffer)
- (let ((inhibit-read-only t))
- (buffer-disable-undo)
- (erase-buffer)
- (ert-simple-view-mode)
- (if (null data)
- (insert "(No data)\n")
- (insert (format "%-3s %8s %8s\n" "" "time" "cumul"))
- (loop for (test time) in data
- for cumul-time = time then (+ cumul-time time)
- for i from 1 do
- (let ((begin (point)))
- (insert (format "%3s: %8.3f %8.3f " i time cumul-time))
- (ert-insert-test-name-button (ert-test-name test))
- (insert "\n"))))
- (goto-char (point-min))
- (insert "Tests by run time (seconds):\n\n")
- (forward-line 1))))
-
-;;;###autoload
-(defun ert-describe-test (test-or-test-name)
- "Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test)."
- (interactive (list (ert-read-test-name-at-point "Describe test")))
- (when (< emacs-major-version 24)
- (error "Requires Emacs 24"))
- (let (test-name
- test-definition)
- (etypecase test-or-test-name
- (symbol (setq test-name test-or-test-name
- test-definition (ert-get-test test-or-test-name)))
- (ert-test (setq test-name (ert-test-name test-or-test-name)
- test-definition test-or-test-name)))
- (help-setup-xref (list #'ert-describe-test test-or-test-name)
- (called-interactively-p 'interactive))
- (save-excursion
- (with-help-window (help-buffer)
- (with-current-buffer (help-buffer)
- (insert (if test-name (format "%S" test-name) "<anonymous test>"))
- (insert " is a test")
- (let ((file-name (and test-name
- (symbol-file test-name 'ert-deftest))))
- (when file-name
- (insert " defined in `" (file-name-nondirectory file-name) "'")
- (save-excursion
- (re-search-backward "`\\([^`']+\\)'" nil t)
- (help-xref-button 1 'help-function-def test-name file-name)))
- (insert ".")
- (fill-region-as-paragraph (point-min) (point))
- (insert "\n\n")
- (unless (and (ert-test-boundp test-name)
- (eql (ert-get-test test-name) test-definition))
- (let ((begin (point)))
- (insert "Note: This test has been redefined or deleted, "
- "this documentation refers to an old definition.")
- (fill-region-as-paragraph begin (point)))
- (insert "\n\n"))
- (insert (or (ert-test-documentation test-definition)
- "It is not documented.")
- "\n")))))))
-
-(defun ert-results-describe-test-at-point ()
- "Display the documentation of the test at point.
-
-To be used in the ERT results buffer."
- (interactive)
- (ert-describe-test (ert--results-test-at-point-no-redefinition)))
-
-
-;;; Actions on load/unload.
-
-(add-to-list 'find-function-regexp-alist '(ert-deftest . ert--find-test-regexp))
-(add-to-list 'minor-mode-alist '(ert--current-run-stats
- (:eval
- (ert--tests-running-mode-line-indicator))))
-(add-to-list 'emacs-lisp-mode-hook 'ert--activate-font-lock-keywords)
-
-(defun ert--unload-function ()
- "Unload function to undo the side-effects of loading ert.el."
- (ert--remove-from-list 'find-function-regexp-alist 'ert-deftest :key #'car)
- (ert--remove-from-list 'minor-mode-alist 'ert--current-run-stats :key #'car)
- (ert--remove-from-list 'emacs-lisp-mode-hook
- 'ert--activate-font-lock-keywords)
- nil)
-
-(defvar ert-unload-hook '())
-(add-hook 'ert-unload-hook 'ert--unload-function)
-
-
-(provide 'ert)
-
-;;; ert.el ends here
diff --git a/lib/goto-chg.el b/lib/goto-chg.el
index 3881706..cf5369e 100644
--- a/lib/goto-chg.el
+++ b/lib/goto-chg.el
@@ -1,7 +1,7 @@
;;; goto-chg.el --- goto last change
;;--------------------------------------------------------------------
;;
-;; Copyright (C) 2002-2008, David Andersson
+;; Copyright (C) 2002-2008,2013 David Andersson
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
@@ -21,8 +21,10 @@
;;-------------------------------------------------------------------
;;
;; Author: David Andersson <l.david.andersson(at)sverige.nu>
+;; Maintainer: Vasilij Schneidermann <v.schneidermann@gmail.com>
;; Created: 16 May 2002
-;; Version: 1.4
+;; Version: 1.7
+;; Keywords: convenience, matching
;;
;;; Commentary:
;;
@@ -41,12 +43,19 @@
;; (global-set-key [(control ?.)] 'goto-last-change)
;; (global-set-key [(control ?,)] 'goto-last-change-reverse)
;;
-;; Works with emacs-19.29, 19.31, 20.3, 20.7, 21.1, 21.4 and 22.1.
+;; Works with emacs-19.29, 19.31, 20.3, 20.7, 21.1, 21.4, 22.1 and 23.1
;; Works with XEmacs-20.4 and 21.4 (but see todo about `last-command' below)
;;
;;--------------------------------------------------------------------
;; History
;;
+;; Ver 1.7 2017-09-17 Vasilij Schneidermann
+;; Make it work with undo-tree-mode (see
+;; <https://github.com/martinp26/goto-chg>)
+;; Ver 1.6 2013-12-12 David Andersson
+;; Add keywords; Cleanup comments
+;; Ver 1.5 2013-12-11 David Andersson
+;; Autoload and document `goto-last-change-reverse'
;; Ver 1.4 2008-09-20 David Andersson
;; Improved property change description; Update comments.
;; Ver 1.3 2007-03-14 David Andersson
@@ -64,15 +73,12 @@
;;todo: Rename "goto-chg.el" -> "gotochange.el" or "goto-chgs" ?
;;todo: Rename function goto-last-change -> goto-last-edit ?
;;todo: Rename adjective "-last-" -> "-latest-" or "-most-recent-" ?
-;;todo: There are some, maybe useful, funcs for region undo
+;;todo: There are some, maybe useful, funcs for region undo
;; in simple.el in emacs 20. Take a look.
;;todo: Add functionality to visit changed point in text order, not only in
;; chronological order. (Naa, highlight-changes-mode does that).
;;todo: Inverse indication that a change has been saved or not
;;todo: Highlight the range of text involved in the last change?
-;;todo: Function that goes in reverse direction. Either a function
-;; 'goto-next-change' only callable after 'goto-last-change'
-;; or enter a minor mode similar to isearch.
;;todo: See session-jump-to-last-change in session.el?
;;todo: Unhide invisible text (e.g. outline mode) like isearch do.
;;todo: XEmacs sets last-command to `t' after an error, so you cannot reverse
@@ -98,21 +104,24 @@ Optional third argument is the replacement, which defaults to \"...\"."
str
;; else
(let* ((lipsis (or ellipsis "..."))
- (i (/ (- maxlen (length lipsis)) 2)))
+ (i (/ (- maxlen (length lipsis)) 2)))
(concat (substring str 0 i)
- lipsis
- (substring str (- i))))))
+ lipsis
+ (substring str (- i))))))
(defun glc-adjust-pos2 (pos p1 p2 adj)
;; Helper function to glc-adjust-pos
+ ;; p1, p2: interval where an edit occured
+ ;; adj: amount of text added (positive) or removed (negativ) by the edit
+ ;; Return pos if well before p1, or pos+adj if well after p2, or nil if too close
(cond ((<= pos (- p1 glc-current-span))
- pos)
- ((> pos (+ p2 glc-current-span))
- (+ pos adj))
- ((zerop glc-current-span)
- p1)
- (t
- nil)))
+ pos)
+ ((> pos (+ p2 glc-current-span))
+ (+ pos adj))
+ ((zerop glc-current-span)
+ p1)
+ (t
+ nil)))
(defun glc-adjust-pos (pos e)
"Given POS, a buffer position before the edit E, compute and return
@@ -121,25 +130,16 @@ Exception: return nil if POS is closer than `glc-current-span' to the edit E.
\nInsertion edits before POS returns a larger value.
Deletion edits before POS returns a smaller value.
\nThe edit E is an entry from the `buffer-undo-list'. See for details."
- (cond ((atom e) ; nil==cmd boundary, or, num==changed pos
- pos)
- ((numberp (car e)) ; (beg . end)==insertion
- (glc-adjust-pos2 pos (car e) (car e) (- (cdr e) (car e))))
-;; (cond ((< pos (- (car e) glc-current-span)) pos)
-;; ((> pos (+ (car e) glc-current-span)) (+ pos (- (cdr e) (car e))))
-;; (t nil)))
- ((stringp (car e)) ; (string . pos)==deletion
- (glc-adjust-pos2 pos (abs (cdr e)) (+ (abs (cdr e)) (length (car e))) (- (length (car e)))))
-;; (cond ((< pos (- (abs (cdr e)) glc-current-span)) pos)
-;; ((> pos (+ (abs (cdr e)) (length (car e)) glc-current-span)) (- pos (length (car e))))
-;; (t nil)))
- ((null (car e)) ; (nil prop val beg . end)==prop change
- (glc-adjust-pos2 pos (nth 3 e) (nthcdr 4 e) 0))
-;; (cond ((< pos (- (nth 3 e) glc-current-span)) pos)
-;; ((> pos (+ (nthcdr 4 e) glc-current-span)) pos)
-;; (t nil)))
- (t ; (marker . dist)==marker moved
- pos)))
+ (cond ((atom e) ; nil==cmd boundary, or, num==changed pos
+ pos)
+ ((numberp (car e)) ; (beg . end)==insertion
+ (glc-adjust-pos2 pos (car e) (car e) (- (cdr e) (car e))))
+ ((stringp (car e)) ; (string . pos)==deletion
+ (glc-adjust-pos2 pos (abs (cdr e)) (+ (abs (cdr e)) (length (car e))) (- (length (car e)))))
+ ((null (car e)) ; (nil prop val beg . end)==prop change
+ (glc-adjust-pos2 pos (nth 3 e) (nthcdr 4 e) 0))
+ (t ; (marker . dist)==marker moved
+ pos)))
;; If recursive in stead of iterative (while), it tends to fill the call stack.
;; (Isn't it tail optimized?)
@@ -152,52 +152,52 @@ or nil if the point was closer than `glc-current-span' to some edit in R.
(if r
;; Get pos
(let ((pos (glc-get-pos (car r))))
- (setq r (cdr r))
- ;; Walk back in reverse list
- (while (and r pos)
- (setq pos (glc-adjust-pos pos (car r))
- r (cdr r)))
- pos)
+ (setq r (cdr r))
+ ;; Walk back in reverse list
+ (while (and r pos)
+ (setq pos (glc-adjust-pos pos (car r))
+ r (cdr r)))
+ pos)
;; else
nil))
(defun glc-get-pos (e)
"If E represents an edit, return a position value in E, the position
where the edit took place. Return nil if E represents no real change.
-\nE is a entry in the buffer-undo-list."
- (cond ((numberp e) e) ; num==changed position
- ((atom e) nil) ; nil==command boundary
- ((numberp (car e)) (cdr e)) ; (beg . end)==insertion
- ((stringp (car e)) (abs (cdr e))) ; (string . pos)==deletion
- ((null (car e)) (nthcdr 4 e)) ; (nil ...)==text property change
- ((atom (car e)) nil) ; (t ...)==file modification time
- (t nil))) ; (marker ...)==marker moved
+\nE is an entry in the buffer-undo-list."
+ (cond ((numberp e) e) ; num==changed position
+ ((atom e) nil) ; nil==command boundary
+ ((numberp (car e)) (cdr e)) ; (beg . end)==insertion
+ ((stringp (car e)) (abs (cdr e))) ; (string . pos)==deletion
+ ((null (car e)) (nthcdr 4 e)) ; (nil ...)==text property change
+ ((atom (car e)) nil) ; (t ...)==file modification time
+ (t nil))) ; (marker ...)==marker moved
(defun glc-get-descript (e &optional n)
"If E represents an edit, return a short string describing E.
Return nil if E represents no real change.
-\nE is a entry in the buffer-undo-list."
+\nE is an entry in the buffer-undo-list."
(let ((nn (or (format "T-%d: " n) "")))
- (cond ((numberp e) "New position") ; num==changed position
- ((atom e) nil) ; nil==command boundary
- ((numberp (car e)) ; (beg . end)==insertion
- (if (and n (< n 2))
- (format "%sInserted %d chars \"%s\"" nn (- (cdr e) (car e))
- (glc-center-ellipsis (buffer-substring (car e) (cdr e)) 60))
- ;; else
- ;; An older insert. The inserted text cannot easily be computed.
- ;; Just show the char count.
- (format "%sInserted %d chars" nn (- (cdr e) (car e)))))
- ((stringp (car e)) ; (string . pos)==deletion
- (format "%sDeleted \"%s\"" nn (glc-center-ellipsis (car e) 60)))
- ((null (car e)) ; (nil ...)==text property change
- (format "%sProperty change" nn))
- ((atom (car e)) nil) ; (t ...)==file modification time
- (t nil)))) ; (marker ...)==marker moved
+ (cond ((numberp e) "New position") ; num==changed position
+ ((atom e) nil) ; nil==command boundary
+ ((numberp (car e)) ; (beg . end)==insertion
+ (if (and n (< n 2))
+ (format "%sInserted %d chars \"%s\"" nn (- (cdr e) (car e))
+ (glc-center-ellipsis (buffer-substring (car e) (cdr e)) 60))
+ ;; else
+ ;; An older insert. The inserted text cannot easily be computed.
+ ;; Just show the char count.
+ (format "%sInserted %d chars" nn (- (cdr e) (car e)))))
+ ((stringp (car e)) ; (string . pos)==deletion
+ (format "%sDeleted \"%s\"" nn (glc-center-ellipsis (car e) 60)))
+ ((null (car e)) ; (nil ...)==text property change
+ (format "%sProperty change" nn))
+ ((atom (car e)) nil) ; (t ...)==file modification time
+ (t nil)))) ; (marker ...)==marker moved
(defun glc-is-positionable (e)
"Return non-nil if E is an insertion, deletion or text property change.
-\nE is a entry in the buffer-undo-list."
+\nE is an entry in the buffer-undo-list."
(and (not (numberp e)) (glc-get-pos e)))
(defun glc-is-filetime (e)
@@ -209,8 +209,8 @@ that is, it was previously saved or unchanged. Nil otherwise."
(defun goto-last-change (arg)
"Go to the point where the last edit was made in the current buffer.
Repeat the command to go to the second last edit, etc.
-A preceding \\[universal-argument] - (minus) will reverse direction for the next command in
-the sequence, to go back to a more recent edit.
+\nTo go back to more recent edit, the reverse of this command, use \\[goto-last-change-reverse]
+or precede this command with \\[universal-argument] - (minus).
\nIt does not go to the same point twice even if there has been many edits
there. I call the minimal distance between distinguishable edits \"span\".
Set variable `glc-default-span' to control how close is \"the same point\".
@@ -228,86 +228,117 @@ At times, when undo information becomes too large, the oldest information is
discarded. See variable `undo-limit'."
(interactive "P")
(cond ((not (eq this-command last-command))
- ;; Start a glc sequence
- ;; Don't go to current point if last command was an obvious edit
- ;; (yank or self-insert, but not kill-region). Makes it easier to
- ;; jump back and forth when copying seleced lines.
- (setq glc-probe-depth (if (memq last-command '(yank self-insert-command)) 1 0)
- glc-direction 1
- glc-current-span glc-default-span)
- (if (< (prefix-numeric-value arg) 0)
- (error "Negative arg: Cannot reverse as the first operation"))))
+ ;; Start a glc sequence
+ ;; Don't go to current point if last command was an obvious edit
+ ;; (yank or self-insert, but not kill-region). Makes it easier to
+ ;; jump back and forth when copying seleced lines.
+ (setq glc-probe-depth (if (memq last-command '(yank self-insert-command)) 1 0)
+ glc-direction 1
+ glc-current-span glc-default-span)
+ (if (< (prefix-numeric-value arg) 0)
+ (error "Negative arg: Cannot reverse as the first operation"))))
(cond ((null buffer-undo-list)
- (error "Buffer has not been changed"))
- ((eq buffer-undo-list t)
- (error "No change info (undo is disabled)")))
- (cond ((numberp arg) ; Numeric arg sets span
- (setq glc-current-span (abs arg)))
- ((consp arg) ; C-u's multiply previous span by 4
- (setq glc-current-span (* (abs (car arg)) glc-default-span))
- (message "Current span is %d chars" glc-current-span))) ;todo: keep message with "waiting" and "is saved"
+ (error "Buffer has not been changed"))
+ ((eq buffer-undo-list t)
+ (error "No change info (undo is disabled)")))
+ (cond ((numberp arg) ; Numeric arg sets span
+ (setq glc-current-span (abs arg)))
+ ((consp arg) ; C-u's multiply previous span by 4
+ (setq glc-current-span (* (abs (car arg)) glc-default-span))
+ (message "Current span is %d chars" glc-current-span))) ;todo: keep message with "waiting" and "is saved"
(cond ((< (prefix-numeric-value arg) 0)
- (setq glc-direction -1))
- (t
- (setq glc-direction 1)))
- (let (rev ; Reversed (and filtered) undo list
- pos ; The pos we look for, nil until found
- (n 0) ; Steps in undo list (length of 'rev')
- (l buffer-undo-list)
- (passed-save-entry (not (buffer-modified-p)))
- (new-probe-depth glc-probe-depth))
+ (setq glc-direction -1))
+ (t
+ (setq glc-direction 1)))
+ (let (rev ; Reversed (and filtered) undo list
+ pos ; The pos we look for, nil until found
+ (n 0) ; Steps in undo list (length of 'rev')
+ (l buffer-undo-list)
+ (passed-save-entry (not (buffer-modified-p)))
+ (new-probe-depth glc-probe-depth)
+ (undo-tree-p (bound-and-true-p undo-tree-mode))
+ glc-seen-canary)
;; Walk back and forth in the buffer-undo-list, each time one step deeper,
;; until we can walk back the whole list with a 'pos' that is not coming
;; too close to another edit.
(while (null pos)
(setq new-probe-depth (+ new-probe-depth glc-direction))
(if (< glc-direction 0)
- (setq rev ()
- n 0
- l buffer-undo-list
- passed-save-entry (not (buffer-modified-p))))
+ (setq rev ()
+ n 0
+ l buffer-undo-list
+ passed-save-entry (not (buffer-modified-p))))
(if (< new-probe-depth 1)
- (error "No later change info"))
+ (error "No later change info"))
(if (> n 150)
- (message "working..."))
+ (message "working..."))
;; Walk forward in buffer-undo-list, glc-probe-depth steps.
;; Build reverse list along the way
- (while (< n new-probe-depth)
- (cond ((null l)
- ;(setq this-command t) ; Disrupt repeat sequence
- (error "No further change info"))
- ((glc-is-positionable (car l))
- (setq n (1+ n)
- rev (cons (car l) rev)))
- ((or passed-save-entry (glc-is-filetime (car l)))
- (setq passed-save-entry t)))
- (setq l (cdr l)))
+ (if (not undo-tree-p)
+ (while (< n new-probe-depth)
+ (cond ((null l)
+ ;(setq this-command t) ; Disrupt repeat sequence
+ (error "No further change info"))
+ ((glc-is-positionable (car l))
+ (setq n (1+ n)
+ rev (cons (car l) rev)))
+ ((or passed-save-entry (glc-is-filetime (car l)))
+ (setq passed-save-entry t)))
+ (setq l (cdr l)))
+ (when (not glc-seen-canary)
+ (while (and (not (null l)) (not glc-seen-canary) (< n new-probe-depth))
+ (cond ((eq 'undo-tree-canary (car l)) ; used by buffer-undo-tree
+ (message "Canary found...")
+ (setq l (undo-tree-current buffer-undo-tree)
+ glc-seen-canary t))
+ ((glc-is-positionable (car l))
+ (setq n (1+ n)
+ rev (cons (car l) rev)))
+ ((or passed-save-entry (glc-is-filetime (car l)))
+ (setq passed-save-entry t)))
+ (when (not glc-seen-canary)
+ (setq l (cdr l)))))
+ (when glc-seen-canary
+ (while (< n new-probe-depth)
+ (cond ((null l)
+ ;(setq this-command t) ; Disrupt repeat sequence
+ (error "No further change info"))
+ ((glc-is-positionable (car (undo-tree-node-undo l)))
+ (setq n (1+ n)
+ rev (cons (car (undo-tree-node-undo l)) rev)))
+ ((or passed-save-entry (glc-is-filetime (car (undo-tree-node-undo l))))
+ (setq passed-save-entry t)))
+ (setq l (undo-tree-node-previous l))))
+ (when (null l)
+ (error "No further change info")))
;; Walk back in reverse list, from older to newer edits.
;; Adjusting pos along the way.
(setq pos (glc-adjust-list rev)))
;; Found a place not previously visited, in 'pos'.
;; (An error have been issued if nothing (more) found.)
(if (> n 150)
- (message nil)) ; remove message "working..."
+ (message nil)) ; remove message "working..."
(if (and (= glc-current-span 0) (glc-get-descript (car rev) n))
- (message "%s" (glc-get-descript (car rev) n))
+ (message "%s" (glc-get-descript (car rev) n))
;; else
(if passed-save-entry
- (message "(This change is saved)")))
+ (message "(This change is saved)")))
(setq glc-probe-depth new-probe-depth)
(goto-char pos)))
-;; ;;;###autoload
+;;;###autoload
(defun goto-last-change-reverse (arg)
+ "Go back to more recent changes after \\[goto-last-change] have been used.
+See `goto-last-change' for use of prefix argument."
(interactive "P")
;; Negate arg, all kinds
(cond ((eq arg nil) (setq arg '-))
- ((eq arg '-) (setq arg nil))
- ((listp arg) (setq arg (list (- (car arg)))))
- (t (setq arg (- arg))))
+ ((eq arg '-) (setq arg nil))
+ ((listp arg) (setq arg (list (- (car arg)))))
+ (t (setq arg (- arg))))
;; Make 'goto-last-change-reverse' look like 'goto-last-change'
(cond ((eq last-command this-command)
- (setq last-command 'goto-last-change)))
+ (setq last-command 'goto-last-change)))
(setq this-command 'goto-last-change)
;; Call 'goto-last-change' to do the job
(goto-last-change arg))
diff --git a/lib/undo-tree.el b/lib/undo-tree.el
index 3e3f9b6..3e45b84 100644
--- a/lib/undo-tree.el
+++ b/lib/undo-tree.el
@@ -1,9 +1,9 @@
;;; undo-tree.el --- Treat undo history as a tree -*- lexical-binding: t; -*-
-;; Copyright (C) 2009-2012 Free Software Foundation, Inc
+;; Copyright (C) 2009-2013 Free Software Foundation, Inc
;; Author: Toby Cubitt <toby-undo-tree@dr-qubit.org>
-;; Version: 0.6.3
+;; Version: 0.6.5
;; Keywords: convenience, files, undo, redo, history, tree
;; URL: http://www.dr-qubit.org/emacs.php
;; Repository: http://www.dr-qubit.org/git/undo-tree.git
@@ -208,9 +208,7 @@
;;
;; Persistent undo history:
;;
-;; Note: Requires a recent development version of Emacs checked out out from
-;; the Emacs bzr repository. All stable versions of Emacs currently
-;; break this feature.
+;; Note: Requires Emacs version 24.3 or higher.
;;
;; `undo-tree-auto-save-history' (variable)
;; automatically save and restore undo-tree history along with buffer
@@ -885,9 +883,11 @@ when a buffer is saved to file.
It will automatically load undo history when a buffer is loaded
from file, if an undo save file exists.
-Undo-tree history is saved to a file called
-\".<buffer-file-name>.~undo-tree\" in the same directory as the
-file itself.
+By default, undo-tree history is saved to a file called
+\".<buffer-file-name>.~undo-tree~\" in the same directory as the
+file itself. To save under a different directory, customize
+`undo-tree-history-directory-alist' (see the documentation for
+that variable for details).
WARNING! `undo-tree-auto-save-history' will not work properly in
Emacs versions prior to 24.3, so it cannot be enabled via
@@ -1203,6 +1203,42 @@ in visualizer."
(setq undo-tree-visualizer-selection-mode-map map)))
+(defvar undo-tree-old-undo-menu-item nil)
+
+(defun undo-tree-update-menu-bar ()
+ "Update `undo-tree-mode' Edit menu items."
+ (if undo-tree-mode
+ (progn
+ ;; save old undo menu item, and install undo/redo menu items
+ (setq undo-tree-old-undo-menu-item
+ (cdr (assq 'undo (lookup-key global-map [menu-bar edit]))))
+ (define-key (lookup-key global-map [menu-bar edit])
+ [undo] '(menu-item "Undo" undo-tree-undo
+ :enable (and undo-tree-mode
+ (not buffer-read-only)
+ (not (eq t buffer-undo-list))
+ (undo-tree-node-previous
+ (undo-tree-current buffer-undo-tree)))
+ :help "Undo last operation"))
+ (define-key-after (lookup-key global-map [menu-bar edit])
+ [redo] '(menu-item "Redo" undo-tree-redo
+ :enable (and undo-tree-mode
+ (not buffer-read-only)
+ (not (eq t buffer-undo-list))
+ (undo-tree-node-next
+ (undo-tree-current buffer-undo-tree)))
+ :help "Redo last operation")
+ 'undo))
+ ;; uninstall undo/redo menu items
+ (define-key (lookup-key global-map [menu-bar edit])
+ [undo] undo-tree-old-undo-menu-item)
+ (define-key (lookup-key global-map [menu-bar edit])
+ [redo] nil)))
+
+(add-hook 'menu-bar-update-hook 'undo-tree-update-menu-bar)
+
+
+
;;; =====================================================================
@@ -2594,7 +2630,7 @@ Within the undo-tree visualizer, the following keys are available:
;; if disabling `undo-tree-mode', rebuild `buffer-undo-list' from tree so
;; Emacs undo can work
- (if (not undo-tree-mode)
+ (when (not undo-tree-mode)
(undo-list-rebuild-from-tree)
(setq buffer-undo-tree nil)))
@@ -2986,16 +3022,16 @@ Argument is a character, naming the register."
(defun undo-tree-make-history-save-file-name (file)
"Create the undo history file name for FILE.
-Normally this is the file's name with `.' prepended and
-`~undo-tree~' appended.
+Normally this is the file's name with \".\" prepended and
+\".~undo-tree~\" appended.
-A match for FILE is sought in `undo-tree-history-directory-alist';
-see the documentation of that variable. If the directory for the
-backup doesn't exist, it is created."
+A match for FILE is sought in `undo-tree-history-directory-alist'
+\(see the documentation of that variable for details\). If the
+directory for the backup doesn't exist, it is created."
(let* ((backup-directory-alist undo-tree-history-directory-alist)
(name (make-backup-file-name-1 file)))
(concat (file-name-directory name) "." (file-name-nondirectory name)
- "~undo-tree~")))
+ ".~undo-tree~")))
(defun undo-tree-save-history (&optional filename overwrite)
@@ -3184,6 +3220,8 @@ signaling an error if file is not found."
(undo-tree-current undo-tree)
(undo-tree-root undo-tree))))
(erase-buffer)
+ (setq undo-tree-visualizer-needs-extending-down nil
+ undo-tree-visualizer-needs-extending-up nil)
(undo-tree-clear-visualizer-data undo-tree)
(undo-tree-compute-widths node)
;; lazy drawing starts vertically centred and displaced horizontally to
@@ -4304,6 +4342,75 @@ specifies `saved', and a negative prefix argument specifies
(balance-windows)
(shrink-window-if-larger-than-buffer win))))
+;;;; ChangeLog:
+
+;; 2013-12-28 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; * undo-tree: Update to version 0.6.5.
+;;
+;; 2012-12-05 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; Update undo-tree to version 0.6.3
+;;
+;; * undo-tree.el: Implement lazy tree drawing to significantly speed up
+;; visualization of large trees + various more minor improvements.
+;;
+;; 2012-09-25 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; Updated undo-tree package to version 0.5.5.
+;;
+;; Small bug-fix to avoid hooks triggering an error when trying to save
+;; undo history in a buffer where undo is disabled.
+;;
+;; 2012-09-11 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; Updated undo-tree package to version 0.5.4
+;;
+;; Bug-fixes and improvements to persistent history storage.
+;;
+;; 2012-07-18 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; Update undo-tree to version 0.5.3
+;;
+;; * undo-tree.el: Cope gracefully with undo boundaries being deleted
+;; (cf. bug#11774). Allow customization of directory to which undo
+;; history is
+;; saved.
+;;
+;; 2012-05-24 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; updated undo-tree package to version 0.5.2
+;;
+;; * undo-tree.el: add diff view feature in undo-tree visualizer.
+;;
+;; 2012-05-02 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; undo-tree.el: Update package to version 0.4
+;;
+;; 2012-04-20 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; undo-tree.el: Update package to version 0.3.4
+;;
+;; * undo-tree.el (undo-list-pop-changeset): fix pernicious bug causing
+;; undo history to be lost.
+;; (buffer-undo-tree): set permanent-local property.
+;; (undo-tree-enable-undo-in-region): add new customization option
+;; allowing undo-in-region to be disabled.
+;;
+;; 2012-01-26 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; undo-tree.el: Fixed copyright attribution and Emacs status.
+;;
+;; 2012-01-26 Toby S. Cubitt <tsc25@cantab.net>
+;;
+;; undo-tree.el: Update package to version 0.3.3
+;;
+;; 2011-09-17 Stefan Monnier <monnier@iro.umontreal.ca>
+;;
+;; Add undo-tree.el
+;;
+
+
(provide 'undo-tree)
diff --git a/scripts/evil-extract-docstrings b/scripts/evil-extract-docstrings
new file mode 100755
index 0000000..ebd05dc
--- /dev/null
+++ b/scripts/evil-extract-docstrings
@@ -0,0 +1,58 @@
+#!/usr/bin/emacs --script
+
+(setq cur-path (file-name-directory load-file-name))
+
+(add-to-list 'load-path (format "%s.." cur-path))
+(require 'evil)
+(require 'json)
+(require 'help)
+
+(defun keymap-funcs (map)
+ (let (funcs)
+ (dolist (elt (cdr map))
+ (when (consp elt)
+ (cond
+ ((and (cdr elt) (symbolp (cdr elt)))
+ (push (cdr elt) funcs))
+ ((keymapp (cdr elt))
+ (setq funcs (append (keymap-funcs (cdr elt)) funcs))))))
+ funcs))
+
+(defun keymap-bindings (map)
+ (let ((funcs (keymap-funcs map))
+ bindings)
+ (dolist (func funcs)
+ (unless (memq func '(undefined))
+ ;; (push (cons func (key-description (where-is-internal func map t))) bindings)
+ ;; (message (format "%s %s" func (key-description (where-is-internal func map t))))
+ (push (cons func (key-description (where-is-internal func map t))) bindings)))
+ bindings))
+
+(with-temp-file (format "%s../doc/docstringdb.json" cur-path)
+ (let (vars)
+ (mapatoms
+ (lambda (sym)
+ (when (string-prefix-p "evil-" (symbol-name sym))
+ (let ((default (car (get sym 'standard-value))))
+ (while (and (consp default) (memq (car default) '(function quote)))
+ (setq default (cadr default)))
+ (when (eq 'funcall (car-safe default))
+ (setq default (eval default)))
+ ;; (when (and (boundp sym) (keymapp (symbol-value sym)))
+ ;; (message (format "%S" sym)))
+ (push `(,sym (default . ,(cond
+ ((consp default) (format "%S" default))
+ ((symbolp default) (symbol-name default))
+ (t default)))
+ (local . ,(local-variable-if-set-p sym))
+ (default-type . ,(type-of default))
+ (var-docstring . ,(documentation-property sym 'variable-documentation 'raw))
+ (fn-docstring . ,(ignore-errors (documentation sym 'raw)))
+ (arglist . ,(help-function-arglist sym))
+ (functionp . ,(functionp sym))
+ (macrop . ,(macrop sym))
+ (keymap-inv . ,(and (boundp sym)
+ (keymapp (symbol-value sym))
+ (keymap-bindings (symbol-value sym)))))
+ vars)))))
+ (insert (json-encode vars))))
diff --git a/scripts/evilupdate b/scripts/evilupdate
index f113a6f..1723c03 100755
--- a/scripts/evilupdate
+++ b/scripts/evilupdate
@@ -48,12 +48,11 @@
(require 'f)
(require 'erc)
(require 'yaoddmuse)
-(eval-when-compile (require 'cl))
(defconst evilupdate-irc-nick "lyrobot")
(defconst evilupdate-irc-channel "#evil-mode")
(defconst evilupdate-irc-topic
- "Evil = Extensible vi layer for Emacs | Current version: VERSION | http://bitbucket.org/lyro/evil | If you don't get an answer here, please use the mailing-list implementations-list@lists.ourproject.org")
+ "Evil = Extensible vi layer for Emacs | Current version: VERSION | https://github.com/emacs-evil/evil | If you don't get an answer here, please use the mailing-list implementations-list@lists.ourproject.org")
(defconst evilupdate-wiki-page "Evil")
(defvar evilupdate-version "1.0.0")
(defvar evilupdate-done nil)