
(defvar evi-version "Evi 1.0i of 2-23-94")

(defvar evi-copyright "Copyright (c) 1992, 1993, 1994 Jeffrey R. Lewis")

(defmacro evi-defbuffervar (name default-value documentation) (byte-code "
FDDDEF" [name nil documentation default-value progn defvar make-variable-buffer-local quote set-default] 6))

(defvar evi-inhibit-startup-message nil)

(defvar evi-emacs-version (let ((version (emacs-version))) (cond ((string-match "Emacs 18\\|Epoch 4" version) (quote emacs18)) ((string-match "Emacs 19.[0-9]*.[0-9]* Lucid" version) (quote lucid19)) ((string-match "Emacs 19" version) (quote emacs19)))))

(cond ((eq evi-emacs-version (quote emacs18)) (defun evi-fill-keymap (keymap def) (fillarray keymap def)) (defun evi-keymap-bindings (map) (evi-keymap-bindings2 map "")) (defun evi-keymap-bindings2 (map prefix) (if (arrayp map) (let ((i 0) (len (length map)) (binding) (keys) (mappings nil)) (while (< i len) (setq binding (aref map i)) (if binding (progn (setq keys (concat prefix (char-to-string i))) (if (keymapp binding) (setq mappings (nconc (evi-keymap-bindings2 binding keys) mappings)) (setq mappings (cons (cons keys binding) mappings))))) (setq i (1+ i))) mappings) (let ((bindings (cdr map)) (mappings nil)) (while bindings (let* ((binding (car bindings)) (keys (concat prefix (char-to-string (car binding))))) (if (keymapp (cdr binding)) (setq mappings (nconc (evi-keymap-bindings2 (cdr binding) keys) mappings)) (setq mappings (cons (cons keys (cdr binding)) mappings)))) (setq bindings (cdr bindings))) mappings)))) ((eq evi-emacs-version (quote emacs19)) (defun evi-fill-keymap (keymap def) (fillarray (car (cdr keymap)) def)) (defun evi-keymap-bindings (map) (evi-keymap-bindings2 map "")) (defun evi-keymap-bindings2 (map prefix) (let ((bindings (cdr map)) (mappings nil)) (while bindings (if (vectorp (car bindings)) (setq mappings (nconc (evi-vector-keymap-bindings (car bindings) prefix) mappings)) (let* ((binding (car bindings)) (key (if (integerp (car binding)) (char-to-string (car binding)) (concat "<" (prin1-to-string (car binding)) ">"))) (keys (concat prefix key))) (if (keymapp (cdr binding)) (setq mappings (nconc (evi-keymap-bindings2 (cdr binding) keys) mappings)) (setq mappings (cons (cons keys (cdr binding)) mappings))))) (setq bindings (cdr bindings))) mappings)) (defun evi-vector-keymap-bindings (map prefix) (let ((i 0) (len (length map)) (binding) (keys) (mappings nil)) (while (< i len) (setq binding (aref map i)) (if binding (progn (setq keys (concat prefix (char-to-string i))) (if (keymapp binding) (setq mappings (nconc (evi-keymap-bindings2 binding keys) mappings)) (setq mappings (cons (cons keys binding) mappings))))) (setq i (1+ i))) mappings))) ((eq evi-emacs-version (quote lucid19)) (defun evi-fill-keymap (keymap def) (let ((i 128)) (while (<= 0 (setq i (1- i))) (define-key keymap (make-string 1 i) def)) keymap)) (defun evi-keymap-bindings (map) (let ((mappings nil)) (evi-keymap-bindings2 map "") mappings)) (defun evi-keymap-bindings2 (map prefix) (map-keymap (function (lambda (key def) (let* ((keys (concat prefix (single-key-description key)))) (if (keymapp def) (setq mappings (nconc (evi-keymap-bindings2 def keys) mappings)) (setq mappings (cons (cons keys def) mappings)))))) map))))

(defvar evi-initialized nil)

(defvar evi-interactive t)

(defvar evi-mode-hook nil "\
*Function or functions called upon entry to evi.")

(evi-defbuffervar evi-enabled nil "If t, currently emulating vi in this buffer.")

(defvar evi-debug nil "\
If t, errors generated by emacs are not handled.")

(defvar evi-supress-ex-startup nil "\
If t, don't source .exrc or EXINIT at startup.")

(defvar evi-report-unsupported-options nil "\
If t, give an error if a :set option is used that isn't supported.
Otherwise, these are silently ignored.")

(evi-defbuffervar evi-mode (quote vi) "Current vi mode, one of vi, insert or replace.")

(evi-defbuffervar evi-mode-string nil "String describing current evi mode.  This is displayed in the mode line.")

(defvar evi-minibuf-contents nil "\
Contents of last minibuf read.")

(evi-defbuffervar evi-in-minibuf nil "If t, we are currently editing in the minibuffer")

(defvar evi-enable-emacs-commands nil "\
If t, emacs commands will be visible")

(defvar evi-meta-prefix-char nil "\
Meta-prefix-char to use while in Evi buffers.")

(defvar evi-emacs-meta-prefix-char nil "\
Meta-prefix-char that emacs uses.")

(defvar evi-parameterized-macro nil "\
If t, currently executing a parameteized macro.")

(defvar ex-input-escapes nil "\
If t, backslash escapes in ex commands will be processed.")

(defvar evi-read-only-buffers nil "\
If t, read-only files will have read-only buffers")

(defvar evi-last-point nil "\
Used to calculate line number updates.")

(defvar evi-mark nil "\
Used to define regions for operator commands.")

(defvar evi-prev-file nil "\
Filename of previous file edited.")

(defvar evi-directory-stack nil)

(defvar evi-process-buffer nil)

(defvar evi-abbrev-list nil)

(evi-defbuffervar evi-emacs-local-map nil "Emacs' local map.  (buffer specific)")

(defvar evi-emacs-local-suppress-key-list (quote (8 9 27 127)) "\
Keys from emacs local map that are to be suppressed.")

(defvar evi-prompted nil "\
If t, the current command was prompted for.")

(evi-defbuffervar evi-replace-max nil "Maximum excursion of a replace, after which it switches to insert.")

(evi-defbuffervar evi-overstruck-char nil "Value of the character overstruck by the `$' marking a partial line change.")

(evi-defbuffervar evi-context nil "Current motion context.  One of to-end, to-next, whole-line, or nil.
The value of this variable is passed to evi-motion-command, and is set by
prefix operators like 'd' or '>' to control the type of region defined by
the following motion command.")

(defvar evi-prefix-count nil "\
Current prefix count.")

(defvar evi-last-prefix-count nil "\
Last prefix count.")

(defvar evi-prefix-count-multiplier nil "\
Current prefix count multiplier.")

(defvar evi-register-spec nil "\
Current register to use for deletes, yanks, puts, etc.")

(defvar evi-last-register-spec nil "\
Last register used for deletes, yanks, puts, etc.")

(defvar evi-digit-register 8 "\
Current delete-ring register cursor.  Points to the register that
will be register 1.")

(defvar evi-repeat-count 0 "\
The number of times the current command has been repeated via `.'.")

(defvar evi-hidden-repeat-count 0 "\
The hidden copy of evi-repeat-count, which isn't visible unless actually
repeating a command.")

(defvar evi-last-macro-register nil "\
Last register used to invoke a macro via \\[evi-register-macro].")

(defvar evi-registers (make-vector 72 nil) "\
Vi registers.  0-8 are the delete ring, 9 is the unnamed text register,
10-35 are the alphabetic text registers, and 36-71 are the mark registers.
Each text register is a cons cell with the car being the text in the register
and the cdr being a flag indicating whether or not the text is whole lines.")

(defvar evi-register-unnamed 9 "\
Symbolic name for the unnamed register.  Shouldn't change.")

(defvar evi-region-shape (quote chars) "\
Specifies the shape of the region for the current operation - one of
chars, lines, or rectangle.  The value of this variable is stored in the cdr
of any register that gets stored as a result of the current command.")

(evi-defbuffervar evi-current-indentation 0 "The indentation of the most recently auto-indented line.  Used by
evi-newline to determine when to kill auto-indented whitespace.
(buffer specific)")

(evi-defbuffervar evi-goal-column 0 "The column that vertical cursor motion will try to preserve, if possible.")

(evi-defbuffervar evi-reset-goal-column t "If t, a horizontal motion has been performed, thus goal column must be reset.")

(defvar evi-search-pattern nil "\
The last pattern specified for searching.")

(defvar evi-search-forward t "\
If t, the last search command was a forward search.")

(defvar evi-find-character nil "\
The last character specified for finding.")

(defvar evi-find-forward t "\
If t, the last find command was a forward search.")

(defvar evi-find-up-to nil "\
If t, the last find command was a find up to command.")

(defvar ex-previous-re nil "\
Last regular expression searched for in :subst command.")

(defvar ex-previous-replacement nil "\
Last replacement used in :subst command.")

(evi-defbuffervar evi-context-ring (make-vector 10 nil) "The last 10 contexts for this buffer.  A context is a location in the buffer
where only relative motions were performed.  A new context is thus saved each
time a non-relative motion is performed.")

(evi-defbuffervar evi-context-ring-cursor 0 "The cursor pointing to the last context in the context ring.")

(defvar evi-last-shell-command nil "\
The last shell command run.")

(defvar ex-work-space (get-buffer-create " *ex-work-space*") "\
Evi work space for parsing ex commands.")

(defvar ex-tag nil "\
Last tag specified.")

(defun evi-make-keymap (name small &optional fill) (byte-code "		    ! 
\" \")" [map small name fill make-sparse-keymap make-keymap fboundp set-keymap-name evi-fill-keymap] 7))

(defconst evi-top-level-map (evi-make-keymap (quote evi-top-level-map) nil (quote evi-top-level)))

(defconst evi-vi-map (evi-make-keymap (quote evi-vi-map) nil) "\
The keymap used in vi mode.")

(defconst evi-param-map (evi-make-keymap (quote evi-param-map) t) "\
The keymap used for parameterized macros.")

(defconst evi-motion-map (evi-make-keymap (quote evi-motion-map) nil) "\
The keymap used for operand motions.")

(defconst evi-map-map (evi-make-keymap (quote evi-map-map) t) "\
The keymap used for map macros.")

(defconst evi-input-map (evi-make-keymap (quote evi-input-map) nil (quote evi-self-insert)) "\
The keymap used in input modes.")

(defconst evi-replace-map (evi-make-keymap (quote evi-replace-map) nil (quote evi-self-replace)) "\
The keymap used in replace mode.")

(defconst evi-insert-map (evi-make-keymap (quote evi-insert-map) t) "\
The insert mode specific input map.")

(defconst evi-read-string-map (evi-make-keymap (quote evi-read-string-map) t) "\
The evi-read-string specific command map.")

(defconst evi-read-string-input-map (evi-make-keymap (quote evi-read-string-input-map) t) "\
The evi-read-string specific input map.")

(defconst evi-ex-map (evi-make-keymap (quote evi-ex-map) t) "\
The keymap used when reading ex commands from the minibuffer")

(defconst evi-ex-input-map (evi-make-keymap (quote evi-ex-input-map) t) "\
The keymap used when reading ex commands from the minibuffer (insert-mode)")

(defconst evi-input-map-map (evi-make-keymap (quote evi-input-map-map) t) "\
The keymap used for input map macros.")

(defconst evi-shell-map (evi-make-keymap (quote evi-shell-map) t) "\
The local keymap used in command mode in a shell buffer.")

(evi-defbuffervar evi-buffer-local-vi-map (evi-make-keymap (quote evi-buffer-local-vi-map) t) "The keymap for buffer specific additions to the vi command map")

(defconst evi-minibuf-input-map (evi-make-keymap (quote evi-minibuf-input-map) t))

(defvar evi-Z-map (evi-make-keymap (quote evi-Z-map) t))

(defvar evi-lbrack-map (evi-make-keymap (quote evi-lbrack-map) t))

(defvar evi-lbrack-m-map (evi-make-keymap (quote evi-lbrack-m-map) t))

(defvar evi-rbrack-map (evi-make-keymap (quote evi-rbrack-map) t))

(cond ((eq evi-emacs-version (quote emacs19)) (defconst evi-vi-keymap-list (list (cons (quote param) evi-param-map) (cons (quote map) evi-map-map) (quote evi-buffer-local-vi-map) evi-vi-map function-key-map (cons (quote cond-emacs) (cons (quote local) nil)) (cons (quote cond-emacs) (cons (quote global) nil))))) ((eq evi-emacs-version (quote lucid19)) (defconst evi-vi-keymap-list (list (cons (quote param) evi-param-map) (cons (quote map) evi-map-map) (quote evi-buffer-local-vi-map) evi-vi-map (cons (quote cond-emacs) (cons (quote local) nil)) (cons (quote cond-emacs) (cons (quote global) nil))))) (t (defconst evi-vi-keymap-list (list (cons (quote param) evi-param-map) (cons (quote map) evi-map-map) evi-buffer-local-vi-map evi-vi-map (cons (quote cond-emacs) (cons (quote global) nil))))))

(evi-defbuffervar evi-keymap-list nil "Keymap list")

(defconst evi-all-keymaps (quote (vi insert replace ex)) "\
All Evi keymaps.")

(evi-defbuffervar evi-register-parameter nil "Register specification to the current parameterized macro.")

(evi-defbuffervar evi-prefix-count-parameter nil "Prefix count to the current parameterized macro.")

(evi-defbuffervar evi-insert-point nil "The point at which the current insert command began.")

(defconst evi-option-list (quote ((("autoindent" "ai") bool . evi-auto-indent) (("autoprint" "ap") bool) (("autowrite" "aw") bool) (("backslash-escapes" "be") bool . ex-input-escapes) (("beautify") bool) (("command-line-editing" "cle") bool . evi-command-line-editing) (("directory" "dir") string) (("edcompatible" "ed") bool) (("enable-emacs-commands" "ee") bool . evi-enable-emacs-commands) (("errorbells" "eb") bool . evi-error-bell) (("exrc") bool . evi-local-exrc) (("flash") bool) (("global-directory" "gd") bool . evi-global-directory) (("hardtabs" "ht") number) (("ignorecase" "ic") bool . evi-ignore-case) (("inhibit-startup-message" "ism") bool . evi-inhibit-startup-message) (("ishell" "ish") string . explicit-shell-file-name) (("lisp") bool) (("list") bool) (("magic") bool . evi-search-magic) (("mesg") bool) (("meta-prefix" "mp") char . evi-meta-prefix-char) (("modeline") bool) (("mode-specific-insert-bindings" "msb") bool . evi-insert-mode-local-bindings) (("modified-paragraph") bool . evi-modified-paragraph) (("novice") bool) (("number" "nu") bool . evi-number) (("optimize" "opt") bool) (("paragraphs" "para") string) (("prompt") bool) (("readonly" "ro") bool . evi-buffer-read-only) (("readonly-buffers") bool . evi-read-only-buffers) (("redraw") bool) (("remap") bool . evi-remap) (("report") number) (("scroll") number . evi-scroll-count) (("sections" "sect") string) (("shell" "sh") string . shell-file-name) (("shiftwidth" "sw") number . evi-shift-width) (("showmatch" "sm") bool . evi-show-match) (("showmode") bool . evi-show-mode) (("slowopen" "slow") bool) (("sourceany") bool) (("tabstop" "ts") number . evi-tab-width) (("tags") string) (("taglength" "tl") number) (("term") string) (("terse") bool) (("timeout") bool . evi-timeout) (("timeoutlen") number . evi-timeout-length) (("ttytype" "tty") string) (("warn") bool) (("word") string . evi-word) (("Word") string . evi-Word) (("wrapmargin" "wm") number . evi-wrap-margin) (("wrapscan" "ws") bool . evi-search-wraparound) (("writeany" "wa") bool))))

(defvar evi-set-options nil "\
List of options that have been set.")

(defconst evi-auto-indent nil "\
*If t, automatically indents text inserted on a new line.")

(defconst evi-command-line-editing nil "\
*If t, command-line editing is enabled.")

(defun evi-command-line-editing (enable) (byte-code "  #" [enable nil evi-define-key (read-string read-string-input ex ex-input) "" evi-exit-minibuf] 4))

(defconst evi-error-bell nil "\
*If t, ring bell on error.")

(defconst evi-local-exrc nil "\
*If t, source local .exrc file at startup.")

(defconst evi-global-directory t "\
*If t, a global current directory is used (this is the default).")

(defconst evi-ignore-case nil "\
*If t, ignore case in searches.")

(defconst evi-search-magic t "\
*If t, search patterns are normal regular expressions.  This is the default.
Otherwise, the `magic' characters `.' `[' and `*' are treated as literals and
must be escaped to get their regular expression interpretation.")

(defconst evi-insert-mode-local-bindings nil "\
*If t, emacs buffer-local key bindings will be enabled in insert mode.")

(defconst evi-modified-paragraph nil "\
*If t, a modified paragraph motion will be used that is similar to
sentence motion.")

(defconst evi-number nil "\
*If t, tracks line and column number in status line (NOT).")

(evi-defbuffervar evi-buffer-read-only nil "*If t, the current buffer is read-only")

(defconst evi-remap t "\
*If t, nested map macros are expanded")

(defconst evi-scroll-count nil "\
*The number of lines to scroll.")

(defconst evi-shift-width 8 "\
*The number of colums shifted by > and < command, and ^T and ^D
in insert mode.")

(defconst evi-show-match nil "\
*If t, show matching parentheses.")

(defun evi-show-match (val) (byte-code "	" [blink-matching-paren val] 2))

(defconst evi-show-mode t "\
*If t, show current vi mode.")

(defconst evi-tab-width 8 "\
*Distance between tab stops")

(defun evi-tab-width (width) (byte-code "	" [tab-width width] 2))

(defconst evi-timeout t "\
*If t, keys in multi-character maps must be typed within one second of each
other, otherwise the partial command aborted.")

(defconst evi-timeout-length 500 "\
*Not implemented.")

(defconst evi-word "[a-zA-Z0-9_]+\\|[^a-zA-Z0-9_ 	
]+\\|^[ 	]*
" "*Regular expression to describe words for w, b and e commands.")

(defconst evi-Word "[^ 	
]+\\|^[ 	]*
" "*Regular expression to describe words for W, B and E commands.")

(defconst evi-wrap-margin 0 "\
*If non-zero, the amount of right margin past which wraparound occurs.")

(defun evi-wrap-margin (margin) (byte-code "= 	U É  	Zɉ1 	U) É1  	Zɉ" [evi-emacs-version margin auto-fill-hook nil fill-column auto-fill-function emacs18 0 window-width do-auto-fill] 4))

(defconst evi-search-wraparound t "\
*If t, search wraps around the end of the file.")

(defvar ex-commands (quote ((("edit" . 1) (0 (nil . "!") (t . offset) (t . file)) . ex-edit) (("buffer" . 1) (0 (nil . "!") (t . buffer)) . ex-change-buffer) (("read" . 1) (1 (t if "!" shell-command) (t . file)) . ex-read) (("write" . 1) (2 (nil . "!") (t if "!" shell-command) (t . ">>") (t . file)) . ex-write) (("kill" . 1) (0 (nil . "!") (t . buffer)) . ex-kill-buffer) (("next" . 1) (0 (nil . "!") (t . files)) . ex-next) (("Edit" . 1) (0 (nil . "!") (nil . offset) (t . file)) . ex-edit-other-window) (("Buffer" . 1) (0 (nil . "!") (t . buffer)) . ex-change-buffer-other-window) (("Kill" . 1) (0 (nil . "!") (t . buffer)) . ex-kill-buffer-delete-windows) (("Write" . 1) (0 (nil . "!")) . ex-write-all-buffers) (("Next" . 1) (0 (nil . "!") (t . files)) . ex-next-other-window) (("set" . 2) (0 (nil . settings)) . ex-set) (("substitute" . 1) (2 (t . regular-expression) (backup . regular-expression2) (nil . "g") (nil . "c")) . ex-substitute) (("global" . 1) (2 (nil . "!") (t . regular-expression) (t . command)) . ex-global) (("vglobal" . 1) (2 (t . regular-expression) (t . command)) . ex-vglobal) (("map" . 3) (0 (nil . "!") (t . map) (t . words)) . ex-map) (("gdb" . 2) (0 (t . file)) . ex-gdb) (("wk" . 2) (0) . ex-write-kill) (("wq" . 2) (0 (nil . "!")) . ex-write-quit) (("Wq" . 2) (0 (nil . "!")) . ex-write-all-and-quit) (("visual" . 2) (0 (nil . "!") (t . offset) (t . file)) . ex-edit) (("Visual" . 2) (0 (nil . "!") (nil . offset) (t . file)) . ex-edit-other-window) (("abbreviate" . 2) (0 (t . abbrev) (t . words)) . ex-abbrev) (("append" . 1) (1) . ex-not-implemented) (("args" . 2) (0) . ex-not-implemented) (("bind" . 2) (0 (nil . "!") (t . word) (t . rest-of-line)) . ex-elisp-bind) (("bug" . 3) (0 (t . words)) . ex-report-bug) (("cd" . 2) (0 (t . file)) . ex-change-directory) (("change" . 1) (2) . ex-not-implemented) (("chdir" . 3) (0 (t . file)) . ex-change-directory) (("copy" . 2) (2 (t . address)) . ex-copy) (("delete" . 1) (2 (t . register)) . ex-delete) (("dirs" . 2) (0) . ex-directory-stack) (("elisp" . 2) (0 (t . rest-of-line)) . ex-elisp-execute) (("evilist" . 4) (0 (t . words)) . ex-mail-list) (("file" . 1) (0 (t . file)) . ex-file) (("insert" . 1) (1) . ex-not-implemented) (("join" . 1) (2) . ex-not-implemented) (("killprocess" . 5) (0 (t . process)) . delete-process) (("list" . 1) (2) . ex-not-implemented) (("mail" . 3) (0 (t . words)) . ex-mail) (("mark" . 2) (1 (t . mark)) . ex-mark) (("move" . 1) (2 (t . address)) . ex-move) (("number" . 2) (2) . ex-not-implemented) (("popd" . 2) (0) . ex-pop-directory) (("preserve" . 3) (0) . ex-preserve) (("previous" . 4) (0) . ex-not-implemented) (("print" . 1) (2) . ex-print) (("pushd" . 4) (0 (t . file)) . ex-push-directory) (("put" . 2) (1 (t . register)) . ex-put) (("quit" . 1) (0 (nil . "!")) . ex-quit) (("recover" . 3) (0 (nil . "!") (t . file)) . ex-recover) (("initialize" . 3) (0) . ex-initialize) (("rewind" . 3) (0) . ex-not-implemented) (("send" . 3) (0 (nil . "!")) . ex-send-mail) (("shell" . 2) (0) . ex-shell) (("source" . 2) (0 (t . file)) . ex-source-file) (("tag" . 1) (0 (t . word)) . ex-tag) (("unabbreviate" . 3) (0 (t . abbrev)) . ex-unabbrev) (("undo" . 1) (0) . ex-not-implemented) (("unmap" . 3) (0 (nil . "!") (t . word)) . ex-unmap) (("version" . 2) (0) . ex-evi-version) (("xit" . 1) (0 (nil . "!")) . ex-write-all-and-quit) (("yank" . 1) (2 (t . register)) . ex-yank) (("!" . 1) (2 (nil . "&") (t . shell-command)) . ex-shell-command) (("<" . 1) (2) . ex-shift-left) (("=" . 1) (2) . ex-not-implemented) ((">" . 1) (2) . ex-shift-right) (("&" . 1) (2) . ex-substitute-again) (("@" . 1) (2) . ex-not-implemented) (("" . 0) (2) . ex-null))) "\
Ex commands table

The car of an item in the list is a pair of the full name of a command with
the length of the shortest prefix that's unambiguous.  The cdr of an item
is a pair of a description of arguments with the name of the lisp function
to invoke for this command.  The description of argument is a pair of the
number of addresses this command accepts and a list describing its
subsequent arguments and how to parse them.  Each element of the list of
subsequent argument descriptions is a pair.  The car of this pair is `t'
if the parser should eat whitespace before the arg, and `nil' if it
shouldn't.  The cdr describes the argument itself.  The possible values
are as follows (symbols are indicated by prefixing with \"'\", asterisked
items are completable):
      a string		    literally match that string
      'address		    an ex line address
      'register		    a register name
    * 'file		    a file name (`%', `#' and wildcards are expanded)
    * 'files		    several file names (similarly expanded)
    * 'buffer		    a buffer name (can include spaces)
      'rest-of-line	    the rest of the line (can include `|')
    * 'process		    a process name (can include spaces and `|')
      'word		    a space-delimited word
      'words		    several words
    * 'map		    a :map macro name
    * 'abbrev		    an :abbrev macro name
      'regular-expression   a regular expression
      'regular-expression2  same but `&' is special
      'command		    an ex command
    * 'settings		    :set settings (`wm=8', etc)
    * 'shell-command	    a shell command (`%', `#' are expanded)
      'offset		    a line offset (`+5')
      'mark		    a mark

In summary (postfix `*' means `list-of'):

   ((full-name . prefix-len) .
    ((num-of-addrs . (eat-whitespace? . arg-descr)*) . lisp-function))")

(defmacro evi-defmotion (&rest args) (byte-code "	@	A@	8	8	\"
!P!@=F 
DDD#&AD#E @=} 
DEDE&A@D&AAD#E 
DD%&D#E." [direction args function params documentation body do-function t 2 3 nthcdr 4 intern "do-" symbol-name &char progn list defun nil (interactive) append (evi-motion-command) quote ((evi-adjust-count) evi-context (evi-read-command-char)) (defun) &string (interactive) evi-extend-continuation (quote evi-after-string-arg) (quote quote) (quote quote) (evi-adjust-count) (list (quote quote) evi-context) evi-read-string (defun) (interactive) evi-motion-command (evi-adjust-count) evi-context (defun)] 22))

(defun evi-after-string-arg (func dir count context) (byte-code "	
%" [func dir count context evi-minibuf-contents evi-motion-command] 6))

(defmacro evi-iterate (count &rest body) (byte-code "DCED	DEC#EF" [count body let append while > 0 setq 1- =] 9))

(defmacro evi-break nil (byte-code "E" [setq count -1] 3))

(defmacro evi-enumerate-condition (item list condition &rest body) (byte-code "D	CD	E
EED \"  \"F" [list item condition body let append while and progn setq (car list) ((setq list (cdr list))) ((setq list (cdr list)))] 10))

(defmacro evi-iterate-list (item list &rest body) (byte-code "D	CED	EC
#\"E" [list item body let (found) append while setq (car list) ((setq list (cdr list)))] 8))

(defmacro evi-find (item list pred) (byte-code "D	CE	
%EEEF" [list item pred let (found) while and progn setq (car list) found (not found) (setq list (cdr list))] 12))

(defmacro evi-set-goal-column nil (byte-code "" [(if evi-reset-goal-column (setq evi-goal-column (current-column) evi-reset-goal-column nil))] 1))

(defmacro evi-reset-goal-column nil (byte-code "" [(setq evi-reset-goal-column t)] 1))

(defmacro evi-register-text (register) (byte-code "D" [register car] 2))

(defmacro evi-register-shape (register) (byte-code "D" [register cdr] 2))

(defun evi-define-key (maps key def) (byte-code "	 @ą) 
!Q!J$A *" [list maps map nil t key def funcall define-key intern "evi-" symbol-name "-map"] 8))

(defun evi-define-macro (maps key macro) (byte-code "	 @ą0 
!Q!DFDF!A *" [list maps map nil t macro eval define-key intern "evi-" symbol-name "-map" key quote lambda (interactive) evi-internal-macro] 13))

(defun evi-make-local-keymap (keydefs) (byte-code " ! \"	\")" [keymap keydefs make-sparse-keymap fboundp set-keymap-name evi-local mapcar (lambda (keydef) (define-key keymap (eval (car keydef)) (nth 1 keydef)))] 6))

(defun evi-unbound nil (interactive) (byte-code "\"" [last-command-char nil evi-error "Nothing bound to `%c'"] 3))

(evi-define-key (quote (vi)) "" (quote evi-scroll-page-backward))

(evi-define-key (quote (vi)) "" (quote keyboard-quit))

(evi-define-key (quote (vi)) "" (quote evi-scroll-text-forward))

(evi-define-key (quote (vi)) "" (quote evi-scroll-cursor-forward))

(evi-define-key (quote (vi)) "" (quote evi-scroll-page-forward))

(evi-define-key (quote (vi)) "" (quote evi-file-info))

(evi-define-key (quote (vi motion)) "" (quote evi-backward-char))

(evi-define-key (quote (vi)) "	" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "
" (quote evi-next-line))

(evi-define-key (quote (vi)) "" (quote evi-redraw))

(evi-define-key (quote (vi motion)) "" (quote evi-beginning-of-next-line))

(evi-define-key (quote (vi motion)) "" (quote evi-next-line))

(evi-define-key (quote (vi motion)) "" (quote evi-previous-line))

(evi-define-key (quote (vi)) "" (quote evi-redraw))

(evi-define-key (quote (vi)) "" (quote evi-scroll-text-backward))

(evi-define-key (quote (vi)) "" (quote evi-scroll-cursor-backward))

(evi-define-key (quote (vi)) "" (quote suspend-emacs))

(evi-define-key (quote (vi)) "" (quote evi-tag))

(evi-define-key (quote (vi)) "" ":e#
")

(evi-define-key (quote (vi motion)) " " (quote evi-forward-char))

(evi-define-key (quote (vi)) "!" (quote evi-shell-filter))

(evi-define-key (quote (vi)) "\"" (quote evi-prefix-register))

(evi-define-key (quote (vi)) "#" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "$" (quote evi-end-of-line))

(evi-define-key (quote (vi motion)) "%" (quote evi-paren-match))

(evi-define-key (quote (vi)) "&" ":s
")

(evi-define-key (quote (vi motion)) "'" (quote evi-goto-mark-vertical))

(evi-define-key (quote (vi motion)) "(" (quote evi-backward-sentence))

(evi-define-key (quote (vi motion)) ")" (quote evi-forward-sentence))

(evi-define-key (quote (vi)) "*" (quote evi-send-to-process))

(evi-define-key (quote (vi motion)) "+" (quote evi-beginning-of-next-line))

(evi-define-key (quote (vi motion)) "," (quote evi-find-next-character-reverse))

(evi-define-key (quote (vi motion)) "-" (quote evi-beginning-of-previous-line))

(evi-define-key (quote (vi)) "." (quote evi-repeat))

(evi-define-key (quote (vi motion)) "/" (quote evi-search-forward))

(evi-define-key (quote (vi motion)) "0" (quote evi-digit-or-beginning-of-line))

(evi-define-key (quote (vi motion)) "1" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "2" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "3" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "4" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "5" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "6" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "7" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "8" (quote evi-prefix-digit))

(evi-define-key (quote (vi motion)) "9" (quote evi-prefix-digit))

(evi-define-key (quote (vi)) ":" (quote evi-ex-command))

(evi-define-key (quote (vi motion)) ";" (quote evi-find-next-character))

(evi-define-key (quote (vi)) "<" (quote evi-shift-left))

(evi-define-key (quote (vi)) "=" (quote evi-indent))

(evi-define-key (quote (vi)) ">" (quote evi-shift-right))

(evi-define-key (quote (vi motion)) "?" (quote evi-search-backward))

(evi-define-key (quote (vi)) "@" (quote evi-register-macro))

(evi-define-macro (quote (vi)) "A" "$#a")

(evi-define-key (quote (vi motion)) "B" (quote evi-backward-Word))

(evi-define-macro (quote (vi)) "C" "&c#$")

(evi-define-macro (quote (vi)) "D" "&d#$")

(evi-define-key (quote (vi motion)) "E" (quote evi-end-of-Word))

(evi-define-key (quote (vi motion)) "F" (quote evi-find-char-backwards))

(evi-define-key (quote (vi motion)) "G" (quote evi-goto-line))

(evi-define-key (quote (vi motion)) "H" (quote evi-goto-top-of-window))

(evi-define-macro (quote (vi)) "I" "^#i")

(evi-define-key (quote (vi)) "J" (quote evi-join-lines))

(evi-define-key (quote (vi)) "K" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "L" (quote evi-goto-bottom-of-window))

(evi-define-key (quote (vi motion)) "M" (quote evi-goto-middle-of-window))

(evi-define-key (quote (vi motion)) "N" (quote evi-search-next-reverse))

(evi-define-key (quote (vi)) "O" (quote evi-open-before))

(evi-define-key (quote (vi)) "P" (quote evi-put))

(evi-define-key (quote (vi)) "Q" (quote evi-quit-evi))

(evi-define-key (quote (vi)) "R" (quote evi-replace))

(evi-define-macro (quote (vi)) "S" "&c#c")

(evi-define-key (quote (vi motion)) "T" (quote evi-find-char-backwards-after))

(if (boundp (quote buffer-undo-list)) (evi-define-key (quote (vi)) "U" (quote evi-undo-line)))

(evi-define-key (quote (vi)) "V" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "W" (quote evi-forward-Word))

(evi-define-macro (quote (vi)) "X" "&d#h")

(evi-define-macro (quote (vi)) "Y" "&y#y")

(evi-define-key (quote (vi)) "Z" (cons (quote prefix) evi-Z-map))

(evi-define-key (quote (Z)) "Z" ":Wq!
")

(evi-define-key (quote (vi)) "[" (cons (quote prefix) evi-lbrack-map))

(evi-define-key (quote (motion)) "[" (cons (quote prefix) evi-lbrack-m-map))

(evi-define-key (quote (lbrack)) "\"" (quote evi-register-string))

(evi-define-key (quote (lbrack)) "'" (quote evi-register-char))

(evi-define-key (quote (lbrack lbrack-m)) "(" (quote evi-parameterized-macro))

(evi-define-key (quote (lbrack lbrack-m)) "[" (quote evi-backward-section))

(evi-define-key (quote (lbrack)) "b" (quote evi-buffer-name))

(evi-define-key (quote (lbrack)) "u" (quote evi-undo-more))

(evi-define-key (quote (lbrack)) "{" (quote evi-loop-over-lines-in-region))

(evi-define-key (quote (vi)) "\\" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "]" (cons (quote prefix) evi-rbrack-map))

(evi-define-key (quote (rbrack)) "]" (quote evi-forward-section))

(evi-define-key (quote (vi motion)) "^" (quote evi-goto-indentation))

(evi-define-key (quote (vi)) "_" (quote evi-prompt-repeat))

(evi-define-key (quote (vi motion)) "`" (quote evi-goto-mark-horizontal))

(evi-define-key (quote (vi)) "a" (quote evi-insert-after))

(evi-define-key (quote (vi motion)) "b" (quote evi-backward-word))

(evi-define-key (quote (vi)) "c" (quote evi-change))

(evi-define-key (quote (vi)) "d" (quote evi-delete))

(evi-define-key (quote (vi motion)) "e" (quote evi-end-of-word))

(evi-define-key (quote (vi motion)) "f" (quote evi-find-character))

(evi-define-key (quote (vi)) "g" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "h" (quote evi-backward-char))

(evi-define-key (quote (vi)) "i" (quote evi-insert))

(evi-define-key (quote (vi motion)) "j" (quote evi-next-line))

(evi-define-key (quote (vi motion)) "k" (quote evi-previous-line))

(evi-define-key (quote (vi motion)) "l" (quote evi-forward-char))

(evi-define-key (quote (vi)) "m" (quote evi-set-mark))

(evi-define-key (quote (vi motion)) "n" (quote evi-search-next))

(evi-define-key (quote (vi)) "o" (quote evi-open-after))

(evi-define-key (quote (vi)) "p" (quote evi-put-after))

(evi-define-key (quote (vi)) "q" (quote evi-unbound))

(evi-define-key (quote (vi)) "r" (quote evi-replace-char))

(evi-define-macro (quote (vi)) "s" "&c#l")

(evi-define-key (quote (vi motion)) "t" (quote evi-find-character-before))

(evi-define-key (quote (vi)) "u" (quote evi-undo))

(evi-define-key (quote (vi)) "v" (quote evi-unbound))

(evi-define-key (quote (vi motion)) "w" (quote evi-forward-word))

(evi-define-macro (quote (vi)) "x" "&d#l")

(evi-define-key (quote (vi)) "y" (quote evi-yank))

(evi-define-key (quote (vi)) "z" (quote evi-window-control))

(evi-define-key (quote (vi motion)) "{" (quote evi-backward-paragraph))

(evi-define-key (quote (vi motion)) "|" (quote evi-goto-column))

(evi-define-key (quote (vi motion)) "}" (quote evi-forward-paragraph))

(evi-define-key (quote (vi)) "~" (quote evi-toggle-case))

(evi-define-key (quote (param)) "&" (quote evi-register-parameter))

(evi-define-key (quote (param)) "#" (quote evi-prefix-count-parameter))

(evi-define-key (quote (motion)) "a" (quote evi-region-arbitrary))

(evi-define-key (quote (motion)) "m" (quote evi-region-mouse))

(evi-define-key (quote (motion)) "r" (quote evi-region-rectangle))

(evi-define-key (quote (motion)) "R" (quote evi-region-rows))

(evi-define-key (quote (motion)) "C" (quote evi-region-columns))

(evi-define-key (quote (input)) "" (quote evi-quoted-insert))

(evi-define-key (quote (input)) "" (quote evi-quoted-insert))

(evi-define-key (quote (input replace)) "" (quote evi-keyboard-quit))

(evi-define-key (quote (input replace)) "" (quote evi-resume-continuation))

(evi-define-key (quote (insert)) "" (quote evi-backward-indent))

(evi-define-key (quote (insert)) "" (quote evi-insert-mode-delete-backward-char))

(evi-define-key (quote (insert)) "
" (quote evi-newline))

(evi-define-key (quote (insert)) "" (quote evi-newline))

(evi-define-key (quote (insert)) "" (quote evi-forward-indent))

(evi-define-key (quote (insert)) "" (quote evi-insert-mode-kill-line))

(evi-define-key (quote (insert)) "" (quote evi-insert-mode-delete-backward-word))

(evi-define-key (quote (insert)) "" (quote evi-insert-mode-kill-line))

(evi-define-key (quote (insert)) "" (quote evi-insert-mode-delete-backward-char))

(evi-define-key (quote (replace)) "" (quote evi-replace-mode-backward-indent))

(evi-define-key (quote (replace)) "" (quote evi-replace-mode-delete-backward-char))

(evi-define-key (quote (replace)) "" (quote evi-replace-mode-kill-line))

(evi-define-key (quote (replace)) "" (quote evi-replace-mode-delete-backward-word))

(evi-define-key (quote (replace)) "" (quote evi-replace-mode-kill-line))

(evi-define-key (quote (replace)) "" (quote evi-replace-mode-delete-backward-char))

(evi-define-key (quote (read-string ex)) "" (quote evi-backward-char-maybe-abort))

(evi-define-key (quote (read-string-input ex-input)) "" (quote evi-delete-backward-char-maybe-abort))

(evi-define-key (quote (read-string read-string-input ex ex-input)) "
" (quote evi-exit-minibuf))

(evi-define-key (quote (read-string read-string-input ex ex-input)) "" (quote evi-exit-minibuf))

(evi-define-key (quote (read-string read-string-input ex ex-input)) "" (quote evi-exit-minibuf))

(evi-define-key (quote (read-string ex)) "" (quote evi-backward-char-maybe-abort))

(evi-define-key (quote (read-string-input ex-input)) "" (quote evi-delete-backward-char-maybe-abort))

(evi-define-key (quote (ex-input)) "	" (quote ex-complete))

(evi-define-key (quote (shell)) "" (quote evi-shell-send-input))

(defun evi-init-special-keys nil (byte-code "=####
 !!!6 6 !)$! 	!!	!!#

# 	<? 	@=  = 
#˂ 	! 	!!! 	!!!= 	!!
!= 
# 
#)˅ _ \"	\" @ !A 
!+$ B C 	!!	!!D 	!!D	!D 	!=-	!E	!!D 	!!=EE )+$ F 	\"% G H =I J  !K  v% L D 	!M !!N !!?O P !Q !!R !!!bS T !)%U V #U W #U X #U Y #Z =[ \\ ] ^ #\\ _ ` #\\ a b #\\ c d #\\ e #\\ f #\\ g #\\ h #) i 	!S T !% j 	!S T !% k 	!S T !% l 	!S T !%U b #U m d #U n ` #U o ^ #" [evi-emacs-version nil evi-posn-buffer window position evi-mouse-drag-text handler frame start event overlay t end unread-command-events evi-mouse-select-dragged-text string region buffer point window-system evi-mouse-copy-dragged-text evi-mouse-paste-selection evi-current-macro evi-mouse-set-point posn evi-top-level-map maps evi-mouse-track evi-mouse-track-insert evi-x-mouse-kill evi-x-set-point-and-insert-selection function-keymap emacs19 ex-map [left] "h" [right] "l" [up] "k" [down] "j" defun "Return the buffer of the window in POSITION." posn-window integer-or-marker-p posn-point window-buffer "Highlight text dragged by mouse; the event described by the highlight text
is passed to HANDLER, as is ARG (if provided)." selected-frame event-start make-overlay 1 track-mouse overlay-put face read-event switch-frame move-overlay mouse-movement-p window-frame overlay-buffer funcall sit-for 9999 delete-overlay "Place the dragged region into the mouse selection.
Return the string in that region for insertion by the caller.
If EVENT is a click rather than a drag, invoke the appropriate binding.
This is intended for a button-down binding." "" event-end ((byte-code " !`
!\"= \"*" [buffer point window string region window-system nil window-buffer selected-window select-window apply buffer-substring x x-set-selection] 7)) "Copy the dragged text to the mouse selection." "Insert the X selection at the click point." x evi-push-macro x-selection evi-do-command "Move point to the position clicked on with the mouse." window-minibuffer-p minibuffer-window-active-p error "Minibuffer window is not active" select-window numberp evi-fixup-cursor vertical define-key [down-mouse-1] [drag-mouse-1] [mouse-1] [mouse-2] lucid19 (vi motion) evi-define-key down evi-next-line up evi-previous-line left evi-backward-char right evi-forward-char button1 button2 (control button1) (control button2) mouse-track mouse-track-insert x-mouse-kill x-set-point-and-insert-selection "r" "u" "d"] 110))

(defun evi-parameterized-macro nil (interactive) (byte-code "!!" [nil evi-extend-continuation evi-parameterized-macro-after evi-read-string "("] 3))

(defun evi-parameterized-macro-after nil (byte-code "	
%B" [evi-minibuf-contents evi-register-parameter evi-prefix-count-parameter evi-keymap-list evi-register-spec nil evi-prefix-count evi-param-map evi-push-macro evi-parameterized-macro-after-after] 6))

(defun evi-parameterized-macro-after-after (reg-spec count keymap-list) (byte-code "	" [evi-register-parameter reg-spec evi-prefix-count-parameter count evi-keymap-list keymap-list] 2))

(defvar evi-internal-macro-keys (make-string 32 0))

(defun evi-internal-macro (macro) (byte-code "	
&	Ή" [macro evi-parameterized-macro evi-remap evi-register-spec evi-prefix-count evi-command-keys evi-command-keys-index evi-register-parameter nil evi-prefix-count-parameter t evi-internal-macro-keys evi-push-macro evi-internal-after 0] 9))

(defun evi-internal-after (param-flag remap-flag reg count command-keys index) (byte-code "		
 " [evi-parameterized-macro param-flag evi-remap remap-flag evi-register-spec reg evi-prefix-count count evi-command-keys command-keys evi-command-keys-index index evi-save-command-keys] 2))

(defun evi-register-macro (char &optional count) (interactive (byte-code " " [evi-character-arg] 2)) (byte-code "!
H@
! +" [evi-last-command-keys nil register-number char macro evi-registers evi-last-macro-register evi-register-number evi-push-macro evi-get-command] 4))

(defvar evi-unread-command-char nil)

(defvar evi-macro-stack nil)

(defvar evi-current-macro nil)

(defvar evi-current-macro-index nil)

(defun evi-execute-macro (macro) (byte-code "!	   " [macro evi-current-macro evi-push-macro evi-get-command] 4))

(defvar evi-minibuf-prompt nil)

(defvar evi-minibuf nil)

(defvar evi-minibuf-prev nil)

(defvar evi-minibuf-user-window nil)

(defun evi-read-string (prompt &optional initial vi-map input-map) (byte-code " !	Q!q
= ĉ ! !	p !  p\" !Édb	=X p![ !	c
g 
co x  " [evi-in-minibuf prompt buffer-undo-list t nil evi-minibuf-prompt evi-minibuf evi-minibuf-prev evi-minibuf-user-window evi-emacs-version initial evi-buffer-local-vi-map vi-map evi-read-string-map evi-minibuf-input-map input-map evi-read-string-input-map evi-error "Can't use minibuffer inside minibuffer" get-buffer-create " *evi-" "-Minibuf*" evi evi-set-continuation evi-read-string-after evi-mark-continuation evi-push-continuation evi-standard-continuation window-buffer minibuffer-window selected-window set-window-buffer select-window emacs18 display-buffer message evi-insert] 17))

(defun evi-exit-minibuf-window nil (byte-code "dSb HU Q! `d\"! db	q 
\"!ŉ" [evi-minibuf-prompt evi-minibuf evi-minibuf-prev evi-minibuf-user-window evi-in-minibuf nil beginning-of-line looking-at 0 91 "\\" " *$" delete-region set-window-buffer minibuffer-window select-window] 8))

(defun evi-read-string-after nil (byte-code "`	G\\ `\"  " [evi-minibuf-contents evi-minibuf-prompt buffer-substring end-of-line evi-exit-minibuf-window evi-pop-continuation] 5))

(defun evi-exit-minibuf nil (interactive) (byte-code " ! " [nil beginning-of-line evi-sit-for 0 evi-unwind-continuations] 4))

(defun evi-abort-minibuf nil (byte-code "  !" [evi-exit-minibuf-window evi-discard-continuations evi-push-continuation evi-standard-continuation] 4))

(cond ((eq evi-emacs-version (quote lucid19)) (defun evi-read-char nil (if evi-unread-command-char (prog1 evi-unread-command-char (setq evi-unread-command-char nil)) (or (evi-read-macro) (let ((event (allocate-event))) (while (progn (next-event event) (not (key-press-event-p event))) (dispatch-event event)) (or (event-to-character event t t) (event-key event))))))) ((eq evi-emacs-version (quote emacs19)) (defun evi-read-char nil (if evi-unread-command-char (prog1 evi-unread-command-char (setq evi-unread-command-char nil)) (or (evi-read-macro) (let ((ev (read-event))) (or (and (symbolp ev) (get (car (get ev (quote event-symbol-element-mask))) (quote ascii-character))) ev)))))) (t (defun evi-read-char nil (if evi-unread-command-char (prog1 evi-unread-command-char (setq evi-unread-command-char nil)) (or (evi-read-macro) (read-char))))))

(defun evi-push-macro (macro &optional after &rest args) (byte-code "	
BBBBƉ" [evi-macro-stack evi-current-macro evi-current-macro-index after args macro 0] 3))

(defun evi-pop-macro nil (byte-code "	@A	@@@	@@A	A@ @A\")" [after evi-macro-stack evi-current-macro evi-current-macro-index apply] 3))

(defun evi-discard-macros nil (byte-code "" [evi-current-macro nil evi-macro-stack] 2))

(defun evi-read-macro nil (byte-code " 	GU     	H	T" [evi-current-macro evi-current-macro-index evi-pop-macro] 4))

(defun evi-sit-for (count) (byte-code " 	 
	G\" Â !" [evi-unread-command-char evi-current-macro evi-current-macro-index nil count /= sit-for] 3))

(defun evi-register-parameter nil (interactive) (byte-code "	!" [evi-register-spec evi-register-parameter nil evi-push-continuation evi-prompt] 2))

(defun evi-prefix-count-parameter nil (interactive) (byte-code "	!" [evi-prefix-count evi-prefix-count-parameter nil evi-push-continuation evi-prompt] 2))

(defun evi-error (&rest args) (byte-code "\"\"" [args throw abort apply format] 5))

(defun evi-warning (&rest args) (byte-code "  !	\"\" 	\"! " [evi-interactive args evi-discard-continuations evi-push-continuation evi-standard-continuation throw abort apply format princ terpri] 8))

(defvar evi-debug-cont nil)

(evi-defbuffervar evi-continuation-stack nil "The continuation stack.")

(defun evi-set-continuation (func &rest args) (byte-code "	
BB" [evi-continuation-stack func args nil] 2))

(defun evi-push-continuation (func &rest args) (byte-code "	
BB !Q!" [evi-continuation-stack func args evi-debug-cont evi-db "{PU:" prin1-to-string "}
"] 5))

(defun evi-extend-continuation (func &rest args) (byte-code "@= 	
BB 	
B@EAB( !Q!" [evi-continuation-stack func args evi-debug-cont suspend progn evi-db "{EX:" prin1-to-string "}
"] 5))

(defun evi-suspend-continuation nil (byte-code "B	 !Q!" [evi-continuation-stack evi-debug-cont suspend evi-db "{SU:" prin1-to-string "}
"] 5))

(defun evi-resume-continuation nil (interactive) (byte-code "A	 !Q!" [evi-continuation-stack evi-debug-cont nil evi-db "{RE:" prin1-to-string "}
"] 5))

(defun evi-mark-continuation nil (byte-code "B	 !Q!" [evi-continuation-stack evi-debug-cont mark evi-db "{MA:" prin1-to-string "}
"] 5))

(defun evi-unwind-continuations nil (byte-code "@=?  !A  A" [evi-continuation-stack mark evi-error "No continuation mark found!"] 4))

(defun evi-reset-continuations nil (byte-code "	 @=? A  " [evi-continuation-stack mark] 3))

(defun evi-pop-continuation nil (byte-code " 	!Q!	@= 	@	A!" [evi-debug-cont evi-continuation-stack evi-db "{PO:" prin1-to-string "}
" suspend eval] 6))

(defun evi-discard-continuation nil (byte-code " 	!Q!	A" [evi-debug-cont evi-continuation-stack evi-db "{DI:" prin1-to-string "}
"] 5))

(defun evi-discard-continuations nil (byte-code " 	!Q!	 	@=?! 	A 	* 	A" [evi-debug-cont evi-continuation-stack evi-db "{DS:" prin1-to-string "}
" suspend] 5))

(defun evi-top-level nil (interactive) (byte-code "ƈ? !!	=   ,  \" " [evi-continuation-stack evi-emacs-version evi-unread-command-char last-command-event last-command-char evi-current-macro nil message "Glitch!" evi-push-continuation evi-standard-continuation emacs19 evi-do-command] 6))

(defvar evi-delayed-buffer-change-request nil)

(defun evi-standard-continuation nil (byte-code " 	GU    É !I @=7 A@!= A@!AA!É" [evi-current-macro evi-current-macro-index evi-prompted nil evi-prefix-count evi-register-spec evi-delayed-buffer-change-request evi-pop-macro evi-erase-keys evi-push-continuation evi-standard-continuation other switch-to-buffer-other-window switch-to-buffer eval] 8))

(defun evi-prompt nil (byte-code "? !  \"" [evi-in-minibuf evi-prompted t evi-sit-for 1 message "%s -" evi-prompt-keys-description] 5))

(defun evi-do-command nil (byte-code "	
 Ǎ ʏ2 = Â.  &  . !!)" [message evi-debug t nil evi-error-bell evi-in-minibuf abort (byte-code "  " [nil evi-get-command evi-pop-continuation] 3) code (byte-code "" [abort (byte-code "  " [nil evi-get-command evi-pop-continuation] 3)] 2) ((error (byte-code " @A\"" [code evi-reset-top-level signal] 4)) (quit (byte-code " @A\"" [code evi-reset-top-level signal] 4))) evi-soft-reset beep evi-fixup-cursor horizontal] 5))

(defun evi-reset-top-level nil (byte-code "  
	!   !!" [evi-in-minibuf evi-mode evi-context nil evi-prefix-count evi-prefix-count-multiplier evi-register-spec evi-prompted evi-overstruck-char evi-keymap-list evi-vi-keymap-list evi-abort-minibuf vi evi-change-mode-id "Vi" evi-refresh-mode-line evi-erase-keys evi-discard-macros evi-set-continuation evi-standard-continuation evi-fixup-cursor horizontal] 8))

(defun evi-soft-reset nil (byte-code "	
! !   !!" [evi-mode evi-context nil evi-prefix-count evi-prefix-count-multiplier evi-register-spec evi-prompted evi-overstruck-char evi-keymap-list evi-vi-keymap-list evi-in-minibuf vi evi-change-mode-id "Vi" evi-refresh-mode-line evi-erase-keys evi-reset-continuations evi-push-continuation evi-standard-continuation evi-fixup-cursor horizontal] 7))

(defun evi-emacs-command nil (interactive) (byte-code "!! BBBBD( %  D(  C1   )" [last-command-char evi-keymap-list nil evi-emacs-local-map evi-global-directory default-directory evi-unread-command-char boundp minor-mode-map-alist emacs local global current-global-map evi-current-directory evi-get-command] 7))

(defun evi-db (string) (byte-code "p!	= 	q
cq*" [buf dbuf string get-buffer-create "*debug*"] 3))

(defun evi-get-command nil (byte-code " 
! 
! 
!@!; \"9L J\"@=j 	d A\"g ŉ@= 
z ? A\" ŉ @=HAA> ŉ A@=    H= = GU  \\
! H\\!OP !OP \"ŉ!4!ŉ/ 
!P
!\";XA!

ŉ#ł!rHBŉł!!

ŉ!ł:@=D\"AC!ł!O!SHO\"ŉň?A *  \"," [inhibit-quit t char keys keydef nil list evi-keymap-list keymap evi-parameterized-macro evi-remap evi-current-macro evi-enable-emacs-commands evi-meta-prefix-char evi-emacs-version evi-emacs-meta-prefix-char evi-timeout evi-prompted last-command-char last-command-event evi-last-command-keys quit-flag evi-error-bell evi-read-command-char integerp char-to-string vector keymapp lookup-key param map emacs 0 global current-global-map current-local-map lucid19 1 128 2 evi-sit-for message "" evi-push-macro (lambda (lck) (byte-code "	" [evi-last-command-keys lck] 2)) vectorp commandp call-interactively prefix evi-extend-continuation (lambda (kl) (byte-code "	" [evi-keymap-list kl] 2)) quote evi-push-continuation evi-prompt numberp beep evi-error "Unknown command `%s'" evi-keys-description] 38))

(defun evi-read-command-char nil (byte-code " 	 ! ! !)" [char evi-current-macro evi-read-char integerp evi-add-key 35] 5))

(defun evi-unread-command-char (char) (byte-code "	 " [evi-unread-command-char char evi-lose-key] 2))

(defun evi-count-arg nil (byte-code "C" [evi-prefix-count] 1))

(defun evi-register-args nil (byte-code "@A	E" [evi-register-spec evi-prefix-count] 3))

(defun evi-character-arg nil (byte-code " D" [evi-prefix-count evi-read-command-char] 3))

(defun evi-context-arg nil (byte-code "C" [evi-context] 1))

(defvar evi-mode-line-format " Evi:%-6s")

(defun evi-in-mode-line-p (var) (byte-code "< 	> " [mode-line-buffer-identification var nil] 2))

(defun evi-install-in-mode-line (var) (byte-code "! 	< 	C\" 	CB" [var mode-line-buffer-identification evi-in-mode-line-p append] 4))

(defun evi-deinstall-from-mode-line (var) (byte-code "! 	\"" [var mode-line-buffer-identification evi-in-mode-line-p evi-filter (lambda (mode-var) (byte-code "	=?" [var mode-var] 2))] 4))

(defun evi-change-mode-id (string) "\
Change Evi's mode identification string to STRING." (byte-code "	
\"" [evi-mode-string evi-mode-line-format string format] 3))

(defun evi-refresh-mode-line nil "\
Redraw mode line." (byte-code " !" [set-buffer-modified-p buffer-modified-p] 3))

(defun evi-initialize nil (byte-code "C = ϐ )( ϐ )!9 
B	B	C  " [evi-initialized t evi-directory-stack default-directory evi-emacs-meta-prefix-char meta-prefix-char evi-emacs-version temp-buffer-show-hook temp-buffer-show-function minor-mode-map-alist evi-top-level-map evi-meta-prefix-char evi-init-special-keys emacs18 evi-startup-show-hook "*Startup*" evi-customize boundp evi-enabled evi-welcome-message] 6))

(defun evi-startup-show-hook (buf) (byte-code "p	qo
 m? ebc	!!\"q)" [curbuf buf "The following problems were found at startup:
" display-buffer message "Use `z1=' to show only `%s'" buffer-name] 5))

(defun evi-customize nil (byte-code "  \" ʂ P! 	P!!( !эQ  =E ՂH PR!?Q  +*" [user-name home evi-interactive nil source message t user-login-name string= user-real-login-name "~" file-readable-p "~/.evirc" load-file "/.evirc" ".evirc" abort (byte-code " Ɖ
P!ɉ
P!8 ' ˉ!̉!7 !)D ω!Љ!T !)Ň" [evi-supress-ex-startup source home evi-local-exrc exinit nil "~/.exrc" evi-do-ex-command-file "/.exrc" "~/.exrc.evi" "/.exrc.evi" ".exrc" "EXINIT" getenv evi-do-ex-command-string ".exrc.evi" "EVIINIT"] 9) beep y-or-n-p "Error in " "" ": " ". Continue? " kill-emacs] 13))

(defun evi-welcome-message nil (byte-code "?V 	?V p!=V  ?V 
=' ς8 =1 т8 =8 &!!!q !)ǉ" [evi-inhibit-startup-message noninteractive evi-version evi-copyright evi-emacs-version nil inhibit-startup-message t get-buffer "*scratch*" input-pending-p insert ".  " ".

Evi is an enhanced emulator for Vi that runs in an emacs environment.
If you are familiar with vi, you should have very few problems using Evi.
By default, Evi is setup to emulate vi as closely as it can; however,
there are a number of new commands (mostly `:' commands) that support
the multiple window/multiple buffer environment that emacs provides.
In addition, file/buffer/command/etc completion is supported for `:'
commands (use `TAB' to complete).

Type `Q' to exit Evi (back to emacs).  Type `ZZ' to save *all* modified
files and exit emacs.  Type `:w' to save the current file, and `:W' to
save all modified files.  Type `:q' to quit " emacs18 "emacs." emacs19 "the current frame, and
quit emacs if only one frame exists." lucid19 "the current screen, and
quit emacs if only one screen exists." "

You may be interested in the following enhancements, which are disabled
by default: using emacs commands, command line editing, backslash escapes
(such as `\\n') and disabling this message(!).  For more information, consult
the Evi manual (in the files `evi.info' or `evi.tex').  Hopefully this is
available by using `M-x info' and selecting the `Evi' menu item.  If
necessary, consult your nearest emacs guru for advice." set-buffer-modified-p sit-for 120 erase-buffer] 10))

(defun evi nil "\
Start vi emulation in this buffer." (interactive) (byte-code "Ј> 	   !=! !L!L!5 !L!!I !` 	` 
[  ̉!{ !!!!̉ " [evi-enabled evi-initialized evi-emacs-local-map evi-emacs-version evi-meta-prefix-char evi-keymap-list evi-vi-keymap-list evi-top-level-map buffer-read-only buffer-file-name evi-read-only-buffers evi-buffer-read-only t evi-show-match evi-tab-width evi-wrap-margin nil evi-initialize current-local-map evi-install-in-mode-line evi-mode-string lucid19 make-local-variable interrupt-char 3 echo-keystrokes 0 blink-matching-paren meta-prefix-char evi-set-continuation evi-standard-continuation boundp minor-mode-map-alist use-local-map toggle-read-only evi-change-mode-id "Vi" run-hooks evi-mode-hook evi-refresh-mode-line] 18))

(defun evi-quit-evi nil "\
Quit vi emulation in this buffer." (interactive) (byte-code "!! 
!!=! ! " [evi-enabled nil evi-emacs-local-map evi-emacs-version evi-deinstall-from-mode-line evi-mode-string boundp minor-mode-map-alist use-local-map kill-local-variable meta-prefix-char lucid19 interrupt-char evi-refresh-mode-line] 7))

(defun evi-backward-char-maybe-abort (&optional count) "\
Backup, aborting command if at beginning of input." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "È` 	 `#
GW  ! b	!)" [start count evi-minibuf-prompt nil beginning-of-line - 1 evi-abort-minibuf do-evi-backward-char] 5))

(defun evi-delete-backward-char-maybe-abort nil "\
Backup and delete previous character, aborting command if at
beginning of input." (interactive) (byte-code "` `Z	GX   b!)" [start evi-minibuf-prompt nil beginning-of-line evi-abort-minibuf delete-backward-char 1] 4))

(defun evi-scroll-page-forward (&optional count) "\
Scroll COUNT pages forward." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "È =  Z  S \"!" [count evi-reset-goal-column t nil scroll-up 1 window-height 3 *] 6))

(defun evi-scroll-page-backward (&optional count) "\
Scroll COUNT pages backward." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "È =  Z  S \"!" [count evi-reset-goal-column t nil scroll-down 1 window-height 3 *] 6))

(defun evi-scroll-text-forward (&optional count) "\
Scroll COUNT lines forward.  Default is one half of a page or the last COUNT
specified to either \\[evi-scroll-text-forward] or \\[evi-scroll-text-backward] if one was previously
given.  The position of the cursor on the screen is maintained." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code " i      S\" `T\"!S^!	!*" [evi-reset-goal-column evi-goal-column nil line-count count evi-scroll-count window-line / window-height 2 count-lines window-start scroll-up forward-line evi-move-to-column] 8))

(defun evi-scroll-text-backward (&optional count) "\
Scroll COUNT lines backward.  Default is one half of a page or the last COUNT
specified to either \\[evi-scroll-up] or \\[evi-scroll-down] if one was previously
given.  The position of the cursor on the screen is maintained." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code " i      S\" `T\"! SZ^[!	!*" [evi-reset-goal-column evi-goal-column nil line-count count evi-scroll-count window-line / window-height 2 count-lines window-start scroll-down forward-line evi-move-to-column] 9))

(defun evi-scroll-cursor-forward (&optional count) "\
Scroll COUNT lines forward.  Maintain cursor position in the file
if possible." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code " i !	!" [evi-reset-goal-column evi-goal-column nil count scroll-up 1 evi-move-to-column] 3))

(defun evi-scroll-cursor-backward (&optional count) "\
Scroll COUNT lines backward.  Maintain cursor position in the file
if possible." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code " i !	!" [evi-reset-goal-column evi-goal-column nil count scroll-down 1 evi-move-to-column] 3))

(defun evi-window-control (char &optional linenumber) "\
Position current line on the screen according to the following character.
With a prefix count, position that line." (interactive (byte-code " " [evi-character-arg] 2)) (byte-code "ƈ	 !	Y 	X 	Z! 	U/ 
 SZ! 	U; 
! 	UG 
! 	Ut 
UX  q 
Uc  q 
Un  q ! 	U 
U   
U   
U  *	U 	U  !	U 	U  !	= 	= ӂ 	= 	=  \" 	= 	=  Z !!)	!" [linenumber char count t position evi-prompted nil do-evi-goto-line 48 57 evi-read-number evi-read-command-char 46 enlarge-window window-height 43 45 shrink-window 61 0 delete-window 1 delete-other-windows 2 split-window-vertically evi-error "Invalid window op" 124 split-window-horizontally 102 110 select-window next-window 98 112 previous-window 13 72 77 / 76 recenter message ""] 25))

(defun evi-move-to-column (column) (byte-code "!l
 n?  " [column move-to-column backward-char] 3))

(defun evi-insert (&optional count) "\
Enter insert mode." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "`	!" [evi-insert-point count nil evi-enter-insert] 2))

(defun evi-insert-after (&optional count) "\
Enter insert mode after the current point." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code " !" [count nil forward-char evi-insert] 3))

(defun evi-open-after (&optional count) "\
Open a new line below the current one and enter insert mode." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code " c` 	! " [evi-insert-point count nil end-of-line 10 evi-maybe-indent evi-enter-insert evi-no-undo-boundary] 5))

(defun evi-open-before (&optional count) "\
Open a new line above the current one and enter insert mode." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "È c `!
!" [evi-insert-point t count nil beginning-of-line 10 backward-char evi-maybe-indent evi-enter-insert] 5))

(defun evi-enter-insert (count) (byte-code "\"  " [count evi-extend-continuation evi-exit-insert evi-suspend-continuation evi-insert-mode] 4))

(defun evi-insert-mode nil (byte-code "ˉm 	? !!
 ! C
) C!> ; BBCN E N BC	
D$" [evi-mode buffer-read-only evi-in-minibuf evi-keymap-list evi-input-map-map evi-minibuf-input-map evi-insert-mode-local-bindings evi-emacs-local-suppress-key-list evi-emacs-local-map evi-insert-map evi-input-map insert newline 1 backward-char evi-change-mode-id "Insert" evi-refresh-mode-line append boundp minor-mode-map-alist emacs local] 11))

(defun evi-exit-insert (&optional count) (byte-code " !n?   " [count evi-reset-goal-column t evi-maybe-kill-indentation evi-exit-input-mode backward-char evi-save-command-keys] 5))

(defun evi-exit-input-mode (&optional count) "\
Exit from an input mode." (interactive) (byte-code "ǈ ( 
`\"SV\" 	cS U)): ! " [count input-string evi-insert-point evi-mode evi-keymap-list evi-vi-keymap-list evi-in-minibuf nil ex-expand-abbrev buffer-substring 0 vi evi-change-mode-id "Vi" evi-refresh-mode-line] 5))

(defun evi-insert-mode-delete-backward-char nil "\
Backup and delete previous character, but no further than insert point." (interactive) (byte-code "`V ! !" [evi-insert-point nil delete-backward-char 1 message "Beginning of inserted text"] 3))

(defun evi-insert-mode-delete-backward-word nil "\
Backup and delete previous word, but no further than insert point." (interactive) (byte-code "`X !! ` `W b`	\")" [evi-insert-point start nil message "Beginning of inserted text" do-evi-backward-word delete-region] 5))

(defun evi-insert-mode-kill-line nil "\
Kill current line, but no further than insert point." (interactive) (byte-code "Ĉ`X !: ` 
+ HU! P!+ G!`W4 b`	\")" [evi-insert-point start evi-in-minibuf evi-minibuf-prompt nil message "Beginning of inserted text" beginning-of-line looking-at 0 91 "\\" forward-char delete-region] 7))

(defun evi-maybe-indent (&optional forward) (interactive) (byte-code "ƈ7 `!	`\")
? =1 '  )   )j3  i" [evi-auto-indent start evi-insert-mode-local-bindings indent-line-function forward evi-current-indentation nil skip-chars-forward " 	" delete-region indent-to-left-margin forward-char backward-char current-indentation indent-according-to-mode] 8))

(defun evi-maybe-kill-indentation nil (byte-code "2 	iU2 !n ` !l$ `B))
1 
@
A\")" [evi-auto-indent evi-current-indentation region start skip-chars-backward " 	" skip-chars-forward delete-region] 5))

(defun evi-newline nil "\
Insert a newline, and indent to the current indentation level.
Kills indentation on current line if the line is otherwise empty." (interactive) (byte-code " `c b ))" [start nil ex-expand-abbrev 10 evi-maybe-indent evi-maybe-kill-indentation] 4))

(defun evi-forward-indent nil "\
Move forward to the next indentation level, defined by shiftwidth." (interactive) (byte-code "ňi

\"Z\\!`)`Z!- i	W- c 	V7 !	iZ\"+" [start-column target-column evi-shift-width backup-point indent-tabs-mode nil % skip-chars-backward " " delete-backward-char 9 1 insert-char 32] 8))

(defun evi-calc-backward-indent nil (byte-code "i\"
U  
)`	Z]\"iZ)	^+" [start-column offset toffset evi-shift-width furthest % 0 skip-chars-backward " 	"] 6))

(defun evi-backward-indent nil "\
Move backward to the previous indentation level, defined by shiftwidth." (interactive) (byte-code " \"" [nil backward-delete-char-untabify evi-calc-backward-indent] 4))

(defun evi-replace-mode-backward-indent nil "\
Move backward to the previous indentation level, defined by shiftwidth." (interactive) (byte-code "È`X !+  	
V  ǉb* 
	Z`	Zb)" [evi-insert-point offset evi-replaced-string-index nil message "Beginning of replaced text" evi-calc-backward-indent 0] 4))

(defun evi-quoted-insert nil (interactive) (byte-code " c" [nil evi-read-char] 2))

(defun evi-replace nil "\
Enter replace mode." (interactive) (byte-code "! dS!" [evi-mode nil replace evi-extend-continuation evi-exit-replace evi-suspend-continuation evi-replace-mode] 4))

(defvar evi-replaced-string nil)

(defvar evi-replaced-string-index nil)

(defun evi-replace-mode (max-replace-position) (byte-code "  	\"`ˉ! D" [evi-replace-max max-replace-position evi-insert-point evi-replaced-string evi-replaced-string-index evi-keymap-list evi-input-map-map evi-replace-map make-marker set-marker "" 0 evi-change-mode-id "Replce" evi-refresh-mode-line] 6))

(defun evi-switch-to-insert nil (byte-code "\" " [evi-replace-max nil set-marker evi-insert-mode] 3))

(defun evi-exit-replace nil (byte-code "=  S 	
GW( ```
G	Z\\\"
	O!b)=1  ŉ n?@  K \"ȉ " [evi-mode evi-replaced-string-index evi-replaced-string start evi-overstruck-char nil evi-replace-max evi-reset-goal-column t insert evi-exit-insert delete-region insert-before-markers change evi-exit-change-mode evi-exit-input-mode backward-char set-marker evi-save-command-keys] 9))

(defun evi-self-replace nil "\
Replace character under cursor with the command character." (interactive) (byte-code "ƈ`Y gU 	!! I 
GU' g!P
T`	!`ZVH TT`\"G) " [evi-replace-max last-command-char evi-replaced-string-index evi-replaced-string start evi-insert-point nil 10 evi-push-macro char-to-string evi-switch-to-insert evi-replace-one-char 1 buffer-substring evi-no-undo-boundary] 8))

(defun evi-replace-one-char (char) (byte-code "``T\"!   `	U  
@@IÉU* U2  4 c" [evi-overstruck-char evi-replace-max buffer-undo-list nil char delete-region boundp 0 10 13 evi-newline] 5))

(defun evi-replace-mode-delete-backward-char nil "\
Backup to previous character, undoing last replacement, but no further
than insert point." (interactive) (byte-code "`X !  	S" [evi-insert-point evi-replaced-string-index nil message "Beginning of replaced text" backward-char] 4))

(defun evi-replace-mode-delete-backward-word nil "\
Backup and delete previous word, but no further than insert point." (interactive) (byte-code "È`X !$ ` `W b
	`ZZ)" [evi-insert-point start evi-replaced-string-index nil message "Beginning of replaced text" do-evi-backward-word] 5))

(defun evi-replace-mode-kill-line nil "\
Kill current line, but no further than insert point." (interactive) (byte-code "ň`X !9 ` 
+ HU! P!+ G!`W4 bʉ)" [evi-insert-point start evi-in-minibuf evi-minibuf-prompt evi-replaced-string-index nil message "Beginning of replaced text" beginning-of-line looking-at 0 91 "\\" forward-char] 6))

(defun evi-replace-char (char &optional count) "\
Replace the following COUNT characters with CHAR." (interactive (byte-code " " [evi-character-arg] 2)) (byte-code "Ĉƍ !E   V) 	!S U)	U8 	U=  n?E  É " [count char evi-reset-goal-column t nil abort (byte-code "$" [count evi-motion-command do-evi-forward-char horizontal to-end] 5) evi-error "Can't replace that many characters" evi-exchange-point-and-mark 1 0 evi-replace-one-char 10 13 evi-maybe-kill-indentation backward-char evi-save-command-keys] 7))

(defun evi-toggle-case (&optional count) "\
Toggle the case of the following COUNT characters." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "ň$`	ZVH  g
Y\" 
X- ``T\"> 
Y6 
X> ``T\")S U))!ĉ " [count evi-mark char evi-reset-goal-column t nil evi-motion-command do-evi-forward-char horizontal to-end 0 backward-char 97 122 upcase-region 65 90 downcase-region evi-fixup-cursor evi-save-command-keys] 7))

(defun evi-change (&optional count) "\
Change operator." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!!\"" [count nil evi-extend-continuation evi-operator-after-after evi-push-continuation evi-change-internal evi-operator-command to-end] 5))

(defun evi-change-internal nil (byte-code "!  	`V) `	U\" `	\" T 	Sf`	b	S	\"c!A AAb)͉! 	!" [t evi-mark evi-overstruck-char here buffer-undo-list evi-mode evi-copy-region-to-registers evi-exchange-point-and-mark end-of-line delete-region evi-insert 36 boundp change evi-extend-continuation evi-exit-replace evi-suspend-continuation evi-replace-mode] 11))

(defun evi-exit-change-mode nil (byte-code "!	 `W; `ZS
=! @?! A`!\"\"!: @@	I)" [evi-replace-max overstrike-offset evi-emacs-version buffer-undo-list nil evi-overstruck-char marker-position lucid19 delete-region set-marker boundp] 8))

(defun evi-delete (&optional count) "\
Delete operator." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!!\"" [count nil evi-extend-continuation evi-operator-after-after evi-delete-internal evi-operator-command to-next] 5))

(defun evi-delete-internal nil (byte-code "! `	U !% 
=! `	T\"% `	\"
=1 ̂2 !" [t evi-mark evi-region-shape evi-copy-region-to-registers evi-exchange-point-and-mark message "Nothing deleted" rectangle delete-rectangle delete-region evi-fixup-cursor chars horizontal vertical] 8))

(defun evi-yank (&optional count) "\
Yank operator." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!`\"\"" [count nil evi-extend-continuation evi-operator-after-after evi-yank-internal evi-operator-command to-next] 5))

(defun evi-yank-internal (start) (byte-code "!	`U !
b" [nil evi-mark start evi-copy-region-to-registers message "Nothing to yank"] 3))

(defun evi-put-after (&optional register-number register-append count) "\
Put back yanked or deleted text after cursor." (interactive (byte-code " " [evi-register-args] 2)) (byte-code "ǈ	
 H A=B  m?  & V9 @cS' U))| nG l?M  S Vt A=g @ck @!ST U)  
 
!\" !)Ɖ " [register evi-registers register-number evi-register-unnamed count evi-reset-goal-column t nil lines end-of-line forward-char 1 0 chars insert-rectangle backward-char message "Nothing in register %c" evi-register-name "No text to put" evi-save-command-keys] 10))

(defun evi-put (&optional register-number register-append count) "\
Put back yanked or deleted text." (interactive (byte-code " " [evi-register-args] 2)) (byte-code "ǈ	
 Hk A=:   V1 @cS U))h ? V` A=S @cW @!S@ U) { 
x 
!\"{ !)Ɖ " [register evi-registers register-number evi-register-unnamed count evi-reset-goal-column t nil lines beginning-of-line 1 0 chars insert-rectangle backward-char message "Nothing in register %c" evi-register-name "No text to put" evi-save-command-keys] 8))

(defun evi-shift-right (&optional count) "\
Shift right operator." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!\"\"" [count nil evi-extend-continuation evi-operator-after-after evi-shift-internal 1 evi-operator-command whole-lines] 5))

(defun evi-shift-left (&optional count) "\
Shift left operator." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!\"\"" [count nil evi-extend-continuation evi-operator-after-after evi-shift-internal -1 evi-operator-command whole-lines] 5))

(defun evi-shift-internal (direction) (byte-code "`U ! `	
\"#b!" [evi-mark evi-shift-width direction message "Nothing shifted" indent-rigidly * skip-chars-forward " 	"] 7))

(defun evi-indent (&optional count) "\
Indent region." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!!\"" [count nil evi-extend-continuation evi-operator-after-after evi-indent-internal evi-operator-command whole-lines] 5))

(defun evi-indent-internal nil (byte-code "`U ! `#b!" [evi-mark nil message "Nothing indented" indent-region skip-chars-forward " 	"] 5))

(defun evi-shell-filter (&optional count) "\
Filter region thru shell command." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "`\"\"" [count nil evi-push-continuation evi-shell-filter2 evi-operator-command whole-lines] 4))

(defun evi-shell-filter2 (start) (byte-code "!\"!" [start evi-extend-continuation evi-operator-after-after evi-filter-internal evi-read-string "!"] 4))

(defun evi-filter-internal (start) (byte-code "\" 	 ! 
`$b" [evi-minibuf-contents evi-last-shell-command evi-mark t start string= "!" evi-error "No previous shell command to substitute for !" shell-command-on-region] 7))

(defun evi-send-to-process (&optional count) "\
Send region to emacs process buffer." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "`\"\"" [count nil evi-push-continuation evi-send-to-process2 evi-operator-command to-next] 4))

(defun evi-send-to-process2 (start) (byte-code "!\"!" [start evi-extend-continuation evi-operator-after-after evi-to-process-internal evi-read-string "*"] 4))

(defun evi-to-process-internal (start) (byte-code "\" 	 ! 	
`#b	BB" [evi-minibuf-contents evi-process-buffer evi-mark start evi-delayed-buffer-change-request string= "*" evi-error "No previous process to substitute for *" send-region other (progn (goto-char (process-mark (get-buffer-process evi-process-buffer))) (evi-insert))] 6))

(defun evi-loop-over-lines-in-region (&optional count) "\
Execute a sequence of operations on every line in a region." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "!\"" [count nil evi-push-continuation evi-loop-over-lines2 evi-operator-command to-end] 4))

(defun evi-loop-over-lines2 nil (byte-code "!!!" [evi-extend-continuation evi-operator-after-after evi-loop-lines-internal evi-read-string "[{"] 4))

(defun evi-loop-lines-internal nil (byte-code "  \"b $)" [evi-last-command-keys nil evi-prefix-count ending-mark evi-mark evi-minibuf-contents set-marker make-marker point-marker beginning-of-line evi-push-macro evi-loop-lines-internal2] 9))

(defun evi-loop-lines-internal2 (macro ending-mark) (byte-code "  `!!!%!`!W' 		$/ \"!" [ending-mark macro nil end-of-line forward-char evi-db concat "{" prin1-to-string "," marker-position "}" evi-push-macro evi-loop-lines-internal2 set-marker evi-fixup-cursor vertical] 13))

(defun evi-operator-command (count context) (byte-code "D\"
!BB	EB!" [evi-keymap-list evi-context context evi-prefix-count-multiplier count evi-prefix-count nil evi-param-map evi-map-map evi-motion-map evi-push-continuation evi-operator-after quote evi-make-local-keymap (((char-to-string last-command-char) evi-whole-lines)) param map evi-prompt] 6))

(defun evi-operator-after (old-keymap-list) (byte-code "	É " [evi-keymap-list old-keymap-list evi-context nil evi-prefix-count-multiplier evi-pop-continuation] 2))

(defun evi-operator-after-after nil (byte-code " " [evi-reset-goal-column t evi-save-command-keys] 2))

(defun evi-join-lines (&optional count) "\
Join together COUNT + 1 lines, supplying appropriate whitespace." (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "` S]Vl   + 	$ ˉc  `S!`\"	? `h\"R h\"R g\"c hUa Ƃb \"S U)	b*ŉ " [starting-point ending-point nil count evi-reset-goal-column t 2 1 0 end-of-line evi-eobp -1 forward-char delete-region skip-chars-forward " 	" /= 32 9 41 insert-char 46 evi-save-command-keys] 13))

(defun evi-exchange-point-and-mark nil (byte-code "	`b)" [temp evi-mark] 2))

(defun evi-expand-region-to-lines (context) (byte-code "    m =?  ǉ" [context evi-region-shape evi-exchange-point-and-mark beginning-of-line end-of-line to-end forward-char lines] 7))

(defun evi-normalize-region nil (byte-code "l.  `V b!n).    m?*  ǉ" [evi-mark evi-region-shape beginning-of-line skip-chars-backward " 	" evi-exchange-point-and-mark forward-char lines] 8))

(defun evi-fixup-cursor (direction) (byte-code "=B 	=& m o?  l n?#  B m, o?7   B l= n?B  " [evi-mode direction vi horizontal backward-char beginning-of-line] 6))

(defun evi-motion-command (move-function direction count context &optional arg) (byte-code "
 `% 
= 
=\"  iŉ% Ɖ6 
$< 
#m `	WI  	=T =] !j ҉
=j  q 	!" [context evi-mark move-function evi-reset-goal-column evi-goal-column nil t arg count direction evi-region-shape do-evi-next-line do-evi-previous-line funcall evi-exchange-point-and-mark vertical whole-lines evi-expand-region-to-lines chars to-next evi-normalize-region evi-fixup-cursor] 7))

(evi-defmotion horizontal evi-forward-char (&optional count context) "Move right COUNT characters on the current line." (let ((here (point))) (end-of-line) (if (< (or count 1) (- (point) here)) (goto-char (+ here (or count 1))))) (and (eolp) (not context) (evi-error "End of line")))

(evi-defmotion horizontal evi-backward-char (&optional count context) "Move left COUNT characters on the current line." (let ((here (point))) (beginning-of-line) (if (< (1- (or count 1)) (- here (point))) (goto-char (- here (1- (or count 1)))))) (if (bolp) (evi-error "Beginning of line") (backward-char)))

(evi-defmotion vertical evi-next-line (&optional count context) "Go to ARGth next line." (evi-next-line-internal (or count 1)) (if (null context) (progn (evi-adjust-scroll-up) (move-to-column evi-goal-column))))

(evi-defmotion vertical evi-beginning-of-next-line (&optional count context) "Go to beginning of ARGth next line." (evi-next-line-internal (or count 1)) (if (null context) (evi-adjust-scroll-up)) (skip-chars-forward " 	"))

(defun evi-next-line-internal (count) (byte-code "`
!m?! 
U! b
U ǂ  !*" [starting-point offset count forward-line 0 evi-error 1 "Last line in buffer" "Not that many lines left in buffer"] 4))

(defun evi-adjust-scroll-up nil (byte-code " `T\" S` Y  		\"\\W  !*" [window-line window-height count-lines window-start window-end / 3 recenter -1] 9))

(evi-defmotion vertical evi-previous-line (&optional count context) "Go to ARGth previous line." (evi-previous-line-internal (or count 1)) (if (null context) (progn (evi-adjust-scroll-down) (move-to-column evi-goal-column))))

(evi-defmotion vertical evi-beginning-of-previous-line (&optional count context) "Go to beginning of ARGth previous line." (evi-previous-line-internal (or count 1)) (if (null context) (evi-adjust-scroll-down)) (back-to-indentation))

(defun evi-previous-line-internal (count) (byte-code "`
[!	\" b
U Ȃ !*" [starting-point offset count forward-line /= 0 evi-error 1 "First line in buffer" "Not that many lines left in buffer"] 5))

(defun evi-adjust-scroll-down nil (byte-code "` W `T \" S	\"W !*" [window-line window-height window-start count-lines / 3 recenter 0] 8))

(evi-defmotion vertical evi-goto-line (&optional count context) "Go to line number LINE, or to end of file if no count specified." (evi-push-context) (ex-goto-line count))

(evi-defmotion vertical evi-goto-top-of-window (&optional offset context) "Go to the top line of the window.  With an arg, OFFSET, goes to the
OFFSET'th line of the window." (move-to-window-line (1- (or offset 1))) (or context (skip-chars-forward " 	")))

(evi-defmotion vertical evi-goto-middle-of-window (&optional offset context) "Go to the middle line of the window." (move-to-window-line (/ (window-height) 2)) (or context (skip-chars-forward " 	")))

(evi-defmotion vertical evi-goto-bottom-of-window (&optional offset context) "Go to the bottom line of the window.  With an arg, OFFSET, goes to the
OFFSET'th line from the bottom of the window." (move-to-window-line (- (1- (window-height)) (or offset 1))) (or context (skip-chars-forward " 	")))

(evi-defmotion horizontal evi-goto-column (&optional column context) "Go to column COLUMN, or as close to that column as possible." (move-to-column (1- (or column 1))))

(evi-defmotion vertical evi-whole-lines (&optional count context) "Go ARG - 1 lines forward." (evi-next-line-internal (1- (or count 1))))

(evi-defmotion horizontal evi-beginning-of-line (&optional count context) "Go to beginning of line." (beginning-of-line))

(evi-defmotion horizontal evi-goto-indentation (&optional count context) "Go to beginning of indented text on current line." (beginning-of-line) (back-to-indentation))

(evi-defmotion horizontal evi-end-of-line (&optional count context) "Go to end of line." (evi-next-line-internal (1- (or count 1))) (end-of-line) (setq evi-goal-column 1000000 evi-reset-goal-column nil))

(defun evi-eobp nil (byte-code "d`ZW" [3] 2))

(evi-defmotion horizontal evi-forward-word (&optional count context) "Move to the beginning of the COUNTth next word." (evi-forward-word-internal evi-word (or count 1) context))

(evi-defmotion horizontal evi-forward-Word (&optional count context) "Move to the beginning of the COUNTth next white-space delimited word." (evi-forward-word-internal evi-Word (or count 1) context))

(defun evi-forward-word-internal (pattern count context) (byte-code "?   ! 	S
!! 	T
	$< =?< 
 `)#d =] 	VN 
!X !bZ  a !bj mj  " [context count pattern nil evi-eobp evi-error "End of buffer" looking-at re-search-forward limit to-next end-of-line to-end 0 match-end forward-char match-beginning backward-char] 12))

(evi-defmotion horizontal evi-end-of-word (&optional count context) "Move to the end of the COUNTth next word." (evi-end-of-word-internal evi-word (or count 1) context))

(evi-defmotion horizontal evi-end-of-Word (&optional count context) "Move to the end of the COUNTth next whitespace delimited word." (evi-end-of-word-internal evi-Word (or count 1) context))

(defun evi-end-of-word-internal (pattern count context) (byte-code "?   !  	$/ !) ˂* Zb5 m5  " [context pattern nil count evi-eobp evi-error "End of buffer" forward-char re-search-forward limit match-end 0 1 backward-char] 8))

(evi-defmotion horizontal evi-backward-word (&optional count context) "Move to the beginning of the COUNTth previous word." (evi-backward-word-internal evi-word (or count 1)))

(evi-defmotion horizontal evi-backward-Word (&optional count context) "Move to the beginning of the COUNTth previous whitespace delimited word." (evi-backward-word-internal evi-Word (or count 1)))

(defun evi-backward-word-internal (pattern count) (byte-code "o !VU 	#I 	!!	!4 !U4 o?=  \" ?E  *L ΉS
 U)" [count pattern nil end at-beginning evi-error "Beginning of buffer" 0 re-search-backward limit looking-at match-end backward-char forward-char -1] 11))

(defconst evi-sentence-beginning "\\([.?!][]\"')]*\\([	
]\\| [ 	
]\\)\\|^[ 	]*
\\|\\`\\)[ 	
]*[^ 	
]")

(defconst evi-sentence-ending "\\([.?!][]\"')]*\\([	
]\\| [ 	
]\\)\\|^[ 	]*$\\)")

(defconst evi-paragraph-beginning "\\(^
\\|\\`\\)[ 	
]*[^ 	
]")

(defconst evi-paragraph-beginning-mod "\\(^[ 	]*
\\|\\`\\)[ 	
]*[^ 	
]")

(defconst evi-paragraph-ending "[ 	
]*[^ 	
]
$")

(defconst evi-paragraph-ending-mod "^[ 	]*$")

(defconst evi-section-beginning "^\\({\\|\\.\\(NH\\|SH\\|H\\|HU\\|nh\\|sh\\)[ 	
]\\)")

(defconst evi-section-ending "[ 	
]*
\\(}\\|\\.\\(NH\\|SH\\|H\\|HU\\|nh\\|sh\\)[ 	
]\\)")

(defun evi-not-at (pattern &optional limit) (byte-code "`	
# !\"b )" [start pattern limit t re-search-backward /= match-end 0] 5))

(evi-defmotion horizontal evi-forward-sentence (&optional count context) "Move to the beginning of the COUNT'th next sentence." (and (not context) (evi-eobp) (evi-error "End of buffer")) (forward-char) (and (eq context (quote to-next)) (evi-not-at evi-sentence-beginning) (setq context (quote to-end))) (if (re-search-forward evi-sentence-beginning nil (quote limit) (- (or count 1) (if context 1 0))) (if context (if (eq context (quote to-end)) (if (re-search-forward evi-sentence-ending nil (quote limit)) (skip-chars-backward " 	
")) (if (re-search-forward evi-sentence-beginning (save-excursion (re-search-forward evi-paragraph-ending nil (quote limit)) (1- (match-beginning 0))) (quote limit)) (backward-char))) (backward-char))))

(evi-defmotion horizontal evi-backward-sentence (&optional count context) "Move to the beginning of the COUNT'th previous sentence." (if (bobp) (evi-error "Beginning of buffer")) (skip-chars-backward " 	
") (if (re-search-backward evi-sentence-beginning nil (quote limit) (or count 1)) (goto-char (1- (match-end 0)))))

(evi-defmotion horizontal evi-forward-paragraph (&optional count context) "Move to the beginning of the COUNT'th next paragraph." (and (not context) (evi-eobp) (evi-error "End of buffer")) (if (not evi-modified-paragraph) (if (re-search-forward evi-paragraph-ending nil (quote limit) (or count 1)) (goto-char (match-end 0))) (forward-char) (and (eq context (quote to-next)) (evi-not-at evi-paragraph-beginning-mod) (setq context (quote to-end))) (if (re-search-forward evi-paragraph-beginning-mod nil (quote limit) (- (or count 1) (if (eq context (quote to-end)) 1 0))) (if (eq context (quote to-end)) (if (re-search-forward evi-paragraph-ending-mod nil (quote limit)) (goto-char (1- (match-beginning 0)))) (if context (beginning-of-line)) (backward-char)))))

(evi-defmotion horizontal evi-backward-paragraph (&optional count context) "Move to the beginning of the COUNT'th previous paragraph." (if (bobp) (evi-error "Beginning of buffer")) (if evi-modified-paragraph (if (re-search-backward evi-paragraph-beginning-mod nil (quote limit) (or count 1)) (goto-char (1- (match-end 0)))) (if (re-search-backward evi-paragraph-beginning nil (quote limit) (or count 1)) (goto-char (match-beginning 0)))))

(evi-defmotion horizontal evi-forward-section (&optional count context) "Move to the beginning of the COUNT'th next section." (and (not context) (evi-eobp) (evi-error "End of buffer")) (or context (evi-push-context (point))) (let ((start (point))) (skip-chars-forward "^ 	
") (or (eobp) (forward-char)) (and (eq context (quote to-next)) (evi-not-at evi-section-beginning start) (setq context (quote to-end)))) (if (re-search-forward evi-section-beginning nil (quote limit) (- (or count 1) (if (eq context (quote to-end)) 1 0))) (if (eq context (quote to-end)) (if (re-search-forward evi-section-ending nil (quote limit)) (or (eq (preceding-char) 125) (goto-char (match-beginning 0)))) (goto-char (match-beginning 0)) (if context (backward-char)))))

(evi-defmotion horizontal evi-backward-section (&optional count context) "Move to the beginning of the COUNT'th previous section." (if (bobp) (evi-error "Beginning of buffer")) (or context (evi-push-context (point))) (re-search-backward evi-section-beginning nil (quote limit) (or count 1)))

(defun evi-region-arbitrary nil "\
Define region bounded by mark and point (containing point)." (interactive) (byte-code "`W
   ŉ" [evi-mark evi-region-shape nil evi-exchange-point-and-mark forward-char chars] 4))

(defun evi-region-mouse nil "\
Define region bounded by last mouse selection." (interactive) (byte-code " `W   Ɖ" [evi-mark evi-region-shape nil mark evi-exchange-point-and-mark forward-char chars] 5))

(defun evi-region-rectangle nil "\
Define region as rectangle bounded by mark and point (containing point)." (interactive) (byte-code "`W
  ĉ" [evi-mark evi-region-shape nil evi-exchange-point-and-mark rectangle] 3))

(defun evi-region-rows (context) "\
Define region as rows bounded by mark and point (containing point)." (interactive (byte-code " " [evi-context-arg] 2)) (byte-code "`W
  	!" [evi-mark evi-context nil evi-exchange-point-and-mark evi-expand-region-to-lines] 3))

(defun evi-region-columns nil "\
Define region as columns bounded by mark and point (containing point)." (interactive) (byte-code "Ĉ`W
  bi)i	dbl!   `
\\b*ȉ" [evi-mark start-col end-col evi-region-shape nil evi-exchange-point-and-mark backward-char beginning-of-line rectangle] 5))

(evi-defmotion horizontal evi-search-forward (&string "/" string &optional count context) "Search forward for the ARGth occurence of a pattern.  A null string will
repeat the previous search." (evi-do-vi-search t string (or count 1)))

(evi-defmotion horizontal evi-search-backward (&string "?" string &optional count context) "Search backward for the ARGth occurence of a pattern.  A null string will
repeat the previous search." (evi-do-vi-search nil string (or count 1)))

(defun evi-do-vi-search (search-forward search-spec count) (byte-code "p	q 
 ˂ #eb  q\"- @ 
#C !VP !Z WZ [!*)" [ex-user-buffer ex-work-space search-forward search-spec string offset evi-search-pattern evi-search-forward count erase-buffer insert 47 63 "
" ex-scan-regular-expression ex-scan-line-offset string= "" evi-do-search evi-error "No previous search pattern" 0 evi-next-line-internal evi-previous-line-internal] 10))

(evi-defmotion horizontal evi-search-next (&optional count context) "Search for the next ARGth occurence of the previous search pattern." (if evi-search-pattern (evi-do-search evi-search-forward evi-search-pattern (or count 1)) (evi-error "No previous search pattern")))

(evi-defmotion horizontal evi-search-next-reverse (&optional count context) "Search for the next ARGth occurence of the previous search pattern
but look in the opposite direction." (let ((evi-search-forward (not evi-search-forward))) (do-evi-search-next count context)))

(defun evi-do-search (search-forward search-string count) (byte-code "	` \" \"! 
!!bD 
bV/ ΂0 9 ЂB A тB P!*" [case-fold-search evi-ignore-case starting-point search-forward search-string count evi-search-wraparound evi-search-forward-count evi-search-backward-count evi-push-context match-beginning 0 evi-error 1 "Nth occurrence not found" "Pattern not found" "" " before end of file" " before beginning of file"] 7))

(defun evi-search-forward-count (string count) (byte-code "V0  	# 	S\"- - eb	#- 	S\"1 Ç" [count string nil t evi-search-wraparound 0 forward-char re-search-forward evi-search-forward-count] 7))

(defun evi-search-backward-count (string count) (byte-code "V- 	# 	S\"* * db	#* 	S\". Ç" [count string nil t evi-search-wraparound 0 re-search-backward evi-search-backward-count] 6))

(evi-defmotion horizontal evi-find-character (&char char &optional count context) "Search for CHAR on the current line.  With COUNT find the COUNT'th occurance." (setq evi-find-character char evi-find-forward t evi-find-up-to nil) (evi-find-character-internal (or count 1) context))

(evi-defmotion horizontal evi-find-char-backwards (&char char &optional count context) "Search backwards for CHAR on the current line.  With COUNT find the
COUNT'th occurance." (setq evi-find-character char evi-find-forward nil evi-find-up-to nil) (evi-find-character-backwards-internal (or count 1) context))

(evi-defmotion horizontal evi-find-character-before (&char char &optional count context) "Search for CHAR on the current line and leave the cursor on the character
before it.  With COUNT find the COUNT'th occurance." (setq evi-find-character char evi-find-forward t evi-find-up-to t) (evi-find-character-internal (or count 1) context))

(evi-defmotion horizontal evi-find-char-backwards-after (&char char &optional count context) "Search backwards for CHAR on the current line and leave the cursor on
the character after it.  With COUNT find the COUNT'th occurance." (setq evi-find-character char evi-find-forward nil evi-find-up-to t) (evi-find-character-backwards-internal (or count 1) context))

(evi-defmotion horizontal evi-find-next-character (&optional count context) "Search for the next COUNT'th occurence of the previous search character." (if evi-find-character (if evi-find-forward (evi-find-character-internal (or count 1) context) (evi-find-character-backwards-internal (or count 1) context)) (evi-error "No previous search character")))

(evi-defmotion horizontal evi-find-next-character-reverse (&optional count context) "Search for the next COUNT'th occurence of the previous search character
in the opposite direction." (let ((evi-find-forward (not evi-find-forward))) (do-evi-find-next-character count context)))

(defun evi-find-character-internal (count context) (byte-code " 
! `)$   $  !)-  " [case-fold-search nil evi-find-character t count evi-find-up-to context forward-char search-forward char-to-string end-of-line backward-char evi-error "No more occurences on this line"] 9))

(defun evi-find-character-backwards-internal (count context) (byte-code "
! `)$ !)  " [case-fold-search nil evi-find-character t count evi-find-up-to search-backward char-to-string beginning-of-line evi-error "No more occurences on this line" forward-char] 7))

(evi-defmotion horizontal evi-paren-match (&optional count context) "Move cursor to matching parenthesis, brace or bracket." (let ((end-point (save-excursion (end-of-line) (point)))) (if (re-search-forward "[][(){}]" end-point t) (progn (backward-char) (if (looking-at "[({[]") (progn (forward-sexp 1) (or context (backward-char))) (progn (forward-char) (if context (setq evi-mark (1+ evi-mark))) (backward-sexp 1)))) (evi-error "Nothing on rest of line to balance"))))

(defvar evi-command-keys-length 256)

(defvar evi-command-keys (make-string evi-command-keys-length 0) "\
The keystrokes for the current command.")

(defvar evi-last-command-keys nil "\
Command keys for the last complete vi command.")

(defvar evi-command-keys-index 0)

(defvar evi-prompt nil)

(defun evi-add-key (k) (byte-code "	Y 	\\
\"P
IT!P" [evi-command-keys-index evi-command-keys-length evi-command-keys k evi-prompt 256 make-string 0 char-to-string] 4))

(defun evi-lose-key nil (byte-code "V
 S" [evi-command-keys-index 0] 2))

(defun evi-erase-keys nil (byte-code "" [evi-command-keys-index evi-prompt nil 0] 2))

(defun evi-copy-keys nil (byte-code "	O" [evi-command-keys evi-command-keys-index 0] 3))

(defun evi-keys-description nil (byte-code " #" [mapconcat single-key-description evi-copy-keys ""] 5))

(defun evi-prompt-keys-description nil (byte-code "#" [evi-prompt mapconcat single-key-description ""] 4))

(defun evi-save-command-keys nil (byte-code " 
" [evi-last-command-keys evi-last-prefix-count evi-prefix-count evi-hidden-repeat-count evi-last-register-spec evi-register-spec evi-copy-keys 0] 3))

(defun evi-repeat nil "\
Repeat last modifying command." (interactive) (byte-code "ǈ  	
 
 T!#" [evi-prefix-count evi-last-prefix-count evi-register-spec evi-last-register-spec evi-repeat-count evi-hidden-repeat-count evi-last-command-keys nil evi-push-continuation evi-repeat-continuation evi-push-macro evi-repeat-after] 5))

(defun evi-repeat-continuation nil (byte-code "" [nil] 1))

(defun evi-repeat-after (command-keys) (byte-code "	ĉ" [evi-last-command-keys command-keys evi-hidden-repeat-count evi-repeat-count 0] 2))

(defun evi-prompt-repeat nil "\
Print last modifying command." (interactive) (byte-code "	\"!)" [command evi-last-command-keys nil evi-read-string "Repeat: " evi-execute-macro] 4))

(defun evi-read-number (prefix-value) (byte-code " Y X 	\"Z\\!! !	)" [char prefix-value evi-read-command-char 48 57 evi-read-number * 10 evi-unread-command-char] 6))

(defun evi-prefix-digit nil "\
Prefix count." (interactive) (byte-code "  \"	Z\\!" [evi-prefix-count last-command-char nil evi-lose-key * 0 10 48 evi-push-continuation evi-prompt] 5))

(defun evi-digit-or-beginning-of-line nil (interactive) (byte-code "    " [evi-prefix-count nil evi-prefix-digit evi-beginning-of-line] 3))

(defun evi-adjust-count nil (byte-code " 	
 \" 	" [evi-prefix-count-multiplier evi-prefix-count * 1] 3))

(defun evi-prefix-register nil "\
Prefix register." (interactive) (byte-code "    !Y X?B)!" [char evi-register-spec nil evi-lose-key evi-prompt evi-read-command-char evi-register-number 97 122 evi-push-continuation] 8))

(defun evi-register-number (register-name) (byte-code "Y	 X Z\\^ Y X( Z\\^ Y1 XA 	Z
#\"^ =K ^ =[ X !^ !" [register-name evi-digit-register evi-repeat-count evi-register-unnamed evi-last-macro-register t 97 122 10 65 90 49 57 % + 48 9 94 64 evi-error "No previous macro register specified" "Invalid register name"] 5))

(defun evi-register-name (register-number) (byte-code "V Z\\ \\" [register-number 9 97 10 49] 3))

(defun evi-copy-region-to-registers (number-register-also) (byte-code "	= 
`T\" 
`\"\"5 	BIU/ ̂2 S)" [region evi-region-shape evi-mark evi-register-spec number-register-also evi-registers evi-digit-register rectangle extract-rectangle buffer-substring evi-copy-region-to-register 0 8] 7))

(defun evi-copy-region-to-register (region register-spec) (byte-code "	@
=? 
BI	9 	A  =?5 H@PAB)8 BI)" [register-number register-spec evi-register-unnamed evi-registers region evi-region-shape register rectangle] 4))

(defun evi-register-string (count) (interactive (byte-code " " [evi-count-arg] 2)) (byte-code "\"!" [count nil evi-extend-continuation evi-register-string-after evi-read-string "\""] 3))

(defun evi-register-string-after (count) (byte-code "ŉ	
 B\"" [evi-region-shape evi-minibuf-contents evi-register-spec evi-register-unnamed nil chars evi-copy-region-to-register] 4))

(defun evi-register-char (char &optional count) (interactive (byte-code " " [evi-character-arg] 2)) (byte-code "!!" [char nil evi-register-string char-to-string] 3))

(defun evi-buffer-name nil (interactive) (byte-code " !" [nil evi-register-string buffer-name] 3))

(defun evi-undo nil "\
Undo previous change." (interactive) (byte-code " 	 !  !" [evi-current-macro evi-in-minibuf nil message "undo!" evi-undo-start evi-undo-one-change evi-fixup-cursor vertical] 5))

(if (boundp (quote buffer-undo-list)) (defun evi-undo-line nil "Undo all changes to this line." (interactive) (evi-undo-start) (evi-undo-one-line) (evi-fixup-cursor (quote vertical))))

(defun evi-undo-start nil (byte-code " !  @? A	 ! !" [pending-undo-list undo-start boundp buffer-undo-list undo-more 1] 5))

(defun evi-undo-more nil "\
Continue undoing previous changes." (interactive) (byte-code "!% !  	 ! \" !3 0 	0 ! !" [evi-current-macro evi-in-minibuf nil boundp buffer-undo-list pending-undo-list message "undo more!" evi-undo-one-change evi-error "No previous undo to continue" evi-fixup-cursor vertical] 9))

(defun evi-undo-one-change nil (byte-code " !  ?  )" [modified evi-reset-goal-column t buffer-modified-p undo-more 1 delete-auto-save-file-if-necessary] 6))

(defvar evi-last-undo-line-mark nil)

(if (boundp (quote buffer-undo-list)) (defun evi-undo-one-line nil (if (eq evi-last-undo-line-mark (cdr buffer-undo-list)) (evi-error "No undo for this line")) (let* ((begin (save-excursion (beginning-of-line) (point))) (end (save-excursion (end-of-line) (point))) (undo-new nil) (something-to-do nil)) (evi-enumerate-condition undo-record pending-undo-list (cond ((eq (car undo-record) t) (setq undo-new (nconc undo-new list)) nil) ((stringp (car undo-record)) (if (and (>= (cdr undo-record) begin) (<= (cdr undo-record) end)) (progn (setq end (+ end (length (car undo-record)))) (setq undo-new (nconc undo-new (list undo-record))) (setq something-to-do t) t) (progn (setq undo-new (nconc undo-new (list nil) list)) nil))) ((integerp (car undo-record)) (let* ((first (car undo-record)) (second (cdr undo-record)) (begin2 (if (< first begin) begin first)) (end2 (if (> second end) end second)) (diff (- end2 begin2))) (if (and (<= first end) (>= second begin) (/= begin2 end2)) (progn (setq undo-new (nconc undo-new (list (cons begin2 end2)))) (setq something-to-do t) (if (or (< first begin) (> second end)) (progn (nconc undo-new (list nil)) (if (< first begin) (nconc undo-new (list (cons first begin)))) (if (> second end) (nconc undo-new (list (cons (- end diff) (- second diff))))) (nconc undo-new (cdr list)) nil) (progn (setq end (- end diff)) t))) (progn (setq undo-new (nconc undo-new (list nil) list)) nil)))) ((eq undo-record nil) t))) (if something-to-do (let ((modified (buffer-modified-p))) (setq pending-undo-list undo-new) (undo-more 1) (or evi-current-macro evi-in-minibuf (message "Undo!")) (setq evi-last-undo-line-mark buffer-undo-list) (beginning-of-line) (and modified (not (buffer-modified-p)) (delete-auto-save-file-if-necessary))) (evi-error "No undo for this line"))) (evi-reset-goal-column)))

(defun evi-no-undo-boundary nil (byte-code "" [prefix-arg t] 2))

(defun evi-set-mark (char &optional count) "\
Mark location." (interactive (byte-code " " [evi-character-arg] 2)) (byte-code "ÈY X 	Z\\ I# =# `" [char evi-registers evi-mark nil 97 122 36 point-marker 46] 4))

(evi-defmotion horizontal evi-goto-mark-horizontal (&optional count context) "Goto a mark." (evi-goto-mark-internal (evi-read-command-char) context))

(evi-defmotion vertical evi-goto-mark-vertical (&optional count context) "Goto a mark.  If an operand, define a whole lines region." (evi-goto-mark-internal (evi-read-command-char) context) (or context (back-to-indentation)))

(defun evi-goto-mark-internal (char &optional context) (byte-code "Y	 X4 
Z\\Hp	!=?* 	!!* ` 	b)[ == =F  b[ =R  b[ =[  b" [char marker evi-registers context evi-mark 97 122 36 marker-buffer switch-to-buffer evi-push-context 96 39 evi-exchange-context 46 evi-pop-context 44 evi-unpop-context] 8))

(defun evi-push-context (&optional offset) (byte-code "	  	\"  
IU Ȃ  T)" [marker offset evi-context-ring evi-context-ring-cursor set-marker make-marker point-marker 9 0] 6))

(defun evi-pop-context nil (byte-code "U
 Â S	H" [evi-context-ring-cursor evi-context-ring 0 9] 2))

(defun evi-unpop-context nil (byte-code "U
 Â T	H" [evi-context-ring-cursor evi-context-ring 9 0] 2))

(defun evi-exchange-context nil (byte-code "	U
 Ă 	S
H
 I)" [cursor evi-context-ring-cursor evi-context-ring 0 9 point-marker] 5))

(defun evi-redraw nil "\
Redraw the display." (interactive) (byte-code "=  $ =  !$ =$  !" [evi-emacs-version nil emacs18 redraw-display emacs19 redraw-frame selected-frame lucid19 redraw-screen selected-screen] 6))

(defun evi-file-info nil "\
Give information on the file associated with the current buffer." (interactive) (byte-code "ƈ`Td^\"`d\"\\S
* & 
 \"' 
+ 3 ΂4  = Ђ> 	iT\"	\"&+" [line-number total-lines file-name buffer-file-name evi-global-directory evi-buffer-read-only nil count-lines 1 message "\"%s\"%s%s line %d of %d, column %d --%d%%--" evi-abbreviate-file-name evi-current-directory "" " [Read only]" buffer-modified-p " [Modified]" / * 100] 17))

(defun evi-abbreviate-file-name (file-name directory &optional abbrev) (byte-code "	G	SHUV GY O	\"< & - 
4 Ƃ5 \\OP= *" [length directory ends-in-slash file-name abbrev 47 0 string= "" 1 nil] 5))

(defun evi-tag nil "\
Go to the tag which is the next word in the buffer." (interactive) (byte-code "$`\"!" [evi-mark nil evi-motion-command do-evi-forward-word horizontal 1 to-end ex-tag buffer-substring] 5))

(defun evi-make-char-table nil (byte-code "\"	SX 	I ȉ	SX. 	I ˉ	SXD 	I3 ͉	SXZ 	II *" [table i make-vector 256 0 58 48 1 91 65 2 123 97 32 4] 5))

(defvar evi-char-table (evi-make-char-table))

(defun evi-is-num (c) (byte-code "	H\"U" [evi-char-table c logand 1] 3))

(defun evi-is-alpha (c) (byte-code "	H\"U" [evi-char-table c logand 2] 3))

(defun evi-is-alphanum (c) (byte-code "	H\"\"" [evi-char-table c /= logand 3 0] 4))

(defun evi-is-nonalphanum (c) (byte-code "	H\"U" [evi-char-table c logand 3 0] 3))

(defun evi-is-control-char (c) (byte-code "	H\"U" [evi-char-table c logand 4] 3))

(defun evi-is-printable (c) (byte-code "!?
 W" [c evi-is-control-char 127] 3))

(defun evi-display-and-prompt (command &optional args) (byte-code "   =  !
\"A  !! U4 U4 U= 	!@ !)*" [window wconf command args c selected-window current-window-configuration minibuffer-window select-window previous-window apply message "Hit SPACE or RET to continue, anything else to keep window" evi-read-char 10 13 32 set-window-configuration] 13))

(defun evi-display-list-and-prompt (buffer list &optional initial max-len) (byte-code "	
F\"" [buffer list initial max-len evi-display-and-prompt evi-display-list] 6))

(defun evi-display-list (buffer list &optional initial max-len) (byte-code "!q  	 	c
=\"  \"Z2 
1  Z\"eb\")ć" [buffer initial max-len list t get-buffer-create erase-buffer evi half / window-width 2 evi-insert-list-pretty display-buffer] 10))

(defun evi-insert-list-pretty (list max-len) (byte-code "	G	!^
\\ \"S\\\"
W> \"ZӉVe S\"	\"BSC U)V ԉ
	 	@Z\"@ 
jG
V 
ZOP c
\\
)	A +cSp U)." [len list max-width max-len col-width width cols rows counters nil indent count item found s evi-max-len 2 window-width / 1 0 nthcdr * "..." 10] 14))

(defun evi-max-len (list) (byte-code "	\"\")" [lengths list mapcar length apply max] 4))

(defun evi-pretty-char (c) (byte-code "! !r !\\ 	R U  ǂO U* ɂO U4 ˂O U> ͂O WK ςL \\!PY \\!Pr Un 	j ӂk Ԃr \"" [c ex-input-escapes t evi-is-printable char-to-string evi-is-control-char 10 "\\n" 13 "\\r" 9 "\\t" 27 "\\e" "\\C-" 96 64 "^" 127 "\\C-?" "^?" format "\\%03o"] 8))

(defun evi-pretty-string (s) (byte-code "#" [s mapconcat evi-pretty-char ""] 4))

(defun evi-pretty-binding (b) (byte-code "@!A: AA A!Q" [b evi-pretty-string " = "] 5))

(defvar ex-user-buffer nil)

(defvar ex-printed nil)

(defun evi-ex-command nil "\
Execute an ex command." (interactive) (byte-code " \"p$" [ex-user-buffer ex-printed nil evi-ex-map evi-ex-input-map evi-extend-continuation ex-read-command-after current-window-configuration evi-read-string ":"] 7))

(defun ex-read-command-after (wconf) (byte-code "!	!
# qed=\" eb p!$!)!" [wconf evi-minibuf-contents ex-printed nil set-window-configuration evi-do-ex-command-string "*Print*" evi-display-and-prompt lambda evi display-buffer evi-fixup-cursor vertical] 10))

(defun ex-do-completion (name start c-name c-list-fun) (byte-code "( ;# 	\" 
\"!  `\"c% c:  c)!``\\\"" [c-name name c-list-fun start string= evi-display-completions funcall delete-region " " beep " [no match]" sit-for 2 11] 10))

(defun evi-display-completions (list) (byte-code "#" [list evi-display-list " *Completions*" "Possible completions are:
"] 4))

(defun ex-scan-one-command-point nil (byte-code " ` l B`B# 	A@A\"! `B`B*" [start-of-com command t nil ex-scan-addresses ex-scan-command-name ex-scan-parameter-list] 5))

(defun ex-scan-command-point nil (byte-code " !gU    )" [res ex-scan-one-command-point skip-chars-forward " 	" 124 forward-char] 7))

(defun ex-is-completable (proto) (byte-code "=3 =3 =3 =3 =3 =3 =3 =3 =" [proto file files shell-command buffer settings command map abbrev process] 2))

(defun ex-complete nil (interactive) (byte-code "҈   @@@A!`)]
`\"	=/ 	=/ 	=g !!pqM  \"O  q)
G\\\"$+7	=  \"\"\"	
	\"$)7	= 
b!`)`V   
f= 
Tf= 
\\f=? O
\\\"


\"$)7	= 	= 	=	= \"
	=!

\"$)7	=5 \"
\"$)7c," [cmd-point type start-of-word word name odir dir cur-buffer ex-user-buffer buf-list settings-list evi-option-list cmd-list ex-commands evi-map-map evi-abbrev-list proc-list t nil beginning-of-line forward-char ex-scan-command-point skip-chars-backward "^ 	" buffer-substring file files shell-command file-name-nondirectory file-name-directory expand-file-name evi-current-directory ex-do-completion file-name-completion (lambda (c-name) (byte-code "	\"" [c-name dir file-name-all-completions] 3)) buffer mapcar list evi-filter (lambda (name) (byte-code "H\"" [name /= 0 32] 3)) buffer-name buffer-list try-completion (lambda (c-name) (byte-code "	\"" [c-name buf-list all-completions] 3)) settings skip-chars-forward "^=
" beep 110 111 2 118 car (lambda (c-name) (byte-code "	\"" [c-name settings-list all-completions] 3)) command map abbrev evi-keymap-bindings (lambda (c-name) (byte-code "	\"" [c-name cmd-list all-completions] 3)) process (lambda (x) (byte-code "!C" [x process-name] 2)) process-list (lambda (c-name) (byte-code "	\"" [c-name proc-list all-completions] 3)) 9] 35))

(defun evi-filter (pred list) (byte-code "B$ @\" 
@B\"A A*" [head nil end list pred funcall setcdr] 6))

(defun evi-do-ex-command-file (filename) (byte-code "!$ p q 
!)eb 	q+" [filename ex-user-buffer def-dir evi-interactive nil ex-work-space default-directory file-readable-p evi-current-directory erase-buffer insert-file-contents evi-do-ex-command] 6))

(defun evi-do-ex-command-string (command-string) (byte-code "p	q 
\"eb q)" [ex-user-buffer ex-work-space command-string erase-buffer insert "
" evi-do-ex-command] 4))

(defun evi-do-ex-command nil (byte-code "m?\"  	q
  !q )  " [command ex-user-buffer evi-global-directory default-directory ex-work-space ex-scan-command evi-current-directory eval forward-char] 6))

(defun ex-scan-command nil (byte-code "gU  gU    	A@@	@@	A@A	AA	?2 !!
V@ 
#\"!!d md `!!`\"\"
=v @DB 
= DB B)." [addresses command-struct number-of-addresses command-name command-prototype command-function parameter-list nil t 58 forward-char 34 end-of-line ex-scan-addresses ex-scan-command-name evi-error "Unknown ex command" ex-count-addresses "The %s command only needs %d addresses" ex-scan-parameter-list skip-chars-forward " 	" looking-at "[|
]" "garbage after end of command: `%s'" buffer-substring "^|
" skip-chars-backward 1 quote 2] 17))

(defun ex-scan-parameter-list (prototype-list completing) (byte-code "| @A@@=
 !\" @@=\"  `	<. 	@=K 	8!H 	8`	!H ÂN 	![ l[ 	!d 	Bj A\"v z B+*" [prototype-list prototype skip-white t start param recurs completing skip-chars-forward " 	" backup backward-char if ex-scan-parameter 1 2 ex-is-completable ex-scan-parameter-list] 9))

(defun ex-scan-parameter (prototype) (byte-code "?	  ; ! =!  D =.  D =; \" =D =N \" =W =a \" =p =p =z \" =   = ! =  D =  D =   = \" =   =  " [prototype nil t ex-scan-string address quote ex-scan-address register ex-scan-register file ex-scan-quoted "%#*?$[" " 	|
" buffer words "|
" rest-of-line process "
" word map abbrev regular-expression ex-scan-regular-expression regular-expression2 command ex-scan-command settings ex-scan-settings files ex-scan-files shell-command "%#" offset ex-scan-edit-offset mark ex-scan-mark] 16))

(defun ex-scan-addresses nil (byte-code "!gU  BBBBBM !B  !gU9  ! > BBBM BBBBB" [nil skip-chars-forward " 	" 37 forward-char number 1 0 dollar looking-at "[-+0-9.$^'/?]" ex-scan-address 44] 11))

(defun ex-scan-address nil (byte-code "  B" [ex-scan-linespec ex-scan-line-offset] 4))

(defun ex-scan-linespec nil (byte-code "gY X  `!	`\"!B)t =/  Bt =>  Bt =M  Bt =] !hBt =j  Bt =t  B)" [char start nil 48 57 skip-chars-forward "0-9" number string-to-int buffer-substring 46 forward-char dot 36 dollar 94 prev 39 2 mark 47 re-forward ex-scan-regular-expression 63 re-backward] 11))

(defun ex-scan-regular-expression (&optional esc-ampersand) (byte-code "!
 z  ` ? P
h!Q
Q!!l gU= gU_  
G\"Y 
Q!Y `S`\" d c !- 	`\"l?x  ," [nil start stop-chars esc-ampersand evi-search-magic skip-chars stop-pat looking-at "[|
]" forward-char "&" ".[*" "^
\\\\" char-to-string "[\\\\" "]" skip-chars-forward 92 22 /= 0 "[" delete-region "\\" buffer-substring] 16))

(defun ex-scan-line-offset nil (byte-code "!5 ` !`ZU hW+ hU' Ƃ( ɂ1 `\"!)6 ̇" [start looking-at "[0-9+-]" forward-char skip-chars-forward "0-9" 1 48 43 -1 string-to-int buffer-substring 0] 7))

(defun ex-scan-edit-offset nil (byte-code "g\"   g!   Ƈ" [nil /= 43 forward-char evi-is-num ex-scan-line-offset -1] 5))

(defun ex-define-region (addresses whole-lines default-whole-file) (byte-code "	@	A@@?  edb2 `!`
\")2 !*" [start addresses end default-whole-file evi-mark starting-point whole-lines ex-goto-address evi-expand-region-to-lines ex] 4))

(defun ex-goto-line (line) (byte-code "% `ebS!V m o?! 	b!)6 dbhU4 !6  " [line starting-point forward-line 0 evi-error "Past end of buffer" 10 -1 beginning-of-line] 5))

(defun ex-goto-address (address &optional starting-point) (byte-code "	@@	@A= 
! =#   b =/ ! =B ; b! =N 
! = 
GUk e h !n 
u b ֍ !!) =  b
#*	A!" [token address value starting-point nil ex-previous-re message number ex-goto-line dot dollar prev forward-line -1 mark evi-goto-mark-internal re-forward 0 evi-error "No previous regular expression" end-of-line abort (byte-code "	#" [t value nil evi-do-search 1] 4) re-backward evi-do-search 1] 12))

(defun ex-goto-line-after-address (address) (byte-code "@@?  ' @@= @AU! eb' ! " [address forward-line number 0 ex-goto-address] 4))

(defun ex-count-addresses (addresses) (byte-code "@@@=  A@@= Â ć" [addresses nil 0 1 2] 2))

(defun ex-scan-command-name nil (byte-code "!`!-  h	Y 	X& 	Y& 	X, !)
`\"\")" [start char ex-commands skip-chars-forward " 	" looking-at "[a-zA-Z!<=>&@]" forward-char 97 122 65 90 "a-zA-Z" ex-lookup-command buffer-substring] 9))

(defun ex-lookup-command (command-list command) (byte-code "	 @
@\" 
?& A +" [list command-list cmd-struct nil found command ex-command-eq] 4))

(defun ex-command-eq (command command-cell) (byte-code "	@
\"% 
G	AY$ GW$ 
	@
GO\"))" [full-command command-cell command command-length string= 0] 6))

(defun ex-scan-register nil (byte-code "g! g !Y X?B)  	B" [char evi-register-unnamed nil evi-is-alpha forward-char evi-register-number 97 122] 6))

(defun ex-scan-mark nil (byte-code "g!$ g Y X Â Z\\)' !" [char evi-is-alpha forward-char 97 122 65 36 evi-error "marker name required for mark command"] 5))

(defun ex-scan-files nil (byte-code "\"GV 
B! 
!BB*" [file nil flist ex-scan-quoted "%#*?$[" " 	|
" 0 skip-chars-forward " 	" quote nreverse] 6))

(defun ex-scan-quoted (stop-chars delim-chars) (byte-code "`
Q
Q	!!gU- ``T\" U  ``T\"gUT ``T\"c Uf ``T\"c Ux ``T\"c U ``T\"c U `TfU `\\fW ₭ Zc``\\\") !)  U !

 ``T\"
c !)U	``T\"c!ɉ )	! 1``\"P$bP!`\"=`\"," [start skip-chars stop-chars delim-chars stop-pat expand-glob nil char ex-input-escapes t file-name ex-user-buffer evi-prev-file "^\\\\" "[\\\\" "]" skip-chars-forward looking-at 22 delete-region forward-char 92 101 27 110 10 114 13 116 9 67 45 2 97 64 96 3 1 37 buffer-file-name evi-error "Buffer has no filename to substitute for %%%%" 35 "No alternate filename to substitute for #" shell-command-on-region "echo " buffer-substring "^" /=] 26))

(defun ex-scan-string (string) (byte-code "	G!`)`ZX% ``\\\"	
\"$ !))" [string-length string buffer-string t skip-chars-forward "^|
" buffer-substring string= forward-char] 5))

(defun ex-not-implemented (&optional arg) (byte-code "!" [message "Command not implemented"] 2))

(defun ex-abbrev (abbrev definition) (byte-code "? 
\"	&  	GB\"# 	AA!\"; 7 GBB
B; \")F 
\"\"" [abbrev elem evi-abbrev-list definition assoc setcdr message "%s" evi-pretty-string evi-error "No abbrev for `%s'" evi-display-list-and-prompt "*Abbrevs*" mapcar evi-pretty-binding] 10))

(defun ex-expand-abbrev nil (byte-code "	? @@`@8Z#6 h!/ ``@8\\\"@AAc6 `@8\\bA *" [abbrev evi-abbrev-list case-fold-search nil t search-backward 1 evi-is-nonalphanum delete-region] 8))

(defun evi-self-insert nil (interactive) (byte-code "!
  ! " [last-command-char nil evi-is-nonalphanum ex-expand-abbrev self-insert-command 1 evi-no-undo-boundary] 5))

(defun ex-change-buffer (exclam buffer-name) (byte-code "	#" [exclam buffer-name nil ex-change-buffer-internal] 4))

(defun ex-change-buffer-other-window (exclam buffer-name) (byte-code "	#" [exclam buffer-name t ex-change-buffer-internal] 4))

(defun ex-change-buffer-internal (exclam buffer-name other-window) (byte-code " p!!!
 	( \" !% !, \" )" [buffer-name found exclam other-window other-buffer ex-verify-buffer switch-to-buffer-other-window switch-to-buffer message "Buffer \"%s\" does not exist" evi] 8))

(defun ex-verify-buffer (buffer-name) (byte-code "  @	!\"?$ A +" [list buf nil found buffer-name buffer-list string=] 6))

(defun evi-expand-file-name (file-name) (byte-code "	!G
SHU  P*" [expanded-name file-name len expand-file-name 47 "/"] 3))

(defun evi-current-directory nil (byte-code "	 	@
 
" [evi-global-directory evi-directory-stack default-directory] 1))

(defun ex-change-directory (directory-name) (byte-code "	 !
 \" )" [expnd-dir-name directory-name evi-global-directory evi-directory-stack default-directory evi-expand-file-name "~" setcar] 4))

(defun ex-push-directory (directory-name) (byte-code " !	B& 	A? !& 	8	@	AABB" [directory-name evi-directory-stack evi-expand-file-name evi-error "Only one directory" 1] 5))

(defun ex-pop-directory nil (byte-code "A? ! A" [evi-directory-stack evi-error "Only one directory left"] 3))

(defun ex-directory-stack nil (byte-code "!	#!)" [home evi-directory-stack getenv "HOME" message mapconcat (lambda (f) (byte-code "	
#GSHU O *" [dir f home end evi-abbreviate-file-name "~" 47 0] 4)) " "] 6))

(defun ex-copy (from-addresses to-address) (byte-code "#`\"!c)" [from-addresses t nil text evi-mark to-address ex-define-region buffer-substring ex-goto-line-after-address] 4))

(defun ex-delete (addresses register-struct) (byte-code "	
#!`W  `\")" [evi-register-spec register-struct addresses t nil evi-mark ex-define-region evi-copy-region-to-registers evi-exchange-point-and-mark delete-region] 6))

(defun ex-edit (exclam offset file-name) (byte-code "	
$" [exclam offset file-name nil ex-edit-internal] 5))

(defun ex-edit-other-window (exclam offset file-name) (byte-code "	
$" [exclam offset file-name t ex-edit-internal] 5))

(defun ex-edit-internal (exclam offset file-name other-window) (byte-code "?8 	? 
?   !5 
#  5 ?. !5 \" _ p!
G !J !p!=[ ! )t Uq Ăs !" [file-name exclam other-window buffer-file-name nil t prev-buf evi-prev-file offset buffer-modified-p message "Buffer modified since last save (use :edit! to override)" split-window-vertically "Buffer has no file associated with it" revert-buffer evi get-buffer find-file-other-window find-file ex-goto-line -1] 15))

(defun ex-elisp-execute (lisp-expression) (byte-code "!@!" [lisp-expression eval read-from-string] 3))

(defun ex-file (file-name) (byte-code "
 !  " [file-name set-visited-file-name evi-file-info] 3))

(defun ex-global (addresses notmatch pattern command) (byte-code "	  `	
GU. ( 
+ !3 
# `ZV		P !\"`W ` 
`\"b

#= b`!
bW 	 !
\"\"b !." [case-fold-search evi-ignore-case next-line-mark end-line-mark start nil none-found t end-pos large-region pattern ex-previous-re addresses evi-mark notmatch command make-marker 0 evi-error "No previous regular expression" ex-define-region evi-exchange-point-and-mark 5000 message "running global command... " set-marker forward-line re-search-forward eval "running global command... complete." "No occurance of pattern found"] 16))

(defun ex-vglobal (addresses pattern command) (byte-code "
$" [addresses t pattern command ex-global] 5))

(defun ex-recurse (fun) (byte-code "p	q `q!p	q 
cbq*)" [ex-user-buffer ex-work-space work-string work-point fun buffer-string eval erase-buffer] 4))

(defun ex-initialize nil (byte-code "!" [ex-recurse (evi-customize)] 2))

(defun ex-kill-buffer (exclam buffer-name) (byte-code "	#" [exclam buffer-name nil ex-kill-buffer-internal] 4))

(defun ex-kill-buffer-delete-windows (exclam buffer-name) (byte-code "	#" [exclam buffer-name t ex-kill-buffer-internal] 4))

(defun ex-kill-buffer-internal (exclam buffer windows-too) (byte-code " p!	? ! ! !q! 1 ͏!p" [buffer exclam nil windows-too ex-user-buffer get-buffer buffer-file-name buffer-modified-p evi-error "No write since last change (use :kill! to override)" set-buffer-modified-p delete-auto-save-file-if-necessary (byte-code "!" [buffer delete-windows-on] 2) ((error (byte-code "" [nil] 1))) kill-buffer] 9))

(defun ex-find-fkey (suffix) (byte-code "	P!!
=9 !* @A\"?5 A +@ y 	P!!!f @A\"?q AS +y )" [key suffix window-system list function-key-map it nil found vector intern "f" x evi-keymap-bindings equal "kp-f"] 11))

(defun ex-map (exclam key definition) (byte-code "	 
	 w GV\" HU\" H!1 O!/ != #Y 	P #V #t \";o !\"s \") !\"\")" [map exclam evi-input-map-map evi-map-map key evi-top-level-map definition mapping 1 0 35 evi-is-num ex-find-fkey nil vectorp define-key evi-top-level evi-define-key (input-map) (map) lookup-key message "%s" evi-pretty-string evi-error "No map for `%s'" evi-display-list-and-prompt "*Mappings*" mapcar evi-pretty-binding evi-keymap-bindings] 16))

(defun ex-mark (address marker) (byte-code "`\"	
 I)" [address evi-registers marker ex-goto-address point-marker] 5))

(defun ex-move (from-addresses to-address) (byte-code "#`\"Ɋ!`)!`W  `\"bc\"*" [from-addresses t nil text evi-mark to-mark to-address ex-define-region buffer-substring copy-marker ex-goto-line-after-address evi-exchange-point-and-mark delete-region set-marker] 9))

(defun ex-preserve nil (byte-code " " [do-auto-save] 2))

(defun ex-print (addresses) (byte-code "#`\"!q  c)" [addresses t nil evi-mark ex-printed ex-define-region buffer-substring get-buffer-create "*Print*" erase-buffer] 7))

(defun ex-next (exclam files) (byte-code "	#" [exclam files nil ex-next-internal] 4))

(defun ex-next-other-window (exclam files) (byte-code "	#" [exclam files t ex-next-internal] 4))

(defun ex-next-internal (exclam files other-window) (byte-code "6 \"	2 p! 	@!  	@!
p!=. 
! ))^ !Z p!Q !T ! ] !)" [files next-buffers prev-buf other-window evi-prev-file next-buffer t buffer-file-name mapcar find-file-noselect get-buffer switch-to-buffer-other-window switch-to-buffer evi evi-next-file-buffer bury-buffer message "All files are displayed"] 14))

(defun evi-next-file-buffer (not-in-window) (byte-code " A	 	@ 
! 
!?( 	A 	*2 @)" [rest-of-list list buffer nil not-in-window buffer-list get-buffer-window buffer-file-name] 6))

(defun ex-put (address register-struct) (byte-code "!
@H	@ 	A=  	@G!	@G!	A=/ 	@!2 	@c	A=< c)Q N @!\"Q !)" [address register evi-registers register-struct evi-register-spec ex-goto-line-after-address rectangle newline backward-char insert-rectangle chars 10 message "Nothing in register %c" evi-register-name "No text to put"] 8))

(defun evi-list-apply (func l) (byte-code " 	@#	A\"" [l func nil apply evi-list-apply] 4))

(cond ((eq evi-emacs-version (quote emacs19)) (defun ex-quit (discard) (if (= (length (frame-list)) 1) (ex-really-quit discard) (delete-frame)))) ((eq evi-emacs-version (quote lucid19)) (defun ex-quit (discard) (if (= (length (screen-list)) 1) (ex-really-quit discard) (delete-screen)))) (t (defun ex-quit (discard) (ex-really-quit discard))))

(defun ex-really-quit (discard) (byte-code "  \"-  \"	, 	A  	@p=?) !, !) " [discard modified-buffers evi-list-apply (lambda (buf) (byte-code "! q " [buf buffer-file-name delete-auto-save-file-if-necessary] 3)) buffer-list evi-filter (lambda (buf) (byte-code "	!H	! \" \")" [c buf buffer-name 0 buffer-modified-p /= 32 42] 6)) evi-error "Modified buffers exist (use :quit! to override, :Wq to save buffers and quit)" "No write since last change (use :quit! to override)" kill-emacs] 8))

(defun ex-read (address shell-command arg) (byte-code "!	  	= ! 	&# !" [address shell-command t shell-file-name nil arg ex-goto-line-after-address evi-error "Incomplete shell escape" call-process "-c" evi-insert-file] 9))

(defun evi-insert-file (filename) (byte-code "! c`S`\"AA	!" [buffer-undo-list filename boundp 64 delete-region insert-file-contents] 4))

(defun ex-recover (exclam file-name) (byte-code " 	 
?   ! !!!! " [file-name buffer-file-name exclam buffer-modified-p evi-error "No write since last change (use :recover! to override)" "Buffer has no file associated with it" recover-file auto-save-mode 1 message "Auto save mode on" evi] 8))

(defun ex-set (settings) (byte-code "
 ! 	#!" [settings evi-set-options ex-set-internal message mapconcat evi-get-option " "] 6))

(defun ex-set-internal (settings) (byte-code "? @	@	A
\"# \"\"$9 !5 
!!!9 
\"A!+" [settings setting name value evi-option-list nil string= "all" evi-display-list-and-prompt "*Settings*" mapcar (lambda (x) (byte-code "@@!" [x evi-get-option] 2)) evi-filter (lambda (x) (byte-code "AA" [x] 1)) half integerp princ evi-get-option " " evi-set-option ex-set-internal] 11))

(defun ex-scan-settings nil (byte-code "!!S `!`\")!/ !
\"BBJ !C !
BBJ 
BB)! !k i @@\"j \")" [settings nil option start t skip-chars-forward " 	" looking-at "[A-Za-z-]" "A-Za-z-" buffer-substring "=" forward-char 1 ex-scan-quoted " 	|
" "?" 63 "[^|
]" evi-error "Invalid setting%s" format " after `%s'" ""] 16))

(defun evi-get-option (option) (byte-code "	
\"% 
GV 
HU 
HU% 	
O\"8=7 
\" @ԏAA=_ O Y \"\\ P =v =p s P =  ! Q =  ! Q =  ! Q !\"**" [option-struct evi-option-list option type nil long-name value evi-interactive evi-report-unsupported-options t evi-search-option-list 2 0 110 1 111 evi-error "Invalid option `%s'" code (byte-code "AA!" [option-struct eval] 2) ((error (byte-code "" [nil] 1))) "Option `%s' not implemented" "=<ignored>" bool "no" number "=" int-to-string "<undef>" string evi-pretty-string char evi-pretty-char "Internal Error: Invalid type `%s'" prin1-to-string] 11))

(defun evi-set-option (option value) (byte-code "	
\") 
GV 
HU 
HU) 	
O\"ĉ8=; 
\" AA=U J R @\" =l ;i 

#ĉ = ; ! 

#ĉ = ; 

#L = ; GU H 
\"ĉ 

#ĉ !\"AA-AAL
			@
\"?	A	 +-
(

C\"-
C
AA!<AA\"*" [option-struct evi-option-list option value nil type evi-interactive evi-report-unsupported-options t list evi-set-options opt found evi-search-option-list 2 0 110 1 111 evi-warning "Invalid option `%s'" "Option `%s' not implemented" bool "Only %s or no%s allowed" number string-to-int "Use %s=<number> to set, or %s? to query" string "Use %s=<string> to set, or %s? to query" char "Only single character can be assigned to `%s'" "Use %s=<character> to set, or %s? to query" evi-error "Internal Error: Invalid type `%s'" prin1-to-string equal nconc fboundp funcall] 18))

(defun evi-search-option-list (option-list option) (byte-code "	# @
@\" @
AB)?. A +" [list option-list option-struct nil found option-strings option evi-string-list-match] 4))

(defun evi-string-list-match (string-list string) (byte-code " 	@\"  A	\"" [string-list string t string= evi-string-list-match] 4))

(defvar evi-shell-mode-hook nil)

(defun evi-shell-mode-setup nil (byte-code "!!L!L!!L 
" [t evi-buffer-local-vi-map evi-shell-map run-hooks evi-shell-mode-hook make-local-variable evi-insert-mode-local-bindings evi-wrap-margin 0 evi-emacs-local-suppress-key-list (27) evi] 8))

(defun evi-shell-send-input nil (interactive) (byte-code "!  = p!!b   " [evi-mode nil fboundp comint-mode comint-send-input vi process-mark get-buffer-process evi-insert shell-send-input] 7))

(defun ex-shell nil (byte-code "!
 	   *" [evi-shell-mode-hook shell-mode-hook nil boundp evi-shell-mode-setup shell evi-insert] 4))

(defun ex-gdb (program-name) (byte-code "!
 	 ! *" [evi-shell-mode-hook gdb-mode-hook nil program-name boundp evi-shell-mode-setup gdb evi-insert] 4))

(defun ex-source-file (file-name) (byte-code "! ! D! \" \"" [file-name file-exists-p file-readable-p ex-recurse evi-do-ex-command-file evi-warning "Unable to read file `%s'" "No such file or directory: %s"] 7))

(defun ex-substitute (addresses pattern replacement global query) (byte-code "	` `	#
A 
GU9 0 
6 
b!> 
X R 
X 
b!b ׉
HUx 
HU ȉ `ZV !\"`W 
# !b`\"    !\"b 
\"." [case-fold-search evi-ignore-case start end-line-mark none-found t end-pos large-region nil addresses pattern ex-previous-re ex-previous-replacement replacement global evi-mark query make-marker ex-define-region 0 evi-error "No previous regular expression" "No previous substitution" "" 94 36 evi-exchange-point-and-mark 5000 message "running substitute command... " set-marker re-search-forward match-beginning ex-replace-match forward-line "running substitute command... complete." "No occurance of pattern `%s' found"] 16))

(defun ex-substitute-again (addresses) (byte-code "%" [addresses nil ex-substitute ""] 6))

(if (and (eq evi-emacs-version (quote emacs19)) (eq window-system (quote x))) (defun evi-hilight-region (start end) (let ((ov (make-overlay start (1+ end)))) (overlay-put ov (quote face) (quote region)) (sit-for 99999) (delete-overlay ov))) (defun evi-hilight-region (start end) (let ((here (point)) (flag nil) (going t)) (goto-char start) (while going (if (not (sit-for 1)) (setq going nil) (goto-char (if flag start end)) (setq flag (not flag)))) (goto-char here))))

(defun ex-replace-match (query replacement) (byte-code "?] !!?R !	
S\" U+  \"E \"E \"E \"N  ĉ U\\ U+h #l !b" [query beginning end answer nil replacement t match-beginning 0 match-end message "replace? (y or n)" evi-hilight-region evi-read-char 3 keyboard-quit /= 121 110 89 78 beep replace-match] 15))

(defun ex-tag (tag) (byte-code "
  	 !	! " [tag ex-tag evi-error "No previous tag specified" find-tag evi] 4))

(defun ex-unabbrev (abbrev) (byte-code "	2 @@\"( 
 
A\"! AÉ. A *" [alist evi-abbrev-list alist2 nil abbrev string= setcdr] 5))

(defun ex-unmap (exclam key) (byte-code " 	# 	#" [exclam key nil evi-define-key (input-map) (map)] 5))

(defun ex-evi-version nil (byte-code "!" [evi-version message] 2))

(defun ex-write (addresses exclam shell-command append file-arg) (byte-code "% = !\" #`B)C\") , V O !HUI M  P!\"V !? f f 	? #? eU `dU !  `
$) ! !)" [shell-command t region addresses evi-mark file-name file-arg buffer-file-name exclam evi-buffer-read-only append evi-error "Incomplete shell escape" ex-define-region evi-display-and-prompt (lambda (cmd) (byte-code "@A	#
=\" ! qed\"V)# Ç" [region cmd evi-emacs-version t shell-command-on-region emacs19 get-buffer "*Shell Command Output*" count-lines 1] 5)) string= file-truename 0 47 evi-current-directory file-exists-p set-buffer-modified-p basic-save-buffer write-region "File read-only (use :write! to attempt override)" "File exists, use :write! to override"] 16))

(defun ex-write-all-buffers (quietly) (byte-code "!" [quietly save-some-buffers] 2))

(defun ex-write-kill nil (byte-code "! \"" [t nil set-buffer-modified-p basic-save-buffer ex-kill-buffer] 5))

(defun ex-write-quit (discard) (byte-code "! 	!" [t discard set-buffer-modified-p basic-save-buffer ex-quit] 4))

(defun ex-write-all-and-quit (quietly) (byte-code "\"!" [quietly t save-some-buffers ex-quit] 3))

(defun ex-yank (addresses register-struct) (byte-code "	
#!))" [evi-register-spec register-struct addresses t nil ex-define-region evi-copy-region-to-registers] 4))

(defun ex-shell-command (addresses background shell-command) (byte-code "\" 	 ! 
>  !!  % !)e @@@?X !q )C\"e #`$" [shell-command evi-last-shell-command background curdir default-directory addresses t nil evi-mark string= "!" evi-error "No previous shell command to substitute for !" evi-current-directory switch-to-buffer-other-window get-buffer-create "*Shell Command Output*" evi erase-buffer start-process "sh" "-c" select-window previous-window evi-display-and-prompt (lambda (cmd) (byte-code "!	= ! qed\"V) " [cmd evi-emacs-version t shell-command emacs19 get-buffer "*Shell Command Output*" count-lines 1] 5)) ex-define-region shell-command-on-region] 19))

(defun ex-shift-right (addresses) (byte-code "#`#!!" [addresses t nil evi-mark evi-shift-width ex-define-region indent-rigidly forward-line -1 skip-chars-forward " 	"] 5))

(defun ex-shift-left (addresses) (byte-code "#`[#!!" [addresses t nil evi-mark evi-shift-width ex-define-region indent-rigidly forward-line -1 skip-chars-forward " 	"] 5))

(defun ex-null (addresses) (byte-code "#!!" [addresses t nil ex-define-region forward-line -1 skip-chars-forward " 	"] 4))

(defvar evi-evi-list "evi-list@brandx.rain.com" "\
Address of site maintaining mailing list for Evi.")

(defvar evi-bug-address "jlewis@cse.ogi.edu" "\
Address of who maintains evi.")

(defun ex-mail (to) (byte-code "	\" ! " [nil to mail evi message "Type `:send' to send message.  Type `:kill' to abort." evi-insert] 5))

(defun ex-mail-list (subject) (byte-code "	
# db %! " [nil evi-evi-list subject evi-version mail evi insert "Using " " (" emacs-version ").

" message "Type `:send' to send message.  Type `:kill' to abort." evi-insert] 9))

(defun ex-elisp-bind (input key definition) (byte-code "
 ł 	
!@$" [input key definition funcall evi-define-key (insert replace ex) (vi) read-from-string] 6))

(defun ex-report-bug (subject) (byte-code "	
# db %! " [nil evi-bug-address subject evi-version mail evi insert "In " " (" emacs-version ")

" message "Type `:send' to send bug report.  Type `:kill' to abort." evi-insert] 9))

(defun ex-send-mail (exclam) (byte-code "  \"" [exclam t nil mail-send ex-kill-buffer] 4))

(provide (quote evi))
