* lisp/term/screen.el (xterm-screen-extra-capabilities): New custom
[emacs.git] / lisp / emulation / viper.el
Commit [+]AuthorDateLineData
8831bbed Glenn Morris2011-05-23 20:37:31 -07001;;; viper.el --- A full-featured Vi emulator for Emacs and XEmacs,
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +00002;; a VI Plan for Emacs Rescue,
3;; and a venomous VI PERil.
4;; Viper Is also a Package for Emacs Rebels.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00005
7e09ef09 Paul Eggert2015-01-01 14:26:41 -08006;; Copyright (C) 1994-2015 Free Software Foundation, Inc.
151496c0 Michael Kifer1996-01-20 03:10:57 +00007
50a07e18 Michael Kifer2002-01-08 04:36:01 +00008;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
02f34c70 Michael Kifer2001-09-09 22:33:38 +00009;; Keywords: emulations
aad4679e Chong Yidong2010-08-29 16:10:43 -040010;; Version: 3.14.1
02f34c70 Michael Kifer2001-09-09 22:33:38 +000011
241760a3
SM
Stefan Monnier2008-04-16 14:10:34 +000012;; Yoni Rabkin <yoni@rabkins.net> contacted the maintainer of this
13;; file on 20/3/2008, and the maintainer agreed that when a bug is
14;; filed in the Emacs bug reporting system against this file, a copy
15;; of the bug report be sent to the maintainer's email address.
16
f1e6674b Michael Kifer2013-07-07 15:35:54 -040017(defconst viper-version "3.14.2 of July 4, 2013"
03fc1246
MK
Michael Kifer1996-03-29 01:02:28 +000018 "The current version of Viper")
19
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000020;; This file is part of GNU Emacs.
21
ed0f493f Glenn Morris2008-05-06 03:28:01 +000022;; GNU Emacs is free software: you can redistribute it and/or modify
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +000023;; it under the terms of the GNU General Public License as published by
ed0f493f
GM
Glenn Morris2008-05-06 03:28:01 +000024;; the Free Software Foundation, either version 3 of the License, or
25;; (at your option) any later version.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000026
27;; GNU Emacs is distributed in the hope that it will be useful,
28;; but WITHOUT ANY WARRANTY; without even the implied warranty of
29;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30;; GNU General Public License for more details.
31
32;; You should have received a copy of the GNU General Public License
ed0f493f Glenn Morris2008-05-06 03:28:01 +000033;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000034
35;;; Commentary:
36
3af0304a Michael Kifer1999-11-01 07:16:15 +000037;; Viper is a full-featured Vi emulator for Emacs and XEmacs. It emulates and
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000038;; improves upon the standard features of Vi and, at the same time, allows
39;; full access to all Emacs facilities. Viper supports multiple undo,
40;; file name completion, command, file, and search history and it extends
3af0304a Michael Kifer1999-11-01 07:16:15 +000041;; Vi in many other ways. Viper is highly customizable through the various
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000042;; hooks, user variables, and keymaps. It is implemented as a collection
43;; of minor modes and it is designed to provide full access to all Emacs
44;; major and minor modes.
45;;
3afbc435 Pavel Janík2001-07-16 07:46:48 +000046;;; History:
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000047;;
48;; Viper is a new name for a package formerly known as VIP-19,
49;; which was a successor of VIP version 3.5 by Masahiko Sato
50;; <ms@sail.stanford.edu> and VIP version 4.2 by Aamod Sane
3af0304a Michael Kifer1999-11-01 07:16:15 +000051;; <sane@cs.uiuc.edu>. Some ideas from vip 4.4.2 by Aamod Sane
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000052;; were also shamelessly plagiarized.
53;;
54;; Viper maintains some degree of compatibility with these older
3af0304a Michael Kifer1999-11-01 07:16:15 +000055;; packages. See the documentation for customization.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000056;;
57;; The main difference between Viper and these older packages are:
58;;
59;; 1. Viper emulates Vi at several levels, from almost complete conformity
60;; to a rather loose Vi-compliance.
61;;
62;; 2. Viper provides full access to all major and minor modes of Emacs
63;; without the need to type extra keys.
64;; The older versions of VIP (and other Vi emulators) do not work with
65;; some major and minor modes.
66;;
67;; 3. Viper supports vi-style undo.
68;;
69;; 4. Viper fully emulates (and improves upon) vi's replacement mode.
70;;
71;; 5. Viper has a better interface to ex, including command, variable, and
72;; file name completion.
73;;
74;; 6. Viper uses native Emacs history and completion features; it doesn't
75;; rely on other packages (such as gmhist.el and completer.el) to provide
76;; these features.
77;;
78;; 7. Viper supports Vi-style editing in the minibuffer, by allowing the
79;; user to switch from Insert state to Vi state to Replace state, etc.
80;;
81;; 8. Viper keeps history of recently inserted pieces of text and recently
82;; executed Vi-style destructive commands, such as `i', `d', etc.
83;; These pieces of text can be inserted in later insertion commands;
84;; the previous destructive commands can be re-executed.
85;;
86;; 9. Viper has Vi-style keyboard macros, which enhances the similar
87;; facility in the original Vi.
88;; First, one can execute any Emacs command while defining a
3af0304a Michael Kifer1999-11-01 07:16:15 +000089;; macro, not just the Vi commands. Second, macros are defined in a
44e97401 Glenn Morris2012-02-28 00:17:21 -080090;; WYSYWYG mode, using an interface to Emacs's WYSIWYG style of defining
3af0304a Michael Kifer1999-11-01 07:16:15 +000091;; macros. Third, in Viper, one can define macros that are specific to
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000092;; a given buffer, a given major mode, or macros defined for all buffers.
93;; The same macro name can have several different definitions:
94;; one global, several definitions for various major modes, and
95;; definitions for specific buffers.
d63a37ea Karl Heuer1996-07-20 17:20:16 +000096;; Buffer-specific definitions override mode-specific
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +000097;; definitions, which, in turn, override global definitions.
98;;
99;;
100;;; Installation:
101;; -------------
102;;
103;; (require 'viper)
104;;
105
09ae5da1
PE
Paul Eggert2012-07-24 22:48:19 -0700106;;; Acknowledgments:
107;; ----------------
d63a37ea
KH
Karl Heuer1996-07-20 17:20:16 +0000108;; Bug reports and ideas contributed by many users have helped
109;; improve Viper and the various versions of VIP.
a27e8c78 Glenn Morris2014-06-28 19:33:50 -0700110;; See the manual for a complete list of contributors.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000111;;
112;;
113;;; Notes:
114;;
115;; 1. Major modes.
116;; In most cases, Viper handles major modes correctly, i.e., they come up
3af0304a Michael Kifer1999-11-01 07:16:15 +0000117;; in the right state (either vi-state or emacs-state). For instance, text
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000118;; files come up in vi-state, while, say, Dired appears in emacs-state by
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000119;; default.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000120;; However, some modes do not appear in the right mode in the beginning,
121;; usually because they neglect to follow Emacs conventions (e.g., they don't
3af0304a Michael Kifer1999-11-01 07:16:15 +0000122;; use kill-all-local-variables when they start). Some major modes
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000123;; may fail to come up in emacs-state if they call hooks, such as
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +0000124;; text-hook, for no good reason.
125;;
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000126;; As an immediate solution, you can hit C-z to bring about the right mode.
127;; An interim solution is to add an appropriate hook to the mode like this:
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000128;;
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000129;; (add-hook 'your-favorite-mode 'viper-mode)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000130;; or
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000131;; (add-hook 'your-favorite-mode 'viper-change-state-to-emacs)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000132;;
3af0304a Michael Kifer1999-11-01 07:16:15 +0000133;; whichever applies. The right thing to do, however, is to complain to the
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000134;; author of the respective package. (Sometimes they also neglect to equip
135;; their modes with hooks, which is one more reason for complaining.)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000136;;
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000137;; 2. Keymap handling
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000138;; Each Viper state (insert, vi, replace) is implemented as a collection of
139;; several minor modes, each with its own keymap.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000140;;
141;; Viper's Vi state consists of seven minor modes:
142;;
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000143;; viper-vi-intercept-minor-mode
144;; viper-vi-local-user-minor-mode
145;; viper-vi-global-user-minor-mode
146;; viper-vi-kbd-minor-mode
147;; viper-vi-state-modifier-minor-mode
148;; viper-vi-diehard-minor-mode
149;; viper-vi-basic-minor-mode
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000150;;
151;; Bindings done to the keymap of the first mode overshadow those done to
152;; the second, which, in turn, overshadows those done to the third, etc.
153;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000154;; The last viper-vi-basic-minor-mode contains most of the usual Vi bindings
3af0304a Michael Kifer1999-11-01 07:16:15 +0000155;; in its edit mode. This mode provides access to all Emacs facilities.
ece4bae5
GM
Glenn Morris2014-01-26 18:02:28 -0800156;; Novice users, however, may want to set their viper-expert-level to 1 in
157;; their viper-custom-file-name. This will enable viper-vi-diehard-minor-mode.
158;; This minor mode's bindings make Viper simulate the usual Vi very closely.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000159;; For instance, C-c will not have its standard Emacs binding
160;; and so many of the goodies of Emacs are not available.
161;;
3af0304a Michael Kifer1999-11-01 07:16:15 +0000162;; A skilled user should set viper-expert-level to at least 3. This will
d63a37ea Karl Heuer1996-07-20 17:20:16 +0000163;; enable `C-c' and many Emacs facilities will become available.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000164;; In this case, viper-vi-diehard-minor-mode is inactive.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000165;;
166;; Viper gurus should have at least
1e70790f Michael Kifer1997-07-17 19:37:07 +0000167;; (setq viper-expert-level 4)
ece4bae5
GM
Glenn Morris2014-01-26 18:02:28 -0800168;; in their viper-custom-file-name. This will unsuppress all Emacs keys
169;; that are not essential for VI-style editing.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000170;; Pick-and-choose users may want to put
1e70790f Michael Kifer1997-07-17 19:37:07 +0000171;; (setq viper-expert-level 5)
ece4bae5
GM
Glenn Morris2014-01-26 18:02:28 -0800172;; in viper-custom-file-name. Viper will then leave it up to the user to
173;; set the variables viper-want-* See viper-set-expert-level for details.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000174;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000175;; The very first minor mode, viper-vi-intercept-minor-mode, is of no
3af0304a Michael Kifer1999-11-01 07:16:15 +0000176;; concern for the user. It is needed to bind Viper's vital keys, such as
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000177;; ESC and C-z.
178;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000179;; The second mode, viper-vi-local-user-minor-mode, usually has an
3af0304a Michael Kifer1999-11-01 07:16:15 +0000180;; empty keymap. However, the user can set bindings in this keymap, which
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000181;; will overshadow the corresponding bindings in the other two minor
3af0304a Michael Kifer1999-11-01 07:16:15 +0000182;; modes. This is useful, for example, for setting up ZZ in gnus,
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000183;; rmail, mh-e, etc., to send message instead of saving it in a file.
184;; Likewise, in Dired mode, you may want to bind ZN and ZP to commands
185;; that would visit the next or the previous file in the Dired buffer.
3af0304a Michael Kifer1999-11-01 07:16:15 +0000186;; Setting local keys is tricky, so don't do it directly. Instead, use
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000187;; viper-add-local-keys function (see its doc).
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000188;;
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000189;; The third minor mode, viper-vi-global-user-minor-mode, is also intended
190;; for the users but, unlike viper-vi-local-user-minor-mode, its key
3af0304a Michael Kifer1999-11-01 07:16:15 +0000191;; bindings are seen in all Viper buffers. This mode keys can be done
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000192;; with define-key command.
193;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000194;; The fourth minor mode, viper-vi-kbd-minor-mode, is used by keyboard
3af0304a Michael Kifer1999-11-01 07:16:15 +0000195;; macros. Users are NOT supposed to modify this keymap directly.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000196;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000197;; The fifth mode, viper-vi-state-modifier-minor-mode, can be used to set
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000198;; key bindings that are visible in some major modes but not in others.
199;;
200;; Users are allowed to modify keymaps that belong to
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000201;; viper-vi-local-user-minor-mode, viper-vi-global-user-minor-mode,
202;; and viper-vi-state-modifier-minor-mode only.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000203;;
204;; Viper's Insert state also has seven minor modes:
205;;
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000206;; viper-insert-intercept-minor-mode
207;; viper-insert-local-user-minor-mode
208;; viper-insert-global-user-minor-mode
209;; viper-insert-kbd-minor-mode
210;; viper-insert-state-modifier-minor-mode
211;; viper-insert-diehard-minor-mode
212;; viper-insert-basic-minor-mode
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000213;;
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000214;; As with VI's editing modes, the first mode,
215;; viper-insert-intercept-minor-mode is used to bind vital keys that are not
216;; to be changed by the user.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000217;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000218;; The next mode, viper-insert-local-user-minor-mode, is used to customize
3af0304a Michael Kifer1999-11-01 07:16:15 +0000219;; bindings in the insert state of Viper. The third mode,
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000220;; viper-insert-global-user-minor-mode is like
221;; viper-insert-local-user-minor-mode, except that its bindings are seen in
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000222;; all Viper buffers. As with viper-vi-local-user-minor-mode, its bindings
223;; should be done via the function viper-add-local-keys. Bindings for
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000224;; viper-insert-global-user-minor-mode can be set with the define-key command.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000225;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000226;; The next minor mode, viper-insert-kbd-minor-mode,
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000227;; is used for keyboard VI-style macros defined with :map!.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000228;;
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000229;; The fifth minor mode, viper-insert-state-modifier-minor-mode, is like
230;; viper-vi-state-modifier-minor-mode, except that it is used in the Insert
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000231;; state; it can be used to modify keys in a mode-specific fashion.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000232;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000233;; The minor mode viper-insert-diehard-minor-mode is in effect when
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000234;; the user wants a high degree of Vi compatibility (a bad idea, really!).
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000235;; The last minor mode, viper-insert-basic-minor-mode, is always in effect
3af0304a Michael Kifer1999-11-01 07:16:15 +0000236;; when Viper is in insert state. It binds a small number of keys needed for
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000237;; Viper's operation.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000238;;
239;; Finally, Viper provides minor modes for overriding bindings set by Emacs
240;; modes when Viper is in Emacs state:
241;;
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000242;; viper-emacs-local-user-minor-mode
243;; viper-emacs-global-user-minor-mode
244;; viper-emacs-kbd-minor-mode
245;; viper-emacs-state-modifier-minor-mode
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000246;;
3af0304a Michael Kifer1999-11-01 07:16:15 +0000247;; These minor modes are in effect when Viper is in Emacs state. The keymap
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000248;; associated with viper-emacs-global-user-minor-mode,
249;; viper-emacs-global-user-map, overrides the global and local keymaps as
3af0304a Michael Kifer1999-11-01 07:16:15 +0000250;; well as the minor mode keymaps set by other modes. The keymap of
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000251;; viper-emacs-local-user-minor-mode, viper-emacs-local-user-map, overrides
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000252;; everything, but it is used on a per buffer basis.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000253;; The keymap associated with viper-emacs-state-modifier-minor-mode
3af0304a Michael Kifer1999-11-01 07:16:15 +0000254;; overrides keys on a per-major-mode basis. The mode
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000255;; viper-emacs-kbd-minor-mode is used to define Vi-style macros in Emacs
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000256;; state.
257;;
258;; 3. There is also one minor mode that is used when Viper is in its
3af0304a Michael Kifer1999-11-01 07:16:15 +0000259;; replace-state (used for commands like cw, C, etc.). This mode is
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000260;; called
261;;
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000262;; viper-replace-minor-mode
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000263;;
3af0304a Michael Kifer1999-11-01 07:16:15 +0000264;; and its keymap is viper-replace-map. Replace minor mode is always
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000265;; used in conjunction with the minor modes for insert-state, and its
266;; keymap overshadows the keymaps for insert minor modes.
267;;
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000268;; 4. Defining buffer-local bindings in Vi and Insert modes.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000269;; As mentioned before, sometimes, it is convenient to have
270;; buffer-specific of mode-specific key bindings in Vi and insert modes.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000271;; Viper provides a special function, viper-add-local-keys, to do precisely
3af0304a Michael Kifer1999-11-01 07:16:15 +0000272;; this. For instance, is you need to add couple of mode-specific bindings
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000273;; to Insert mode, you can put
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000274;;
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000275;; (viper-add-local-keys 'insert-state '((key1 . func1) (key2 .func2)))
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000276;;
3af0304a Michael Kifer1999-11-01 07:16:15 +0000277;; somewhere in a hook of this major mode. If you put something like this
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000278;; in your own elisp function, this will define bindings specific to the
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000279;; buffer that was current at the time of the call to viper-add-local-keys.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000280;; The only thing to make sure here is that the major mode of this buffer
281;; is written according to Emacs conventions, which includes a call to
3af0304a Michael Kifer1999-11-01 07:16:15 +0000282;; (kill-all-local-variables). See viper-add-local-keys for more details.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000283;;
284;;
285;; TO DO (volunteers?):
286;;
287;; 1. Some of the code that is inherited from VIP-3.5 is rather
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000288;; convoluted. Instead of viper-command-argument, keymaps should bind the
289;; actual commands. E.g., "dw" should be bound to a generic command
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000290;; viper-delete that will delete things based on the value of
a4d9b7bc Glenn Morris2009-01-09 04:36:00 +0000291;; last-command-event. This would greatly simplify the logic and the code.
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000292;;
293;; 2. Somebody should venture to write a customization package a la
294;; options.el that would allow the user to change values of variables
295;; that meet certain specs (e.g., match a regexp) and whose doc string
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000296;; starts with a '*'. Then, the user should be offered to save
297;; variables that were changed. This will make user's customization job
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000298;; much easier.
299;;
300
60370d40 Pavel Janík2001-07-15 19:53:53 +0000301;;; Code:
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000302
726e270f
MK
Michael Kifer1997-06-09 04:00:50 +0000303;; compiler pacifier
304(defvar mark-even-if-inactive)
34317da2 Michael Kifer1997-08-22 03:15:57 +0000305(defvar quail-mode)
1e70790f Michael Kifer1997-07-17 19:37:07 +0000306(defvar viper-expert-level)
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000307(defvar viper-mode-string)
308(defvar viper-major-mode-modifier-list)
726e270f Michael Kifer1997-06-09 04:00:50 +0000309;; end pacifier
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000310
cdd489b0 Glenn Morris2007-12-02 20:59:21 +0000311(require 'advice)
aca9b721 Richard M. Stallman1997-07-21 18:24:06 +0000312(require 'viper-init)
8ea74b0e Michael Kifer2005-07-10 18:46:24 +0000313(require 'viper-keym)
aca9b721 Richard M. Stallman1997-07-21 18:24:06 +0000314
1e70790f Michael Kifer1997-07-17 19:37:07 +0000315;; better be defined before Viper custom group.
940e5099 Stefan Monnier2013-03-11 22:08:21 -0400316(defvar viper-custom-file-name (locate-user-emacs-file "viper" ".viper")
33c053f4 Juanma Barranquero2007-01-02 23:57:14 +0000317 "Viper customization file.
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000318If set by the user, this must be done _before_ Viper is loaded in `~/.emacs'.")
319
320(defgroup viper nil
321 "Vi emulation within Emacs.
ece4bae5 Glenn Morris2014-01-26 18:02:28 -0800322NOTE: Viper customization should be saved in `viper-custom-file-name'."
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000323 :prefix "viper-"
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000324 :group 'emulations)
325
726e270f Michael Kifer1997-06-09 04:00:50 +0000326(require 'viper-cmd)
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000327
8e41a31c
MK
Michael Kifer1997-09-30 01:13:53 +0000328(defgroup viper-misc nil
329 "Miscellaneous Viper customization."
330 :prefix "viper-"
331 :group 'viper)
332
333
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000334(defcustom viper-always t
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000335 "Non-nil means, arrange for vi-state to be a default when appropriate.
336This is different from `viper-mode' variable in that `viper-mode' determines
337whether to use Viper in the first place, while `viper-always', if nil, lets
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000338user decide when to invoke Viper in a major mode."
339 :type 'boolean
340 :tag "Always Invoke Viper"
8e41a31c Michael Kifer1997-09-30 01:13:53 +0000341 :group 'viper-misc)
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000342
343;; Non-viper variables that need to be saved in case the user decides to
344;; de-viperize emacs.
345(defvar viper-saved-non-viper-variables nil)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000346
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000347(defcustom viper-mode (cond (noninteractive nil)
348 (t 'ask))
349 "To Viperize or not to Viperize.
cbd9191d Juanma Barranquero2006-11-06 02:31:07 +0000350If t, viperize Emacs. If nil -- don't. If `ask', ask the user.
33c053f4 Juanma Barranquero2007-01-02 23:57:14 +0000351This variable is used primarily when Viper is being loaded.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000352
865fe16f Chong Yidong2012-09-17 13:41:04 +0800353Must be set in your init file before Viper is loaded.
8e41a31c
MK
Michael Kifer1997-09-30 01:13:53 +0000354DO NOT set this variable interactively, unless you are using the customization
355widget."
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000356 :type '(choice (const nil) (const t) (const ask))
357 :tag "Set Viper Mode on Loading"
8e41a31c Michael Kifer1997-09-30 01:13:53 +0000358 :group 'viper-misc)
726e270f Michael Kifer1997-06-09 04:00:50 +0000359
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000360(defcustom viper-vi-state-mode-list
361 '(fundamental-mode
362 makefile-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000363
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000364 awk-mode
365 m4-mode
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000366 xrdb-mode
367 winmgr-mode
368 autoconf-mode
369 cvs-edit-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000370
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000371 html-mode html-helper-mode
372 emacs-lisp-mode lisp-mode lisp-interaction-mode
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +0000373
374 jde-mode java-mode
3af0304a Michael Kifer1999-11-01 07:16:15 +0000375 cc-mode c-mode c++-mode objc-mode
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000376 fortran-mode f90-mode
377 basic-mode
378 bat-mode
379 asm-mode
380 prolog-mode
3af0304a Michael Kifer1999-11-01 07:16:15 +0000381 flora-mode
55d7ff38 Michael Kifer2000-02-28 06:16:44 +0000382 sql-mode
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000383
384 text-mode indented-text-mode
385 tex-mode latex-mode bibtex-mode
55d7ff38 Michael Kifer2000-02-28 06:16:44 +0000386 ps-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000387
38685583 Michael Kifer2005-08-06 16:58:54 +0000388 ;; completion-list-mode
560ef11a Michael Kifer2000-06-05 00:07:02 +0000389 diff-mode
4960e757 Michael Kifer2001-07-21 05:28:24 +0000390 idl-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000391
4986c2c6
MK
Michael Kifer2001-03-17 18:59:39 +0000392 perl-mode
393 cperl-mode
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000394 javascript-mode
395 tcl-mode
396 python-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000397
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000398 sh-mode ksh-mode csh-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000399
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000400 gnus-article-mode
401 mh-show-mode
402 )
403 "Major modes that require Vi command state."
085d6698 Richard M. Stallman1997-09-13 06:16:55 +0000404 :type '(repeat symbol)
8e41a31c Michael Kifer1997-09-30 01:13:53 +0000405 :group 'viper-misc)
c81246f3 Michael Kifer1997-07-25 01:42:53 +0000406
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000407(defcustom viper-emacs-state-mode-list
27eb24a3 Juri Linkov2008-02-28 20:46:02 +0000408 '(Custom-mode
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000409
410 dired-mode
411 efs-mode
412 tar-mode
f1e6674b Michael Kifer2013-07-07 15:35:54 -0400413 egg-status-buffer-mode
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000414
f3eabcdf
MK
Michael Kifer2002-09-18 04:23:27 +0000415 browse-kill-ring-mode
416 recentf-mode
44766d63 Michael Kifer2005-08-06 20:29:11 +0000417 recentf-dialog-mode
f3eabcdf
MK
Michael Kifer2002-09-18 04:23:27 +0000418 occur-mode
419
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000420 mh-folder-mode
421 gnus-group-mode
422 gnus-summary-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000423
38685583
MK
Michael Kifer2005-08-06 16:58:54 +0000424 completion-list-mode
425 help-mode
426
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000427 Info-mode
428 Buffer-menu-mode
3af0304a Michael Kifer1999-11-01 07:16:15 +0000429 compilation-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000430
54b171c7
MK
Michael Kifer2005-11-15 18:44:30 +0000431 rcirc-mode
432
0680ea10
MK
Michael Kifer2005-11-25 07:18:07 +0000433 jde-javadoc-checker-report-mode
434
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000435 view-mode
436 vm-mode
437 vm-summary-mode)
fb7ada5f Chong Yidong2012-04-09 21:05:48 +0800438 "A list of major modes that should come up in Emacs state.
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000439Normally, Viper would bring buffers up in Emacs state, unless the corresponding
440major mode has been placed on `viper-vi-state-mode-list' or
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000441`viper-insert-state-mode-list'. So, don't place a new mode on this list,
442unless it is coming up in a wrong Viper state."
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000443 :type '(repeat symbol)
444 :group 'viper-misc)
445
446(defcustom viper-insert-state-mode-list
657f9cb8
MK
Michael Kifer2000-10-29 04:56:45 +0000447 '(internal-ange-ftp-mode
448 comint-mode
ac64a728 Michael Kifer2007-06-12 19:20:25 +0000449 gud-mode
4960e757 Michael Kifer2001-07-21 05:28:24 +0000450 inferior-emacs-lisp-mode
98c414c7 Miles Bader2006-01-30 03:16:50 +0000451 erc-mode
657f9cb8
MK
Michael Kifer2000-10-29 04:56:45 +0000452 eshell-mode
453 shell-mode)
fb7ada5f Chong Yidong2012-04-09 21:05:48 +0800454 "A list of major modes that should come up in Vi Insert state."
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000455 :type '(repeat symbol)
456 :group 'viper-misc)
457
458
459;; used to set viper-major-mode-modifier-list in defcustom
460(defun viper-apply-major-mode-modifiers (&optional symbol value)
461 (if symbol
462 (set symbol value))
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000463 (mapcar (lambda (triple)
464 (viper-modify-major-mode
465 (nth 0 triple) (nth 1 triple) (eval (nth 2 triple))))
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000466 viper-major-mode-modifier-list))
467
3f9526a3 Michael Kifer2005-02-19 19:32:47 +0000468;; We change standard bindings in some major modes, making them slightly
4960e757 Michael Kifer2001-07-21 05:28:24 +0000469;; different than in "normal" vi/insert/emacs states
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000470(defcustom viper-major-mode-modifier-list
471 '((help-mode emacs-state viper-slash-and-colon-map)
472 (comint-mode insert-state viper-comint-mode-modifier-map)
473 (comint-mode vi-state viper-comint-mode-modifier-map)
ac64a728 Michael Kifer2007-06-12 19:20:25 +0000474 (gud-mode insert-state viper-comint-mode-modifier-map)
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000475 (shell-mode insert-state viper-comint-mode-modifier-map)
4960e757 Michael Kifer2001-07-21 05:28:24 +0000476 (inferior-emacs-lisp-mode insert-state viper-comint-mode-modifier-map)
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000477 (shell-mode vi-state viper-comint-mode-modifier-map)
478 (ange-ftp-shell-mode insert-state viper-comint-mode-modifier-map)
479 (ange-ftp-shell-mode vi-state viper-comint-mode-modifier-map)
480 (internal-ange-ftp-mode insert-state viper-comint-mode-modifier-map)
481 (internal-ange-ftp-mode vi-state viper-comint-mode-modifier-map)
482 (dired-mode emacs-state viper-dired-modifier-map)
483 (tar-mode emacs-state viper-slash-and-colon-map)
484 (mh-folder-mode emacs-state viper-slash-and-colon-map)
3f9526a3
MK
Michael Kifer2005-02-19 19:32:47 +0000485 (gnus-group-mode emacs-state viper-gnus-modifier-map)
486 (gnus-summary-mode emacs-state viper-gnus-modifier-map)
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000487 (Info-mode emacs-state viper-slash-and-colon-map)
488 (Buffer-menu-mode emacs-state viper-slash-and-colon-map)
98c414c7
MB
Miles Bader2006-01-30 03:16:50 +0000489 (erc-mode insert-state viper-comint-mode-modifier-map)
490 (erc-mode vi-state viper-comint-mode-modifier-map)
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000491 )
492 "List specifying how to modify the various major modes to enable some Viperisms.
493The list has the structure: ((mode viper-state keymap) (mode viper-state
c80e3b4a Paul Eggert2011-12-04 00:02:42 -0800494keymap) ...). If `mode' is on the list, the `keymap' will be made active (on
3af0304a Michael Kifer1999-11-01 07:16:15 +0000495the minor-mode-map-alist) in the specified viper state.
cbd9191d
JB
Juanma Barranquero2006-11-06 02:31:07 +0000496If you change this list, have to restart Emacs for the change to take effect.
497However, if you did the change through the customization widget, then Emacs
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000498needs to be restarted only if you deleted a triple mode-state-keymap from the
cbd9191d Juanma Barranquero2006-11-06 02:31:07 +0000499list. No need to restart Emacs in case of insertion or modification of an
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000500existing triple."
501 :type '(repeat
502 (list symbol
503 (choice (const emacs-state)
504 (const vi-state)
505 (const insert-state))
506 symbol))
507 :set 'viper-apply-major-mode-modifiers
508 :group 'viper-misc)
509
510
c81246f3 Michael Kifer1997-07-25 01:42:53 +0000511
e36a387d Michael Kifer1997-06-18 01:26:55 +0000512\f
726e270f Michael Kifer1997-06-09 04:00:50 +0000513
e36a387d Michael Kifer1997-06-18 01:26:55 +0000514;;;###autoload
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000515(defun toggle-viper-mode ()
328b4b70 Michael Kifer1997-11-01 01:46:51 +0000516 "Toggle Viper on/off.
3af0304a Michael Kifer1999-11-01 07:16:15 +0000517If Viper is enabled, turn it off. Otherwise, turn it on."
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000518 (interactive)
519 (if (eq viper-mode t)
520 (viper-go-away)
521 (setq viper-mode nil)
522 (viper-mode)))
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000523
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000524;;;###autoload
525(defun viper-mode ()
61c4714e Glenn Morris2007-01-27 23:18:37 +0000526 "Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'."
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000527 (interactive)
528 (if (not noninteractive)
529 (progn
530 ;; if the user requested viper-mode explicitly
531 (if viper-mode
532 ()
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000533 (setq viper-mode t)
3b1f2e09 Stefan Monnier2014-10-20 18:35:43 -0400534 ;; FIXME: Don't reload!
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000535 (load-library "viper"))
536
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000537 (if viper-first-time ; Important check. Prevents mix-up of startup
3af0304a Michael Kifer1999-11-01 07:16:15 +0000538 (progn ; and expert-level msgs when viper-mode recurses
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000539 (setq viper-first-time nil)
540 (if (not viper-inhibit-startup-message)
e36a387d Michael Kifer1997-06-18 01:26:55 +0000541 (save-window-excursion
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000542 (setq viper-inhibit-startup-message t)
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000543 (delete-other-windows)
544 (switch-to-buffer "Viper Startup Message")
545 (erase-buffer)
546 (insert
547 (substitute-command-keys
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000548 "Viper Is a Package for Emacs Rebels,
549a VI Plan for Emacs Rescue, and a venomous VI PERil.
e36a387d Michael Kifer1997-06-18 01:26:55 +0000550
8831bbed Glenn Morris2011-05-23 20:37:31 -0700551Incidentally, Viper emulates Vi under Emacs/XEmacs 20.
1e70790f Michael Kifer1997-07-17 19:37:07 +0000552It supports all of what is good in Vi and Ex, while extending
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000553and improving upon much of it.
554
3af0304a Michael Kifer1999-11-01 07:16:15 +0000555 1. Viper supports Vi at several levels. Level 1 is the closest to Vi,
e36a387d Michael Kifer1997-06-18 01:26:55 +0000556 level 5 provides the most flexibility to depart from many Vi conventions.
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000557
e36a387d Michael Kifer1997-06-18 01:26:55 +0000558 You will be asked to specify your user level in a following screen.
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000559
e36a387d Michael Kifer1997-06-18 01:26:55 +0000560 If you select user level 1 then the keys ^X, ^C, ^Z, and ^G will behave
3af0304a Michael Kifer1999-11-01 07:16:15 +0000561 as in VI, to smooth transition to Viper for the beginners. However, to
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +0000562 use Emacs productively, you are advised to reach user level 3 or higher.
563
1e70790f Michael Kifer1997-07-17 19:37:07 +0000564 At user level 2 or higher, ^X and ^C have Emacs, not Vi, bindings;
44e97401 Glenn Morris2012-02-28 00:17:21 -0800565 ^Z toggles Vi/Emacs states; ^G is Emacs's keyboard-quit (like ^C in Vi).
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000566
e36a387d Michael Kifer1997-06-18 01:26:55 +0000567 2. Vi exit functions (e.g., :wq, ZZ) work on INDIVIDUAL files -- they
1e70790f Michael Kifer1997-07-17 19:37:07 +0000568 do not cause Emacs to quit, except at user level 1 (for a novice).
e36a387d Michael Kifer1997-06-18 01:26:55 +0000569 3. ^X^C EXITS EMACS.
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000570 4. Viper supports multiple undo: `u' will undo. Typing `.' will repeat
571 undo. Another `u' changes direction.
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000572
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000573 6. Emacs Meta key is `C-\\' (in all modes) or `\\ ESC' (in Vi command mode).
574 On a window system, the best way is to use the Meta-key on your keyboard.
e36a387d Michael Kifer1997-06-18 01:26:55 +0000575 7. Try \\[keyboard-quit] and \\[abort-recursive-edit] repeatedly,if
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +0000576 something funny happens. This would abort the current editing command.
577
1e70790f Michael Kifer1997-07-17 19:37:07 +0000578For more information on Viper:
726e270f Michael Kifer1997-06-09 04:00:50 +0000579
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000580 a. Type `:help' in Vi command mode
581 b. Print Viper manual, found in ./etc/viper.dvi
582 c. Print the Quick Reference, found in ./etc/viperCard.dvi
583
584To submit a bug report or to contact the author, type :submitReport in Vi
3af0304a Michael Kifer1999-11-01 07:16:15 +0000585command mode. To shoo Viper away and return to pure Emacs (horror!), type:
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000586
587 M-x viper-go-away
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000588
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000589This startup message appears whenever you load Viper, unless you type `y' now."
590 ))
591 (goto-char (point-min))
592 (if (y-or-n-p "Inhibit Viper startup message? ")
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000593 (viper-save-setting
594 'viper-inhibit-startup-message
e36a387d Michael Kifer1997-06-18 01:26:55 +0000595 "Viper startup message inhibited"
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000596 viper-custom-file-name t))
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +0000597 ;;(kill-buffer (current-buffer))
598 (message
599 "The last message is in buffer `Viper Startup Message'")
600 (sit-for 4)
601 ))
1e70790f Michael Kifer1997-07-17 19:37:07 +0000602 (viper-set-expert-level 'dont-change-unless)))
c81246f3 Michael Kifer1997-07-25 01:42:53 +0000603
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000604 (or (memq major-mode viper-emacs-state-mode-list) ; don't switch to Vi
605 (memq major-mode viper-insert-state-mode-list) ; don't switch
83f49acb Michael Kifer2006-08-25 16:06:57 +0000606 (viper-change-state-to-vi))
2ee00512
MK
Michael Kifer2008-04-03 21:04:18 +0000607 ))
608
609 (if (eq major-mode 'viper-mode)
610 (setq major-mode 'fundamental-mode))
611 )
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000612
4960e757
MK
Michael Kifer2001-07-21 05:28:24 +0000613
614;; Apply a little heuristic to invoke vi state on major-modes
615;; that are not listed in viper-vi-state-mode-list
616(defun this-major-mode-requires-vi-state (mode)
617 (cond ((memq mode viper-vi-state-mode-list) t)
618 ((memq mode viper-emacs-state-mode-list) nil)
619 ((memq mode viper-insert-state-mode-list) nil)
620 (t (and (eq (key-binding "a") 'self-insert-command)
621 (eq (key-binding " ") 'self-insert-command)))))
622
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000623\f
4af0c23b Karl Heuer1995-06-09 00:09:26 +0000624;; This hook designed to enable Vi-style editing in comint-based modes."
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000625(defun viper-comint-mode-hook ()
e2de3a29
MK
Michael Kifer2005-10-06 00:09:49 +0000626 (set (make-local-variable 'require-final-newline) nil)
627 (setq viper-ex-style-editing nil
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000628 viper-ex-style-motion nil)
629 (viper-change-state-to-insert))
34da0a2b Michael Kifer1996-09-06 01:17:30 +0000630
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000631
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000632;; remove viper hooks from SYMBOL
633(defun viper-remove-hooks (symbol)
634 (cond ((not (boundp symbol)) nil)
635 ((not (listp (eval symbol))) nil)
636 ((string-match "-hook" (symbol-name symbol))
637 (remove-hook symbol 'viper-mode)
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000638 (remove-hook symbol 'viper-change-state-to-emacs)
639 (remove-hook symbol 'viper-change-state-to-insert)
640 (remove-hook symbol 'viper-change-state-to-vi)
69441214
MK
Michael Kifer2007-08-19 13:47:08 +0000641 (remove-hook symbol 'viper-minibuffer-post-command-hook)
642 (remove-hook symbol 'viper-minibuffer-setup-sentinel)
643 (remove-hook symbol 'viper-major-mode-change-sentinel)
644 (remove-hook symbol 'set-viper-state-in-major-mode)
645 (remove-hook symbol 'viper-post-command-sentinel)
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000646 )))
647
648;; Remove local value in all existing buffers
649;; This doesn't delocalize vars (which would have been desirable)
650(defun viper-delocalize-var (symbol)
937e6a56
SM
Stefan Monnier2009-11-03 02:04:29 +0000651 (dolist (buf (buffer-list))
652 (with-current-buffer buf
653 (kill-local-variable symbol))))
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000654
655
656(defun viper-go-away ()
657 "De-Viperize Emacs.
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000658This function tries to do as good a job as possible. However, it may undo some
659user customization, unrelated to Viper. For instance, if the user advised
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000660`read-file-name', `describe-key', and some others, then this advice will be
661undone.
38685583 Michael Kifer2005-08-06 16:58:54 +0000662It also can't undo some Viper settings."
1e70790f Michael Kifer1997-07-17 19:37:07 +0000663 (interactive)
f1e6674b Michael Kifer2013-07-07 15:35:54 -0400664 (viper-setup-ESC-to-escape nil)
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000665 ;; restore non-viper vars
666 (setq-default
1e70790f Michael Kifer1997-07-17 19:37:07 +0000667 next-line-add-newlines
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +0000668 (viper-standard-value
669 'next-line-add-newlines viper-saved-non-viper-variables)
1e70790f Michael Kifer1997-07-17 19:37:07 +0000670 require-final-newline
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +0000671 (viper-standard-value
672 'require-final-newline viper-saved-non-viper-variables)
1e70790f Michael Kifer1997-07-17 19:37:07 +0000673 scroll-step
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000674 (viper-standard-value 'scroll-step viper-saved-non-viper-variables)
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000675 mode-line-buffer-identification
676 (viper-standard-value
5489c3d3
MK
Michael Kifer1997-07-18 18:55:36 +0000677 'mode-line-buffer-identification viper-saved-non-viper-variables)
678 global-mode-string
c004db97 Michael Kifer1997-11-25 02:10:08 +0000679 (delq 'viper-mode-string global-mode-string))
5489c3d3 Michael Kifer1997-07-18 18:55:36 +0000680
14acf2f5
SM
Stefan Monnier2009-08-28 17:02:53 +0000681 (setq-default major-mode
682 (viper-standard-value 'default-major-mode
683 viper-saved-non-viper-variables))
69441214 Michael Kifer2007-08-19 13:47:08 +0000684
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +0000685 (if (featurep 'emacs)
5489c3d3
MK
Michael Kifer1997-07-18 18:55:36 +0000686 (setq-default
687 mark-even-if-inactive
688 (viper-standard-value
689 'mark-even-if-inactive viper-saved-non-viper-variables)))
1e70790f Michael Kifer1997-07-17 19:37:07 +0000690
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000691 ;; Ideally, we would like to be able to de-localize local variables
38685583
MK
Michael Kifer2005-08-06 16:58:54 +0000692 (unless
693 (and (fboundp 'add-to-ordered-list) (boundp 'emulation-mode-map-alists))
694 (viper-delocalize-var 'minor-mode-map-alist))
1e70790f Michael Kifer1997-07-17 19:37:07 +0000695 (viper-delocalize-var 'require-final-newline)
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +0000696 (if (featurep 'xemacs) (viper-delocalize-var 'bar-cursor))
1e70790f Michael Kifer1997-07-17 19:37:07 +0000697
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000698
1e70790f Michael Kifer1997-07-17 19:37:07 +0000699 ;; deactivate all advices done by Viper.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000700 (ad-deactivate-regexp "viper-")
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000701
702 (setq viper-mode nil)
703
8ea74b0e
MK
Michael Kifer2005-07-10 18:46:24 +0000704 (when (and (fboundp 'add-to-ordered-list) (boundp 'emulation-mode-map-alists))
705 (setq emulation-mode-map-alists
706 (delq 'viper--intercept-key-maps
707 (delq 'viper--key-maps emulation-mode-map-alists))
708 ))
709
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000710 (viper-delocalize-var 'viper-vi-minibuffer-minor-mode)
711 (viper-delocalize-var 'viper-insert-minibuffer-minor-mode)
712 (viper-delocalize-var 'viper-vi-intercept-minor-mode)
713 (viper-delocalize-var 'viper-insert-intercept-minor-mode)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000714
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000715 (viper-delocalize-var 'viper-vi-local-user-minor-mode)
716 (viper-delocalize-var 'viper-vi-kbd-minor-mode)
717 (viper-delocalize-var 'viper-vi-global-user-minor-mode)
718 (viper-delocalize-var 'viper-vi-state-modifier-minor-mode)
719 (viper-delocalize-var 'viper-vi-diehard-minor-mode)
720 (viper-delocalize-var 'viper-vi-basic-minor-mode)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000721
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000722 (viper-delocalize-var 'viper-replace-minor-mode)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000723
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000724 (viper-delocalize-var 'viper-insert-local-user-minor-mode)
725 (viper-delocalize-var 'viper-insert-kbd-minor-mode)
726 (viper-delocalize-var 'viper-insert-global-user-minor-mode)
727 (viper-delocalize-var 'viper-insert-state-modifier-minor-mode)
728 (viper-delocalize-var 'viper-insert-diehard-minor-mode)
729 (viper-delocalize-var 'viper-insert-basic-minor-mode)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000730
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000731 (viper-delocalize-var 'viper-emacs-intercept-minor-mode)
732 (viper-delocalize-var 'viper-emacs-local-user-minor-mode)
733 (viper-delocalize-var 'viper-emacs-kbd-minor-mode)
734 (viper-delocalize-var 'viper-emacs-global-user-minor-mode)
735 (viper-delocalize-var 'viper-emacs-state-modifier-minor-mode)
736
c004db97
MK
Michael Kifer1997-11-25 02:10:08 +0000737 (viper-delocalize-var 'viper-current-state)
738 (viper-delocalize-var 'viper-mode-string)
739
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000740 (setq-default viper-vi-minibuffer-minor-mode nil
741 viper-insert-minibuffer-minor-mode nil
742 viper-vi-intercept-minor-mode nil
743 viper-insert-intercept-minor-mode nil
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000744
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000745 viper-vi-local-user-minor-mode nil
746 viper-vi-kbd-minor-mode nil
747 viper-vi-global-user-minor-mode nil
748 viper-vi-state-modifier-minor-mode nil
749 viper-vi-diehard-minor-mode nil
750 viper-vi-basic-minor-mode nil
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000751
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000752 viper-replace-minor-mode nil
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000753
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000754 viper-insert-local-user-minor-mode nil
755 viper-insert-kbd-minor-mode nil
756 viper-insert-global-user-minor-mode nil
757 viper-insert-state-modifier-minor-mode nil
758 viper-insert-diehard-minor-mode nil
759 viper-insert-basic-minor-mode nil
760
761 viper-emacs-intercept-minor-mode nil
762 viper-emacs-local-user-minor-mode nil
763 viper-emacs-kbd-minor-mode nil
764 viper-emacs-global-user-minor-mode nil
765 viper-emacs-state-modifier-minor-mode nil
c004db97
MK
Michael Kifer1997-11-25 02:10:08 +0000766
767 viper-current-state 'emacs-state
768 viper-mode-string viper-emacs-state-id
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000769 )
770
771 ;; remove all hooks set by viper
772 (mapatoms 'viper-remove-hooks)
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000773 (remove-hook 'comint-mode-hook 'viper-comint-mode-hook)
98c414c7 Miles Bader2006-01-30 03:16:50 +0000774 (remove-hook 'erc-mode-hook 'viper-comint-mode-hook)
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000775 (remove-hook 'change-major-mode-hook 'viper-major-mode-change-sentinel)
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000776
777 ;; unbind Viper mouse bindings
778 (viper-unbind-mouse-search-key)
779 (viper-unbind-mouse-insert-key)
41497c90 Michael Kifer1997-08-07 04:48:48 +0000780 ;; In emacs, we have to advice handle-switch-frame
53964682 Paul Eggert2011-11-19 01:18:31 -0800781 ;; This advice is undone earlier, when all advices matching "viper-" are
41497c90 Michael Kifer1997-08-07 04:48:48 +0000782 ;; deactivated.
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +0000783 (if (featurep 'xemacs)
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +0000784 (remove-hook 'mouse-leave-frame-hook 'viper-remember-current-frame))
785 ) ; end viper-go-away
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +0000786
787
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000788;; list of buffers that just changed their major mode
789;; used in a hack that triggers vi command mode whenever needed
790(defvar viper-new-major-mode-buffer-list nil)
791
792;; set appropriate Viper state in buffers that changed major mode
793(defun set-viper-state-in-major-mode ()
5078a328 Juanma Barranquero2007-09-26 00:18:58 +0000794 (mapc
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000795 (lambda (buf)
796 (if (viper-buffer-live-p buf)
797 (with-current-buffer buf
4960e757 Michael Kifer2001-07-21 05:28:24 +0000798 (cond ((and (this-major-mode-requires-vi-state major-mode)
3af0304a
MK
Michael Kifer1999-11-01 07:16:15 +0000799 (eq viper-current-state 'emacs-state))
800 (viper-mode))
801 ((memq major-mode viper-emacs-state-mode-list)
802 ;; not checking (eq viper-current-state 'emacs-state)
803 ;; because viper-current-state could have gotten it by
804 ;; default. We need viper-change-state-to-emacs here to have
805 ;; the keymaps take effect.
806 (viper-change-state-to-emacs))
807 ((and (memq major-mode viper-insert-state-mode-list)
808 (not (eq viper-current-state 'insert-state)))
809 (viper-change-state-to-insert))
810 )) ; with-current-buffer
811 )) ; function
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000812 viper-new-major-mode-buffer-list)
813 ;; clear the list of bufs that changed major mode
814 (setq viper-new-major-mode-buffer-list nil)
815 ;; change the global value of hook
816 (remove-hook 'viper-post-command-hooks 'set-viper-state-in-major-mode))
817
818;; sets up post-command-hook to turn viper-mode, if the current mode is
819;; fundamental
820(defun viper-major-mode-change-sentinel ()
821 (save-match-data
822 (or (string-match "\*Minibuf-" (buffer-name))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000823 (setq viper-new-major-mode-buffer-list
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000824 (cons (current-buffer) viper-new-major-mode-buffer-list))))
825 ;; change the global value of hook
826 (add-hook 'viper-post-command-hooks 'set-viper-state-in-major-mode t))
827
1e70790f Michael Kifer1997-07-17 19:37:07 +0000828
f1e6674b
MK
Michael Kifer2013-07-07 15:35:54 -0400829;;; Handling of tty's ESC event
830
831;; On a tty, an ESC event can either be the user hitting the escape key, or
832;; some element of a byte sequence used to encode for example cursor keys.
833;; So we try to recognize those events that correspond to the escape key and
834;; turn them into `escape' events (same as used under GUIs). The heuristic we
835;; use to distinguish the two cases is based, as usual, on a timeout, and on
836;; the fact that the special ESC=>escape mapping only takes place if the whole
837;; last key-sequence so far is just [?\e], i.e. either we're still in
838;; read-key-sequence, or the last read-key-sequence only read [?\e], which
839;; should ideally never happen because it should have been mapped to [escape].
840
841(defun viper--tty-ESC-filter (map)
842 (if (and (equal (this-single-command-keys) [?\e])
843 (sit-for (/ viper-fast-keyseq-timeout 1000)))
844 [escape] map))
845
846(defun viper--lookup-key (map key)
847 "Kind of like `lookup-key'.
848Two differences:
849- KEY is a single key, not a sequence.
850- the result is the \"raw\" binding, so it can be a `menu-item', rather than the
851 binding contained in that menu item."
852 (catch 'found
853 (map-keymap (lambda (k b) (if (equal key k) (throw 'found b))) map)))
854
855(defun viper-catch-tty-ESC ()
856 "Setup key mappings of current terminal to turn a tty's ESC into `escape'."
857 (when (memq (terminal-live-p (frame-terminal)) '(t pc))
858 (let ((esc-binding (viper-uncatch-tty-ESC)))
859 (define-key input-decode-map
860 [?\e] `(menu-item "" ,esc-binding :filter viper--tty-ESC-filter)))))
861
862(defun viper-uncatch-tty-ESC ()
863 "Don't hack ESC into `escape' any more."
864 (let ((b (viper--lookup-key input-decode-map ?\e)))
865 (and (eq 'menu-item (car-safe b))
866 (eq 'viper--tty-ESC-filter (nth 4 b))
867 (define-key input-decode-map [?\e] (setq b (nth 2 b))))
868 b))
869
870(defun viper-setup-ESC-to-escape (enable)
871 (if enable
872 (add-hook 'tty-setup-hook 'viper-catch-tty-ESC)
873 (remove-hook 'tty-setup-hook 'viper-catch-tty-ESC))
874 (let ((seen ()))
875 (dolist (frame (frame-list))
876 (let ((terminal (frame-terminal frame)))
877 (unless (memq terminal seen)
878 (push terminal seen)
879 (with-selected-frame frame
880 (if enable (viper-catch-tty-ESC) (viper-uncatch-tty-ESC))))))))
1e70790f Michael Kifer1997-07-17 19:37:07 +0000881
04090c34 Michael Kifer1995-10-14 02:32:56 +0000882;; This sets major mode hooks to make them come up in vi-state.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000883(defun viper-set-hooks ()
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000884 ;; It is of course a misnomer to call viper-mode a `major mode'.
885 ;; However, this has the effect that if the user didn't specify the
886 ;; default mode, new buffers that fall back on the default will come up
887 ;; in Fundamental Mode and Vi state.
4960e757
MK
Michael Kifer2001-07-21 05:28:24 +0000888 ;; When viper-mode is executed in such a case, it will set the major mode
889 ;; back to fundamental-mode.
14acf2f5 Stefan Monnier2009-08-28 17:02:53 +0000890 (if (eq (default-value 'major-mode) 'fundamental-mode)
3b1f2e09 Stefan Monnier2014-10-20 18:35:43 -0400891 ;; FIXME: We should use after-change-major-mode-hook instead!
14acf2f5 Stefan Monnier2009-08-28 17:02:53 +0000892 (setq-default major-mode 'viper-mode))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000893
f1e6674b
MK
Michael Kifer2013-07-07 15:35:54 -0400894 (viper-setup-ESC-to-escape t)
895
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000896 (add-hook 'change-major-mode-hook 'viper-major-mode-change-sentinel)
897 (add-hook 'find-file-hooks 'set-viper-state-in-major-mode)
e36a387d Michael Kifer1997-06-18 01:26:55 +0000898
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000899 ;; keep this because many modes we don't know about use this hook
bbe6126c Michael Kifer1996-06-22 01:54:34 +0000900 (defvar text-mode-hook)
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000901 (add-hook 'text-mode-hook 'viper-mode)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000902
bbe6126c Michael Kifer1996-06-22 01:54:34 +0000903 (defvar emerge-startup-hook)
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000904 (add-hook 'emerge-startup-hook 'viper-change-state-to-emacs)
34da0a2b Michael Kifer1996-09-06 01:17:30 +0000905
241d963d
MK
Michael Kifer2002-04-16 05:49:11 +0000906 ;; if viper is started from .emacs, it might be impossible to get certain
907 ;; info about the display and windows until emacs initialization is complete
908 ;; So do it via the window-setup-hook
909 (add-hook 'window-setup-hook
4f91a816
SM
Stefan Monnier2011-05-23 14:57:17 -0300910 (lambda ()
911 (modify-frame-parameters
912 (selected-frame)
913 (list (cons 'viper-vi-state-cursor-color
914 (viper-get-cursor-color))))
915 (setq viper-vi-state-cursor-color (viper-get-cursor-color))
916 ))
b93e5ce2 Michael Kifer2002-01-09 17:33:15 +0000917
34da0a2b Michael Kifer1996-09-06 01:17:30 +0000918 ;; Tell vc-diff to put *vc* in Vi mode
c3583c94
GM
Glenn Morris2009-11-14 04:37:00 +0000919 (eval-after-load
920 "vc"
921 '(defadvice vc-diff (after viper-vc-ad activate)
922 "Force Vi state in VC diff buffer."
923 (viper-change-state-to-vi)))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000924
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000925 (eval-after-load
4af0c23b Karl Heuer1995-06-09 00:09:26 +0000926 "emerge"
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +0000927 '(defadvice emerge-quit (after viper-emerge-advice activate)
928 "Run `viper-change-state-to-vi' after quitting emerge."
929 (viper-change-state-to-vi)))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000930
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000931 ;; passwd.el sets up its own buffer, which turns up in Vi mode,
3af0304a Michael Kifer1999-11-01 07:16:15 +0000932 ;; thus overriding the local map. We don't need Vi mode here.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000933 (eval-after-load
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000934 "passwd"
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000935 '(defadvice read-passwd-1 (before viper-passwd-ad activate)
cbd9191d Juanma Barranquero2006-11-06 02:31:07 +0000936 "Switch to Emacs state while reading password."
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000937 (viper-change-state-to-emacs)))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000938
8ea74b0e
MK
Michael Kifer2005-07-10 18:46:24 +0000939 (defadvice self-insert-command (around viper-self-insert-ad activate)
940 "Ignore all self-inserting keys in the vi-state."
3b1f2e09 Stefan Monnier2014-10-20 18:35:43 -0400941 ;; FIXME: Use remapping?
32226619 Juanma Barranquero2009-10-02 03:48:36 +0000942 (if (and (eq viper-current-state 'vi-state)
433d9ace
MK
Michael Kifer2009-11-22 03:14:14 +0000943 ;; Do not use called-interactively-p here. XEmacs does not have it
944 ;; and interactive-p is just fine.
945 ;; (called-interactively-p 'interactive))
946 (interactive-p))
8ea74b0e
MK
Michael Kifer2005-07-10 18:46:24 +0000947 (beep 1)
948 ad-do-it
949 ))
950
38685583
MK
Michael Kifer2005-08-06 16:58:54 +0000951 (defadvice set-cursor-color (after viper-set-cursor-color-ad activate)
952 "Change cursor color in VI state."
38685583
MK
Michael Kifer2005-08-06 16:58:54 +0000953 (modify-frame-parameters
954 (selected-frame)
955 (list (cons 'viper-vi-state-cursor-color (ad-get-arg 0))))
65efc538 Michael Kifer2008-01-09 06:16:07 +0000956 (setq viper-vi-state-cursor-color (ad-get-arg 0))
38685583
MK
Michael Kifer2005-08-06 16:58:54 +0000957 )
958
8ea74b0e
MK
Michael Kifer2005-07-10 18:46:24 +0000959 (when (and (fboundp 'add-to-ordered-list) (boundp 'emulation-mode-map-alists))
960 ;; needs to be as early as possible
961 (add-to-ordered-list
962 'emulation-mode-map-alists 'viper--intercept-key-maps 100)
963 ;; needs to be after cua-mode
964 (add-to-ordered-list 'emulation-mode-map-alists 'viper--key-maps 500)
965 )
966
4af0c23b Karl Heuer1995-06-09 00:09:26 +0000967 ;; Emacs shell, ange-ftp, and comint-based modes
2eb4bdca Michael Kifer1998-05-04 22:42:59 +0000968 (add-hook 'comint-mode-hook 'viper-comint-mode-hook) ; comint
98c414c7 Miles Bader2006-01-30 03:16:50 +0000969 (add-hook 'erc-mode-hook 'viper-comint-mode-hook) ; ERC
34da0a2b Michael Kifer1996-09-06 01:17:30 +0000970
8ea74b0e
MK
Michael Kifer2005-07-10 18:46:24 +0000971 (add-hook 'eshell-mode-hook
972 (lambda () (setq viper-auto-indent nil)))
973
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000974 (viper-set-emacs-state-searchstyle-macros nil 'dired-mode) ; dired
975 (viper-set-emacs-state-searchstyle-macros nil 'tar-mode) ; tar
976 (viper-set-emacs-state-searchstyle-macros nil 'mh-folder-mode) ; mhe
977 (viper-set-emacs-state-searchstyle-macros nil 'gnus-group-mode) ; gnus
978 (viper-set-emacs-state-searchstyle-macros nil 'gnus-summary-mode)
979 (viper-set-emacs-state-searchstyle-macros nil 'Info-mode) ; info
980 (viper-set-emacs-state-searchstyle-macros nil 'Buffer-menu-mode) ;buffer-menu
34da0a2b Michael Kifer1996-09-06 01:17:30 +0000981
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +0000982 ;; Modify major modes according to viper-major-mode-modifier-list
983 (viper-apply-major-mode-modifiers)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +0000984
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +0000985 ;; For RMAIL users.
986 ;; Put buf in Emacs state after edit.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000987 (eval-after-load
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +0000988 "rmailedit"
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000989 '(defadvice rmail-cease-edit (after viper-rmail-advice activate)
cbd9191d Juanma Barranquero2006-11-06 02:31:07 +0000990 "Switch to Emacs state when done editing message."
8626cfa2 Michael Kifer1997-08-02 07:40:22 +0000991 (viper-change-state-to-emacs)))
34317da2
MK
Michael Kifer1997-08-22 03:15:57 +0000992
993 ;; ISO accents
994 ;; Need to do it after loading iso-acc, or else this loading will wipe out
995 ;; the advice.
996 (eval-after-load
997 "iso-acc"
90066cb5
RF
Romain Francoise2005-10-23 12:47:11 +0000998 '(defadvice iso-accents-mode (around viper-iso-accents-advice activate)
999 "Set viper-automatic-iso-accents to iso-accents-mode."
1000 (let ((arg (ad-get-arg 0)))
1001 ad-do-it
1002 (setq viper-automatic-iso-accents
1003 (if (eq viper-current-state 'vi-state)
1004 (if arg
1005 ;; if iso-accents-mode was called with positive arg, turn
1006 ;; accents on
1007 (> (prefix-numeric-value arg) 0)
1008 ;; else: toggle viper-automatic-iso-accents
1009 (not viper-automatic-iso-accents))
1010 ;; other states: accept what iso-accents-mode has done
1011 iso-accents-mode))
1012 ;; turn off ISO accents in vi-state
1013 (if (eq viper-current-state 'vi-state)
1014 (viper-set-iso-accents-mode nil))
1015 (if (memq viper-current-state '(vi-state insert-state replace-state))
1016 (message "Viper ISO accents mode: %s"
1017 (if viper-automatic-iso-accents "on" "off")))
1018 )))
34317da2
MK
Michael Kifer1997-08-22 03:15:57 +00001019
1020 ;; International input methods
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001021 (if (featurep 'emacs)
34317da2 Michael Kifer1997-08-22 03:15:57 +00001022 (eval-after-load "mule-cmds"
90066cb5 Romain Francoise2005-10-23 12:47:11 +00001023 '(progn
72b255c7 Paul Eggert2012-07-29 00:16:45 -07001024 (defadvice deactivate-input-method (after viper-mule-advice activate)
90066cb5 Romain Francoise2005-10-23 12:47:11 +00001025 "Set viper-special-input-method to disable intl. input methods."
72b255c7 Paul Eggert2012-07-29 00:16:45 -07001026 (viper-deactivate-input-method-action))
90066cb5
RF
Romain Francoise2005-10-23 12:47:11 +00001027 (defadvice activate-input-method (after viper-mule-advice activate)
1028 "Set viper-special-input-method to enable intl. input methods."
1029 (viper-activate-input-method-action))
1030 ))
34317da2
MK
Michael Kifer1997-08-22 03:15:57 +00001031 ;; XEmacs Although these hooks exist in Emacs, they don't seem to be always
1032 ;; called on input-method activation/deactivation, so we the above advise
1033 ;; functions instead.
1034 (eval-after-load "mule-cmds"
90066cb5
RF
Romain Francoise2005-10-23 12:47:11 +00001035 '(progn
1036 (add-hook 'input-method-activate-hook
1037 'viper-activate-input-method-action t)
72b255c7
PE
Paul Eggert2012-07-29 00:16:45 -07001038 (add-hook 'input-method-deactivate-hook
1039 'viper-deactivate-input-method-action t)))
34317da2
MK
Michael Kifer1997-08-22 03:15:57 +00001040 )
1041 (eval-after-load "mule-cmds"
90066cb5
RF
Romain Francoise2005-10-23 12:47:11 +00001042 '(defadvice toggle-input-method (around viper-mule-advice activate)
1043 "Adjust input-method toggling in vi-state."
1044 (if (and viper-special-input-method (eq viper-current-state 'vi-state))
72b255c7 Paul Eggert2012-07-29 00:16:45 -07001045 (viper-deactivate-input-method)
90066cb5 Romain Francoise2005-10-23 12:47:11 +00001046 ad-do-it)))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001047
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001048 ) ; viper-set-hooks
726e270f Michael Kifer1997-06-09 04:00:50 +00001049
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001050
1051;; these are primarily advices and Vi-ish variable settings
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001052(defun viper-non-hook-settings ()
1053
83f49acb
MK
Michael Kifer2006-08-25 16:06:57 +00001054 ;;;; Viper changes the default mode-line-buffer-identification
1055 ;;(setq-default mode-line-buffer-identification '(" %b"))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001056
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001057 ;; setup emacs-supported vi-style feel
1058 (setq next-line-add-newlines nil
1059 require-final-newline t)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001060
e36a387d Michael Kifer1997-06-18 01:26:55 +00001061 ;; don't bark when mark is inactive
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001062 (if (featurep 'emacs)
5489c3d3 Michael Kifer1997-07-18 18:55:36 +00001063 (setq mark-even-if-inactive t))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001064
e36a387d Michael Kifer1997-06-18 01:26:55 +00001065 (setq scroll-step 1)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001066
e36a387d Michael Kifer1997-06-18 01:26:55 +00001067 ;; Variable displaying the current Viper state in the mode line.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001068 (or (memq 'viper-mode-string global-mode-string)
e36a387d Michael Kifer1997-06-18 01:26:55 +00001069 (setq global-mode-string
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001070 (append '("" viper-mode-string) (cdr global-mode-string))))
e36a387d Michael Kifer1997-06-18 01:26:55 +00001071
0e52cd13 Glenn Morris2008-03-01 20:11:47 +00001072 (if (featurep 'xemacs)
2ee00512
MK
Michael Kifer2008-04-03 21:04:18 +00001073 ;; XEmacs
1074 (defadvice describe-key (before viper-describe-key-ad protect activate)
1075 "Force to read key via `viper-read-key-sequence'."
1076 (interactive (list (viper-read-key-sequence "Describe key: "))))
1077 ;; Emacs
1078 (defadvice describe-key (before viper-describe-key-ad protect activate)
1079 "Force to read key via `viper-read-key-sequence'."
1080 (interactive (let (key)
1081 (setq key (viper-read-key-sequence
1082 "Describe key (or click or menu item): "))
1083 (list key
1084 (prefix-numeric-value current-prefix-arg)
1085 ;; If KEY is a down-event, read also the
1086 ;; corresponding up-event.
1087 (and (vectorp key)
1088 (let ((last-idx (1- (length key))))
1089 (and (eventp (aref key last-idx))
1090 (memq 'down (event-modifiers
1091 (aref key last-idx)))))
1092 (or (and (eventp (aref key 0))
1093 (memq 'down (event-modifiers
1094 (aref key 0)))
1095 ;; For the C-down-mouse-2 popup menu,
1096 ;; there is no subsequent up-event
1097 (= (length key) 1))
1098 (and (> (length key) 1)
1099 (eventp (aref key 1))
1100 (memq 'down (event-modifiers (aref key 1)))))
1101 (read-event))))))
1102 ) ; (if (featurep 'xemacs)
53964682 Paul Eggert2011-11-19 01:18:31 -08001103
0e52cd13 Glenn Morris2008-03-01 20:11:47 +00001104 (if (featurep 'xemacs)
2ee00512
MK
Michael Kifer2008-04-03 21:04:18 +00001105 ;; XEmacs
1106 (defadvice describe-key-briefly
1107 (before viper-describe-key-briefly-ad protect activate)
1108 "Force to read key via `viper-read-key-sequence'."
1109 (interactive (list (viper-read-key-sequence "Describe key briefly: "))))
1110 ;; Emacs
1111 (defadvice describe-key-briefly
1112 (before viper-describe-key-briefly-ad protect activate)
1113 "Force to read key via `viper-read-key-sequence'."
1114 (interactive (let (key)
1115 (setq key (viper-read-key-sequence
1116 "Describe key (or click or menu item): "))
1117 ;; If KEY is a down-event, read and discard the
1118 ;; corresponding up-event.
1119 (and (vectorp key)
1120 (let ((last-idx (1- (length key))))
1121 (and (eventp (aref key last-idx))
1122 (memq 'down (event-modifiers (aref key last-idx)))))
1123 (read-event))
1124 (list key
1125 (if current-prefix-arg
1126 (prefix-numeric-value current-prefix-arg))
1127 1))))
1128 ) ; (if (featurep 'xemacs)
53964682 Paul Eggert2011-11-19 01:18:31 -08001129
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001130 (defadvice find-file (before viper-add-suffix-advice activate)
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001131 "Use `read-file-name' for reading arguments."
1132 (interactive (cons (read-file-name "Find file: " nil default-directory)
560ef11a Michael Kifer2000-06-05 00:07:02 +00001133 ;; XEmacs: if Mule & prefix arg, ask for coding system
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001134 (cond ((and (featurep 'xemacs) (featurep 'mule))
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +00001135 (list
1136 (and current-prefix-arg
560ef11a
MK
Michael Kifer2000-06-05 00:07:02 +00001137 (read-coding-system "Coding-system: "))))
1138 ;; Emacs: do wildcards
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001139 ((and (featurep 'emacs) (boundp 'find-file-wildcards))
560ef11a
MK
Michael Kifer2000-06-05 00:07:02 +00001140 (list find-file-wildcards))))
1141 ))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001142
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001143 (defadvice find-file-other-window (before viper-add-suffix-advice activate)
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001144 "Use `read-file-name' for reading arguments."
1145 (interactive (cons (read-file-name "Find file in other window: "
1146 nil default-directory)
560ef11a Michael Kifer2000-06-05 00:07:02 +00001147 ;; XEmacs: if Mule & prefix arg, ask for coding system
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001148 (cond ((and (featurep 'xemacs) (featurep 'mule))
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +00001149 (list
1150 (and current-prefix-arg
560ef11a
MK
Michael Kifer2000-06-05 00:07:02 +00001151 (read-coding-system "Coding-system: "))))
1152 ;; Emacs: do wildcards
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001153 ((and (featurep 'emacs) (boundp 'find-file-wildcards))
560ef11a
MK
Michael Kifer2000-06-05 00:07:02 +00001154 (list find-file-wildcards))))
1155 ))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001156
1e70790f Michael Kifer1997-07-17 19:37:07 +00001157
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001158 (defadvice find-file-other-frame (before viper-add-suffix-advice activate)
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001159 "Use `read-file-name' for reading arguments."
1160 (interactive (cons (read-file-name "Find file in other frame: "
1161 nil default-directory)
560ef11a Michael Kifer2000-06-05 00:07:02 +00001162 ;; XEmacs: if Mule & prefix arg, ask for coding system
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001163 (cond ((and (featurep 'xemacs) (featurep 'mule))
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +00001164 (list
1165 (and current-prefix-arg
560ef11a
MK
Michael Kifer2000-06-05 00:07:02 +00001166 (read-coding-system "Coding-system: "))))
1167 ;; Emacs: do wildcards
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001168 ((and (featurep 'emacs) (boundp 'find-file-wildcards))
560ef11a
MK
Michael Kifer2000-06-05 00:07:02 +00001169 (list find-file-wildcards))))
1170 ))
1e70790f Michael Kifer1997-07-17 19:37:07 +00001171
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001172
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001173 (defadvice read-file-name (around viper-suffix-advice activate)
1174 "Tell `exit-minibuffer' to run `viper-file-add-suffix' as a hook."
96dffd25 Michael Kifer1997-09-05 04:48:58 +00001175 (let ((viper-minibuffer-exit-hook
2eb4bdca
MK
Michael Kifer1998-05-04 22:42:59 +00001176 (append viper-minibuffer-exit-hook
1177 '(viper-minibuffer-trim-tail viper-file-add-suffix))))
e36a387d Michael Kifer1997-06-18 01:26:55 +00001178 ad-do-it))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001179
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001180 (defadvice start-kbd-macro (after viper-kbd-advice activate)
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001181 "Remove Viper's intercepting bindings for C-x ).
1182 This may be needed if the previous `:map' command terminated abnormally."
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001183 (define-key viper-vi-intercept-map "\C-x)" nil)
1184 (define-key viper-insert-intercept-map "\C-x)" nil)
1185 (define-key viper-emacs-intercept-map "\C-x)" nil))
41497c90 Michael Kifer1997-08-07 04:48:48 +00001186
8ea74b0e
MK
Michael Kifer2005-07-10 18:46:24 +00001187 (defadvice add-minor-mode (after
1188 viper-advice-add-minor-mode
1189 (toggle name &optional keymap after toggle-fun)
1190 activate)
38685583
MK
Michael Kifer2005-08-06 16:58:54 +00001191 "Run viper-normalize-minor-mode-map-alist after adding a minor mode."
1192 (viper-normalize-minor-mode-map-alist)
1193 (unless
1194 (and (fboundp 'add-to-ordered-list) (boundp 'emulation-mode-map-alists))
1195 (setq-default minor-mode-map-alist minor-mode-map-alist)))
8ea74b0e Michael Kifer2005-07-10 18:46:24 +00001196
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +00001197 ;; catch frame switching event
1198 (if (viper-window-display-p)
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001199 (if (featurep 'xemacs)
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +00001200 (add-hook 'mouse-leave-frame-hook
1201 'viper-remember-current-frame)
1202 (defadvice handle-switch-frame (before viper-frame-advice activate)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001203 "Remember the selected frame before the switch-frame event."
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +00001204 (viper-remember-current-frame (selected-frame)))) )
1205
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001206 ) ; end viper-non-hook-settings
e36a387d Michael Kifer1997-06-18 01:26:55 +00001207
4960e757 Michael Kifer2001-07-21 05:28:24 +00001208
726e270f Michael Kifer1997-06-09 04:00:50 +00001209\f
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +00001210;; Ask only if this-command/last-command are nil, i.e., when loading
1211(cond ((and (eq viper-mode 'ask) (null this-command) (null last-command))
1212 (save-window-excursion
1213 (with-output-to-temp-buffer " *viper-info*"
1214 (princ "
cbd9191d Juanma Barranquero2006-11-06 02:31:07 +00001215You have loaded Viper, and are about to Viperize your Emacs!
e36a387d Michael Kifer1997-06-18 01:26:55 +00001216
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001217Viper is a Package for Emacs Rebels and a venomous VI PERil,
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001218
1219It's time to decide: to Viperize or not to Viperize...
1220
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001221If you wish to Viperize AND make this your way of life, please put
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001222
1223 (setq viper-mode t)
1224 (require 'viper)
1225
865fe16f Chong Yidong2012-09-17 13:41:04 +08001226in your init file (preferably, close to the top).
ece4bae5 Glenn Morris2014-01-26 18:02:28 -08001227These two lines must come in the order given."))
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +00001228 (if (y-or-n-p "Viperize? ")
1229 (setq viper-mode t)
1230 (setq viper-mode nil))
1231 (message "")
1232 (kill-buffer " *viper-info*")))
1233
3af0304a Michael Kifer1999-11-01 07:16:15 +00001234 ;; If viper-mode is t, then just continue. Viper will kick in.
41497c90 Michael Kifer1997-08-07 04:48:48 +00001235 ((eq viper-mode t))
2eb4bdca Michael Kifer1998-05-04 22:42:59 +00001236 ;; Otherwise, it was asking Viper was not loaded through .emacs
41497c90 Michael Kifer1997-08-07 04:48:48 +00001237 ;; In this case, it was either through M-x viper-mode or via something
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001238 ;; else, like the custom widget. If Viper was loaded through
41497c90
MK
Michael Kifer1997-08-07 04:48:48 +00001239 ;; M-x viper-mode, then viper will kick in anyway.
1240 (t (setq viper-mode nil)))
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001241
1242(defun viper-load-custom-file ()
1243 (if (and (file-exists-p viper-custom-file-name)
1244 (not noninteractive))
1245 (load viper-custom-file-name)))
e36a387d Michael Kifer1997-06-18 01:26:55 +00001246
726e270f
MK
Michael Kifer1997-06-09 04:00:50 +00001247
1248
1249\f
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +00001250
1251
1252;; save non-viper vars that Viper might change
1253(if (null viper-saved-non-viper-variables)
1254 (setq viper-saved-non-viper-variables
1255 (list
14acf2f5 Stefan Monnier2009-08-28 17:02:53 +00001256 (cons 'default-major-mode (list (default-value 'major-mode)))
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +00001257 (cons 'next-line-add-newlines (list next-line-add-newlines))
1258 (cons 'require-final-newline (list require-final-newline))
1e70790f
MK
Michael Kifer1997-07-17 19:37:07 +00001259 (cons 'scroll-step (list scroll-step))
1260 (cons 'mode-line-buffer-identification
1261 (list (default-value 'mode-line-buffer-identification)))
1262 (cons 'global-mode-string (list global-mode-string))
e83d1fe8 Dan Nicolaescu2007-11-09 05:20:57 +00001263 (if (featurep 'emacs)
5489c3d3 Michael Kifer1997-07-18 18:55:36 +00001264 (cons 'mark-even-if-inactive (list mark-even-if-inactive)))
1e70790f Michael Kifer1997-07-17 19:37:07 +00001265 )))
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +00001266
1267
e36a387d Michael Kifer1997-06-18 01:26:55 +00001268;; Set some useful macros, advices
ece4bae5
GM
Glenn Morris2014-01-26 18:02:28 -08001269;; These must be BEFORE viper-custom-file-name is loaded,
1270;; so the user can unrecord them in viper-custom-file-name.
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001271(if viper-mode
1272 (progn
1273 ;; set advices and some variables that give emacs Vi look.
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001274 (viper-non-hook-settings)
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001275
1276 ;; repeat the 2nd previous command without rotating the command history
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001277 (viper-record-kbd-macro
1278 (vector viper-repeat-from-history-key '\1) 'vi-state
1279 [(meta x) v i p e r - r e p e a t - f r o m - h i s t o r y return] 't)
e36a387d Michael Kifer1997-06-18 01:26:55 +00001280 ;; repeat the 3d previous command without rotating the command history
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001281 (viper-record-kbd-macro
1282 (vector viper-repeat-from-history-key '\2) 'vi-state
1283 [(meta x) v i p e r - r e p e a t - f r o m - h i s t o r y return] 't)
a1506d29
JB
Juanma Barranquero2003-02-04 13:24:35 +00001284
1285 ;; set macros for toggling case sensitivity and regexp search
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001286 (viper-set-searchstyle-toggling-macros nil)
e36a387d Michael Kifer1997-06-18 01:26:55 +00001287 ;; Make %%% toggle parsing comments for matching parentheses
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001288 (viper-set-parsing-style-toggling-macro nil)
1289
ece4bae5 Glenn Morris2014-01-26 18:02:28 -08001290 ;; viper-custom-file-name is loaded if exists
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001291 (viper-load-custom-file)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001292
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001293 ;; should be after loading custom file to avoid the pesky msg that
1294 ;; mouse-search/insert keys are already bound
1295 (viper-bind-mouse-search-key)
1296 (viper-bind-mouse-insert-key)
e36a387d Michael Kifer1997-06-18 01:26:55 +00001297 ))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001298
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001299
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001300\f
ece4bae5 Glenn Morris2014-01-26 18:02:28 -08001301;; Applying Viper customization -- runs after (load viper-custom-file-name)
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001302
8971f87b Pavel Janík2001-11-16 18:37:52 +00001303;; Save user settings or Viper defaults for vars controlled by
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001304;; viper-expert-level
1e70790f Michael Kifer1997-07-17 19:37:07 +00001305(if (null viper-saved-user-settings)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001306 (setq viper-saved-user-settings
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001307 (list (cons 'viper-want-ctl-h-help (list viper-want-ctl-h-help))
1e70790f Michael Kifer1997-07-17 19:37:07 +00001308 (cons 'viper-always (list viper-always))
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001309 (cons 'viper-no-multiple-ESC (list viper-no-multiple-ESC))
1310 (cons 'viper-ex-style-motion (list viper-ex-style-motion))
34317da2
MK
Michael Kifer1997-08-22 03:15:57 +00001311 (cons 'viper-ex-style-editing
1312 (list viper-ex-style-editing))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001313 (cons 'viper-want-emacs-keys-in-vi
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001314 (list viper-want-emacs-keys-in-vi))
1315 (cons 'viper-electric-mode (list viper-electric-mode))
1316 (cons 'viper-want-emacs-keys-in-insert
1317 (list viper-want-emacs-keys-in-insert))
1318 (cons 'viper-re-search (list viper-re-search)))))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001319
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001320
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001321(if viper-mode
1322 (progn
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001323 (viper-set-minibuffer-style)
1324 (if viper-buffer-search-char
1325 (viper-buffer-search-enable))
34317da2 Michael Kifer1997-08-22 03:15:57 +00001326 (viper-update-syntax-classes 'set-default)
e36a387d Michael Kifer1997-06-18 01:26:55 +00001327 ))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001328
d5e52f99 Michael Kifer1997-06-02 22:50:31 +00001329\f
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001330;;; Familiarize Viper with some minor modes that have their own keymaps
e36a387d
MK
Michael Kifer1997-06-18 01:26:55 +00001331(if viper-mode
1332 (progn
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001333 (viper-harness-minor-mode "compile")
1334 (viper-harness-minor-mode "outline")
1335 (viper-harness-minor-mode "allout")
1336 (viper-harness-minor-mode "xref")
1337 (viper-harness-minor-mode "lmenu")
1338 (viper-harness-minor-mode "vc")
1339 (viper-harness-minor-mode "ltx-math") ; LaTeX-math-mode in AUC-TeX, which
1340 (viper-harness-minor-mode "latex") ; sits in one of these two files
1341 (viper-harness-minor-mode "cyrillic")
1342 (viper-harness-minor-mode "russian")
1343 (viper-harness-minor-mode "view-less")
1344 (viper-harness-minor-mode "view")
2eb4bdca Michael Kifer1998-05-04 22:42:59 +00001345 (viper-harness-minor-mode "reftex")
3af0304a Michael Kifer1999-11-01 07:16:15 +00001346 (viper-harness-minor-mode "flyspell")
e36a387d Michael Kifer1997-06-18 01:26:55 +00001347 ))
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +00001348
1349
1350;; Intercept maps could go in viper-keym.el
ece4bae5 Glenn Morris2014-01-26 18:02:28 -08001351;; We keep them here in case someone redefines them in viper-custom-file-name
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001352
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001353(define-key viper-vi-intercept-map viper-ESC-key 'viper-intercept-ESC-key)
1354(define-key viper-insert-intercept-map viper-ESC-key 'viper-intercept-ESC-key)
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001355
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001356;; This is taken care of by viper-insert-global-user-map.
1357;;(define-key viper-replace-map viper-ESC-key 'viper-intercept-ESC-key)
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001358
34da0a2b Michael Kifer1996-09-06 01:17:30 +00001359
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001360;; The default viper-toggle-key is \C-z; for the novice, it suspends or
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001361;; iconifies Emacs
8626cfa2
MK
Michael Kifer1997-08-02 07:40:22 +00001362(define-key viper-vi-intercept-map viper-toggle-key 'viper-toggle-key-action)
1363(define-key
1364 viper-emacs-intercept-map viper-toggle-key 'viper-change-state-to-vi)
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001365
38685583 Michael Kifer2005-08-06 16:58:54 +00001366;;; Removed to avoid bad interaction with cua-mode.
328b4b70 Michael Kifer1997-11-01 01:46:51 +00001367;;; Escape from Emacs and Insert modes to Vi for one command
38685583
MK
Michael Kifer2005-08-06 16:58:54 +00001368;;(define-key viper-emacs-intercept-map "\C-c\\" 'viper-escape-to-vi)
1369;;(define-key viper-insert-intercept-map "\C-c\\" 'viper-escape-to-vi)
328b4b70
MK
Michael Kifer1997-11-01 01:46:51 +00001370
1371(if viper-mode
c004db97
MK
Michael Kifer1997-11-25 02:10:08 +00001372 (setq-default viper-emacs-intercept-minor-mode t
1373 viper-emacs-local-user-minor-mode t
1374 viper-emacs-global-user-minor-mode t
1375 viper-emacs-kbd-minor-mode t
1376 viper-emacs-state-modifier-minor-mode t))
1377(if (and viper-mode (eq viper-current-state 'emacs-state))
1378 (setq viper-emacs-intercept-minor-mode t
1379 viper-emacs-local-user-minor-mode t
1380 viper-emacs-global-user-minor-mode t
1381 viper-emacs-kbd-minor-mode t
1382 viper-emacs-state-modifier-minor-mode t))
6c2e12f4
KH
Karl Heuer1995-02-20 23:15:10 +00001383
1384
e36a387d Michael Kifer1997-06-18 01:26:55 +00001385(if (and viper-mode
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001386 (or viper-always
1e70790f Michael Kifer1997-07-17 19:37:07 +00001387 (and (< viper-expert-level 5) (> viper-expert-level 0))))
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001388 (viper-set-hooks))
a1506d29 Juanma Barranquero2003-02-04 13:24:35 +00001389
2550055a
MK
Michael Kifer2001-01-19 07:13:03 +00001390;; Let all minor modes take effect after loading.
1391;; This may not be enough, so we also set default minor-mode-alist.
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001392;; Without setting the default, new buffers that come up in emacs mode have
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001393;; minor-mode-map-alist = nil, unless we call viper-change-state-*
328b4b70 Michael Kifer1997-11-01 01:46:51 +00001394(if (and viper-mode (eq viper-current-state 'emacs-state))
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001395 (progn
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001396 (viper-change-state-to-emacs)
38685583
MK
Michael Kifer2005-08-06 16:58:54 +00001397 (unless
1398 (and (fboundp 'add-to-ordered-list)
1399 (boundp 'emulation-mode-map-alists))
1400 (setq-default minor-mode-map-alist minor-mode-map-alist))
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001401 ))
2eb4bdca Michael Kifer1998-05-04 22:42:59 +00001402
4960e757 Michael Kifer2001-07-21 05:28:24 +00001403(if (and viper-mode (this-major-mode-requires-vi-state major-mode))
2eb4bdca Michael Kifer1998-05-04 22:42:59 +00001404 (viper-mode))
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001405
2550055a
MK
Michael Kifer2001-01-19 07:13:03 +00001406(if viper-mode
1407 (setq initial-major-mode
1408 `(lambda ()
1409 (funcall (quote ,initial-major-mode))
1410 (set-viper-state-in-major-mode))
1411 ))
1412
1413
d5e52f99 Michael Kifer1997-06-02 22:50:31 +00001414
8626cfa2 Michael Kifer1997-08-02 07:40:22 +00001415(run-hooks 'viper-load-hook) ; the last chance to change something
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001416
d5e52f99 Michael Kifer1997-06-02 22:50:31 +00001417(provide 'viper)
6c2e12f4 Karl Heuer1995-02-20 23:15:10 +00001418
1e70790f Michael Kifer1997-07-17 19:37:07 +00001419
e2de3a29
MK
Michael Kifer2005-10-06 00:09:49 +00001420;; Local Variables:
1421;; eval: (put 'viper-deflocalvar 'lisp-indent-hook 'defun)
1422;; End:
1e70790f Michael Kifer1997-07-17 19:37:07 +00001423
60370d40 Pavel Janík2001-07-15 19:53:53 +00001424;;; viper.el ends here