Merge from emacs-23
[bpt/emacs.git] / lisp / emulation / viper-init.el
CommitLineData
9b70a748
MK
1;;; viper-init.el --- some common definitions for Viper
2
5fd6d89f 3;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5df4f04c 4;; 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
9b70a748 5
50a07e18 6;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
bd78fa1d 7;; Package: viper
02f34c70 8
9b70a748
MK
9;; This file is part of GNU Emacs.
10
ed0f493f 11;; GNU Emacs is free software: you can redistribute it and/or modify
9b70a748 12;; it under the terms of the GNU General Public License as published by
ed0f493f
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
9b70a748
MK
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
ed0f493f 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
9b70a748 23
60370d40
PJ
24;;; Commentary:
25
26;;; Code:
9b70a748 27
9b70a748
MK
28;; compiler pacifier
29(defvar mark-even-if-inactive)
34317da2
MK
30(defvar quail-mode)
31(defvar iso-accents-mode)
32(defvar viper-current-state)
726e270f 33(defvar viper-version)
1e70790f 34(defvar viper-expert-level)
2eb4bdca
MK
35(defvar current-input-method)
36(defvar default-input-method)
37(defvar describe-current-input-method-function)
50a07e18 38(defvar bar-cursor)
50a07e18 39(defvar cursor-type)
9b70a748
MK
40;; end pacifier
41
726e270f
MK
42
43;; Viper version
44(defun viper-version ()
45 (interactive)
f1097063 46 (message "Viper version is %s" viper-version))
726e270f 47
9b70a748 48;; Tell whether we are running as a window application or on a TTY
50a07e18 49
8626cfa2 50(defsubst viper-device-type ()
ce8fc80b
GM
51 (if (featurep 'xemacs)
52 (device-type (selected-device))
53 window-system))
50a07e18 54
3f9526a3
MK
55(defun viper-color-display-p ()
56 (condition-case nil
ce8fc80b
GM
57 (if (featurep 'xemacs)
58 (eq (device-class (selected-device)) 'color)
59 (display-color-p))
3f9526a3
MK
60 (error nil)))
61
9b70a748 62;; in XEmacs: device-type is tty on tty and stream in batch.
8626cfa2
MK
63(defun viper-window-display-p ()
64 (and (viper-device-type) (not (memq (viper-device-type) '(tty stream pc)))))
9b70a748 65
72bc50c0
GM
66(defcustom viper-ms-style-os-p
67 (memq system-type (if (featurep 'emacs) '(ms-dos windows-nt)
68 '(ms-dos windows-nt windows-95)))
69 "Non-nil if Emacs is running under an MS-style OS: MS-DOS, or MS-Windows."
1e70790f
MK
70 :type 'boolean
71 :tag "Is it Microsoft-made OS?"
8e41a31c 72 :group 'viper-misc)
1e70790f 73
ac64a728
MK
74(defcustom viper-suppress-input-method-change-message nil
75 "If t, the message notifying about changes in the input method is not displayed.
76Normally, a message is displayed each time on enters the vi, insert or replace
77state."
78 :type 'boolean
79 :group 'viper-misc)
80
8626cfa2 81(defcustom viper-force-faces nil
9b70a748 82 "If t, Viper will think that it is running on a display that supports faces.
1e70790f
MK
83This is provided as a temporary relief for users of graphics-capable terminals
84that Viper doesn't know about.
85In all likelihood, you don't need to bother with this setting."
86 :type 'boolean
8e41a31c 87 :group 'viper-highlighting)
9b70a748 88
8626cfa2
MK
89(defun viper-has-face-support-p ()
90 (cond ((viper-window-display-p))
91 (viper-force-faces)
3f9526a3 92 ((viper-color-display-p))
e83d1fe8
DN
93 ((featurep 'emacs) (memq (viper-device-type) '(pc)))
94 ((featurep 'xemacs) (memq (viper-device-type) '(tty pc)))))
9b70a748
MK
95
96\f
97;;; Macros
98
8626cfa2 99(defmacro viper-deflocalvar (var default-value &optional documentation)
f1097063
SS
100 `(progn
101 (defvar ,var ,default-value
102 ,(format "%s\n\(buffer local\)" documentation))
103 (make-variable-buffer-local ',var)))
9b70a748 104
34317da2
MK
105;; (viper-loop COUNT BODY) Execute BODY COUNT times.
106(defmacro viper-loop (count &rest body)
f1097063
SS
107 `(let ((count ,count))
108 (while (> count 0)
109 ,@body
110 (setq count (1- count)))))
9b70a748 111
8626cfa2 112(defmacro viper-buffer-live-p (buf)
f1097063
SS
113 `(and ,buf (get-buffer ,buf) (buffer-name (get-buffer ,buf))))
114
9b70a748 115;; return buffer-specific macro definition, given a full macro definition
8626cfa2 116(defmacro viper-kbd-buf-alist (macro-elt)
f1097063 117 `(nth 1 ,macro-elt))
9b70a748 118;; get a pair: (curr-buffer . macro-definition)
8626cfa2 119(defmacro viper-kbd-buf-pair (macro-elt)
f1097063 120 `(assoc (buffer-name) (viper-kbd-buf-alist ,macro-elt)))
9b70a748 121;; get macro definition for current buffer
8626cfa2 122(defmacro viper-kbd-buf-definition (macro-elt)
f1097063
SS
123 `(cdr (viper-kbd-buf-pair ,macro-elt)))
124
9b70a748 125;; return mode-specific macro definitions, given a full macro definition
8626cfa2 126(defmacro viper-kbd-mode-alist (macro-elt)
f1097063 127 `(nth 2 ,macro-elt))
9b70a748 128;; get a pair: (major-mode . macro-definition)
8626cfa2 129(defmacro viper-kbd-mode-pair (macro-elt)
f1097063 130 `(assoc major-mode (viper-kbd-mode-alist ,macro-elt)))
9b70a748 131;; get macro definition for the current major mode
8626cfa2 132(defmacro viper-kbd-mode-definition (macro-elt)
f1097063
SS
133 `(cdr (viper-kbd-mode-pair ,macro-elt)))
134
9b70a748 135;; return global macro definition, given a full macro definition
8626cfa2 136(defmacro viper-kbd-global-pair (macro-elt)
f1097063 137 `(nth 3 ,macro-elt))
9b70a748 138;; get global macro definition from an elt of macro-alist
8626cfa2 139(defmacro viper-kbd-global-definition (macro-elt)
f1097063
SS
140 `(cdr (viper-kbd-global-pair ,macro-elt)))
141
9b70a748 142;; last elt of a sequence
8626cfa2 143(defsubst viper-seq-last-elt (seq)
9b70a748 144 (elt seq (1- (length seq))))
34317da2
MK
145
146(defsubst viper-string-to-list (string)
147 (append (vconcat string) nil))
148
149(defsubst viper-charlist-to-string (list)
150 (mapconcat 'char-to-string list ""))
151
152;; like char-after/before, but saves typing
153(defun viper-char-at-pos (direction &optional offset)
154 (or (integerp offset) (setq offset 0))
155 (if (eq direction 'forward)
156 (char-after (+ (point) offset))
157 (char-before (- (point) offset))))
f1097063 158
9b70a748 159\f
8626cfa2
MK
160(defvar viper-minibuffer-overlay-priority 300)
161(defvar viper-replace-overlay-priority 400)
162(defvar viper-search-overlay-priority 500)
f1097063 163
9b70a748
MK
164\f
165;;; Viper minor modes
166
9b70a748 167;; Mode for vital things like \e, C-z.
8626cfa2 168(viper-deflocalvar viper-vi-intercept-minor-mode nil)
9b70a748 169
8626cfa2 170(viper-deflocalvar viper-vi-basic-minor-mode nil
9b70a748 171 "Viper's minor mode for Vi bindings.")
f1097063 172
8626cfa2 173(viper-deflocalvar viper-vi-local-user-minor-mode nil
9b70a748
MK
174 "Auxiliary minor mode for user-defined local bindings in Vi state.")
175
8626cfa2 176(viper-deflocalvar viper-vi-global-user-minor-mode nil
9b70a748
MK
177 "Auxiliary minor mode for user-defined global bindings in Vi state.")
178
8626cfa2 179(viper-deflocalvar viper-vi-state-modifier-minor-mode nil
9b70a748
MK
180 "Minor mode used to make major-mode-specific modification to Vi state.")
181
8626cfa2 182(viper-deflocalvar viper-vi-diehard-minor-mode nil
9b70a748
MK
183 "This minor mode is in effect when the user wants Viper to be Vi.")
184
8626cfa2 185(viper-deflocalvar viper-vi-kbd-minor-mode nil
9b70a748
MK
186 "Minor mode for Ex command macros in Vi state.
187The corresponding keymap stores key bindings of Vi macros defined with
188the Ex command :map.")
189
190;; Mode for vital things like \e, C-z.
8626cfa2 191(viper-deflocalvar viper-insert-intercept-minor-mode nil)
9b70a748 192
8626cfa2 193(viper-deflocalvar viper-insert-basic-minor-mode nil
9b70a748
MK
194 "Viper's minor mode for bindings in Insert mode.")
195
8626cfa2 196(viper-deflocalvar viper-insert-local-user-minor-mode nil
9b70a748
MK
197 "Auxiliary minor mode for buffer-local user-defined bindings in Insert state.
198This is a way to overshadow normal Insert mode bindings locally to certain
199designated buffers.")
200
8626cfa2 201(viper-deflocalvar viper-insert-global-user-minor-mode nil
9b70a748
MK
202 "Auxiliary minor mode for global user-defined bindings in Insert state.")
203
8626cfa2 204(viper-deflocalvar viper-insert-state-modifier-minor-mode nil
9b70a748
MK
205 "Minor mode used to make major-mode-specific modification to Insert state.")
206
8626cfa2 207(viper-deflocalvar viper-insert-diehard-minor-mode nil
9b70a748
MK
208 "Minor mode that simulates Vi very closely.
209Not recommened, except for the novice user.")
210
8626cfa2 211(viper-deflocalvar viper-insert-kbd-minor-mode nil
9b70a748
MK
212"Minor mode for Ex command macros Insert state.
213The corresponding keymap stores key bindings of Vi macros defined with
214the Ex command :map!.")
215
8626cfa2 216(viper-deflocalvar viper-replace-minor-mode nil
9b70a748
MK
217 "Minor mode in effect in replace state (cw, C, and the like commands).")
218
328b4b70 219;; Mode for vital things like \C-z and \C-x) This is set to t, when viper-mode
3af0304a
MK
220;; is invoked. So, any new buffer will have C-z defined as switch to Vi,
221;; unless we switched states in this buffer
328b4b70 222(viper-deflocalvar viper-emacs-intercept-minor-mode nil)
f1097063 223
328b4b70 224(viper-deflocalvar viper-emacs-local-user-minor-mode nil
9b70a748
MK
225 "Minor mode for local user bindings effective in Emacs state.
226Users can use it to override Emacs bindings when Viper is in its Emacs
f1097063
SS
227state.")
228
328b4b70 229(viper-deflocalvar viper-emacs-global-user-minor-mode nil
9b70a748
MK
230 "Minor mode for global user bindings in effect in Emacs state.
231Users can use it to override Emacs bindings when Viper is in its Emacs
f1097063 232state.")
9b70a748 233
328b4b70 234(viper-deflocalvar viper-emacs-kbd-minor-mode nil
9b70a748
MK
235 "Minor mode for Vi style macros in Emacs state.
236The corresponding keymap stores key bindings of Vi macros defined with
3af0304a 237`viper-record-kbd-macro' command. There is no Ex-level command to do this
9b70a748
MK
238interactively.")
239
328b4b70 240(viper-deflocalvar viper-emacs-state-modifier-minor-mode nil
9b70a748
MK
241 "Minor mode used to make major-mode-specific modification to Emacs state.
242For instance, a Vi purist may want to bind `dd' in Dired mode to a function
243that deletes a file.")
244
8626cfa2 245(viper-deflocalvar viper-vi-minibuffer-minor-mode nil
9b70a748
MK
246 "Minor mode that forces Vi-style when the Minibuffer is in Vi state.")
247
8626cfa2 248(viper-deflocalvar viper-insert-minibuffer-minor-mode nil
9b70a748 249 "Minor mode that forces Vi-style when the Minibuffer is in Insert state.")
f1097063 250
9b70a748
MK
251\f
252
253;; Some common error messages
254
8626cfa2
MK
255(defconst viper-SpuriousText "Spurious text after command" "")
256(defconst viper-BadExCommand "Not an editor command" "")
257(defconst viper-InvalidCommandArgument "Invalid command argument" "")
258(defconst viper-NoPrevSearch "No previous search string" "")
259(defconst viper-EmptyRegister "`%c': Nothing in this register" "")
260(defconst viper-InvalidRegister "`%c': Invalid register" "")
261(defconst viper-EmptyTextmarker "`%c': Text marker doesn't point anywhere" "")
262(defconst viper-InvalidTextmarker "`%c': Invalid text marker" "")
263(defconst viper-InvalidViCommand "Invalid command" "")
264(defconst viper-BadAddress "Ill-formed address" "")
265(defconst viper-FirstAddrExceedsSecond "First address exceeds second" "")
266(defconst viper-NoFileSpecified "No file specified" "")
9b70a748 267
f1097063 268;; Is t until viper-mode executes for the very first time.
9b70a748 269;; Prevents recursive descend into startup messages.
8626cfa2 270(defvar viper-first-time t)
9b70a748 271
8626cfa2 272(defvar viper-expert-level (if (boundp 'viper-expert-level) viper-expert-level 0)
9b70a748 273 "User's expert level.
8626cfa2
MK
274The minor mode viper-vi-diehard-minor-mode is in effect when
275viper-expert-level is 1 or 2 or when viper-want-emacs-keys-in-vi is t.
276The minor mode viper-insert-diehard-minor-mode is in effect when
277viper-expert-level is 1 or 2 or if viper-want-emacs-keys-in-insert is t.
1e70790f 278Use `M-x viper-set-expert-level' to change this.")
9b70a748 279
3af0304a 280;; Max expert level supported by Viper. This is NOT a user option.
9b70a748 281;; It is here to make it hard for the user from resetting it.
1e70790f 282(defconst viper-max-expert-level 5)
9b70a748 283
9b70a748 284
34317da2
MK
285;;; ISO characters and MULE
286
287;; If non-nil, ISO accents will be turned on in insert/replace emacs states and
288;; turned off in vi-state. For some users, this behavior may be too
3af0304a 289;; primitive. In this case, use insert/emacs/vi state hooks.
8626cfa2 290(viper-deflocalvar viper-automatic-iso-accents nil "")
3af0304a 291;; Set iso-accents-mode to ARG. Check if it is bound first
34317da2
MK
292(defsubst viper-set-iso-accents-mode (arg)
293 (if (boundp 'iso-accents-mode)
294 (setq iso-accents-mode arg)))
f1097063 295
34317da2
MK
296;; Internal flag used to control when viper mule hooks are run.
297;; Don't change this!
298(defvar viper-mule-hook-flag t)
3af0304a 299;; If non-nil, the default intl. input method is turned on.
34317da2 300(viper-deflocalvar viper-special-input-method nil "")
f1097063 301
34317da2
MK
302;; viper hook to run on input-method activation
303(defun viper-activate-input-method-action ()
304 (if (null viper-mule-hook-flag)
305 ()
306 (setq viper-special-input-method t)
307 ;; turn off special input methods in vi-state
308 (if (eq viper-current-state 'vi-state)
309 (viper-set-input-method nil))
ac64a728
MK
310 (if (and (memq viper-current-state '(vi-state insert-state replace-state))
311 (not viper-suppress-input-method-change-message))
34317da2
MK
312 (message "Viper special input method%s: on"
313 (if (or current-input-method default-input-method)
f1097063 314 (format " %S"
34317da2
MK
315 (or current-input-method default-input-method))
316 "")))
317 ))
2eb4bdca 318
34317da2
MK
319;; viper hook to run on input-method deactivation
320(defun viper-inactivate-input-method-action ()
321 (if (null viper-mule-hook-flag)
322 ()
323 (setq viper-special-input-method nil)
ac64a728
MK
324 (if (and (memq viper-current-state '(vi-state insert-state replace-state))
325 (not viper-suppress-input-method-change-message))
34317da2
MK
326 (message "Viper special input method%s: off"
327 (if (or current-input-method default-input-method)
328 (format " %S"
329 (or current-input-method default-input-method))
330 "")))))
331
332(defun viper-inactivate-input-method ()
e83d1fe8 333 (cond ((and (featurep 'emacs) (fboundp 'inactivate-input-method))
34317da2 334 (inactivate-input-method))
e83d1fe8 335 ((and (featurep 'xemacs) (boundp 'current-input-method))
ce8fc80b 336 ;; XEmacs had broken quail-mode for some time, so we are working around
f1097063 337 ;; it here
34317da2
MK
338 (setq quail-mode nil)
339 (if (featurep 'quail)
340 (quail-delete-overlays))
341 (setq describe-current-input-method-function nil)
342 (setq current-input-method nil)
343 (run-hooks 'input-method-inactivate-hook)
344 (force-mode-line-update))
345 ))
346(defun viper-activate-input-method ()
e83d1fe8 347 (cond ((and (featurep 'emacs) (fboundp 'activate-input-method))
34317da2 348 (activate-input-method default-input-method))
b674ceaf
RS
349 ((featurep 'xemacs)
350 (if (fboundp 'quail-mode) (quail-mode 1)))))
34317da2
MK
351
352;; Set quail-mode to ARG
353(defun viper-set-input-method (arg)
354 (setq viper-mule-hook-flag t) ; just a precaution
ac64a728 355 (let (viper-mule-hook-flag) ; temporarily deactivate viper mule hooks
34317da2
MK
356 (cond ((and arg (> (prefix-numeric-value arg) 0) default-input-method)
357 ;; activate input method
358 (viper-activate-input-method))
359 (t ; deactivate input method
360 (viper-inactivate-input-method)))
361 ))
362
9b70a748
MK
363
364;; VI-style Undo
365
366;; Used to 'undo' complex commands, such as replace and insert commands.
8626cfa2
MK
367(viper-deflocalvar viper-undo-needs-adjustment nil)
368(put 'viper-undo-needs-adjustment 'permanent-local t)
9b70a748
MK
369
370;; A mark that Viper puts on buffer-undo-list. Marks the beginning of a
3af0304a 371;; complex command that must be undone atomically. If inserted, it is
8626cfa2
MK
372;; erased by viper-change-state-to-vi and viper-repeat.
373(defconst viper-buffer-undo-list-mark 'viper)
9b70a748 374
8626cfa2 375(defcustom viper-keep-point-on-undo nil
9b70a748 376 "*Non-nil means not to move point while undoing commands.
3af0304a 377This style is different from Emacs and Vi. Try it to see if
1e70790f
MK
378it better fits your working style."
379 :type 'boolean
380 :tag "Preserve Position of Point After Undo"
f1097063 381 :group 'viper)
9b70a748
MK
382
383;; Replace mode and changing text
384
2eb4bdca 385;; Hack used to pass global states around for short period of time
8626cfa2
MK
386(viper-deflocalvar viper-intermediate-command nil "")
387
388;; This is used to pass the right Vi command key sequence to
389;; viper-set-destructive-command whenever (this-command-keys) doesn't give the
3af0304a
MK
390;; right result. For instance, in commands like c/bla<RET>,
391;; (this-command-keys) will return ^M, which invoked exit-minibuffer, while we
f1097063 392;; need "c/"
8626cfa2 393(defconst viper-this-command-keys nil)
9b70a748
MK
394
395;; Indicates that the current destructive command has started in replace mode.
8626cfa2 396(viper-deflocalvar viper-began-as-replace nil "")
9b70a748 397
8626cfa2 398(defcustom viper-allow-multiline-replace-regions t
9b70a748
MK
399 "If non-nil, Viper will allow multi-line replace regions.
400This is an extension to standard Vi.
401If nil, commands that attempt to replace text spanning multiple lines first
1e70790f
MK
402delete the text being replaced, as in standard Vi."
403 :type 'boolean
404 :group 'viper)
405
8626cfa2 406(defcustom viper-replace-overlay-cursor-color "Red"
1e70790f
MK
407 "*Cursor color when Viper is in Replace state."
408 :type 'string
409 :group 'viper)
38685583 410
8626cfa2 411(defcustom viper-insert-state-cursor-color "Green"
1e70790f
MK
412 "Cursor color when Viper is in insert state."
413 :type 'string
414 :group 'viper)
9b70a748 415
83f49acb
MK
416;; viper-emacs-state-cursor-color doesn't work well. Causes cursor colors to be
417;; confused in some cases. So, this var is nulled for now.
418;; (defcustom viper-emacs-state-cursor-color "Magenta"
419(defcustom viper-emacs-state-cursor-color nil
a6fb441a 420 "Cursor color when Viper is in Emacs state."
b6178721
MK
421 :type 'string
422 :group 'viper)
b6178721 423
3af0304a
MK
424;; internal var, used to remember the default cursor color of emacs frames
425(defvar viper-vi-state-cursor-color nil)
cbfcb1d0 426
ce8fc80b
GM
427;; Frame-local variables are obsolete from Emacs 22.2 onwards, so we
428;; do it by hand with viper-frame-value (qv).
429(when (and (featurep 'xemacs)
430 (fboundp 'make-variable-frame-local))
431 (make-variable-frame-local 'viper-replace-overlay-cursor-color)
432 (make-variable-frame-local 'viper-insert-state-cursor-color)
433 (make-variable-frame-local 'viper-emacs-state-cursor-color)
434 (make-variable-frame-local 'viper-vi-state-cursor-color))
f1097063 435
8626cfa2
MK
436(viper-deflocalvar viper-replace-overlay nil "")
437(put 'viper-replace-overlay 'permanent-local t)
9b70a748 438
8626cfa2 439(defcustom viper-replace-region-end-delimiter "$"
9b70a748 440 "A string marking the end of replacement regions.
8626cfa2 441It is used only with TTYs or if `viper-use-replace-region-delimiters'
1e70790f
MK
442is non-nil."
443 :type 'string
444 :group 'viper)
8626cfa2 445(defcustom viper-replace-region-start-delimiter ""
9b70a748 446 "A string marking the beginning of replacement regions.
8626cfa2 447It is used only with TTYs or if `viper-use-replace-region-delimiters'
1e70790f
MK
448is non-nil."
449 :type 'string
450 :group 'viper)
f1097063 451(defcustom viper-use-replace-region-delimiters
96dffd25 452 (or (not (viper-has-face-support-p))
e83d1fe8 453 (and (featurep 'xemacs) (eq (viper-device-type) 'tty)))
8626cfa2
MK
454 "*If non-nil, Viper will always use `viper-replace-region-end-delimiter' and
455`viper-replace-region-start-delimiter' to delimit replacement regions, even on
3af0304a 456color displays. By default, the delimiters are used only on TTYs."
1e70790f
MK
457 :type 'boolean
458 :group 'viper)
3af0304a
MK
459
460(defcustom viper-read-buffer-function 'read-buffer
461 "Function to use for prompting the user for a buffer name."
462 :type 'symbol
463 :group 'viper)
f1097063 464
9b70a748 465;; XEmacs requires glyphs
ce8fc80b
GM
466(when (featurep 'xemacs)
467 (or (glyphp viper-replace-region-end-delimiter)
468 (setq viper-replace-region-end-delimiter
469 (make-glyph viper-replace-region-end-delimiter)))
470 (or (glyphp viper-replace-region-start-delimiter)
471 (setq viper-replace-region-start-delimiter
472 (make-glyph viper-replace-region-start-delimiter))))
f1097063 473
9b70a748 474;; These are local marker that must be initialized to nil and moved with
8626cfa2 475;; `viper-move-marker-locally'
9b70a748
MK
476;;
477;; Remember the last position inside the replace region.
8626cfa2 478(viper-deflocalvar viper-last-posn-in-replace-region nil)
9b70a748 479;; Remember the last position while inserting
8626cfa2
MK
480(viper-deflocalvar viper-last-posn-while-in-insert-state nil)
481(put 'viper-last-posn-in-replace-region 'permanent-local t)
482(put 'viper-last-posn-while-in-insert-state 'permanent-local t)
9b70a748 483
8626cfa2
MK
484(viper-deflocalvar viper-sitting-in-replace nil "")
485(put 'viper-sitting-in-replace 'permanent-local t)
f1097063 486
9b70a748
MK
487;; Remember the number of characters that have to be deleted in replace
488;; mode to compensate for the inserted characters.
8626cfa2 489(viper-deflocalvar viper-replace-chars-to-delete 0 "")
34317da2 490;; This variable is used internally by the before/after changed functions to
3af0304a 491;; determine how many chars were deleted by the change. This can't be
34317da2
MK
492;; determined inside after-change-functions because those get the length of the
493;; deleted region, not the number of chars deleted (which are two different
494;; things under MULE).
495(viper-deflocalvar viper-replace-region-chars-deleted 0 "")
9b70a748
MK
496
497;; Insertion ring and command ring
8626cfa2 498(defcustom viper-insertion-ring-size 14
1e70790f
MK
499 "The size of history of inserted text.
500This is a list where Viper keeps the history of previously inserted pieces of
501text."
502 :type 'integer
8e41a31c 503 :group 'viper-misc)
9b70a748 504;; The insertion ring.
8626cfa2 505(defvar viper-insertion-ring nil)
3af0304a 506;; This is temp insertion ring. Used to do rotation for display purposes.
8626cfa2
MK
507;; When rotation just started, it is initialized to viper-insertion-ring.
508(defvar viper-temp-insertion-ring nil)
509(defvar viper-last-inserted-string-from-insertion-ring "")
9b70a748 510
8626cfa2 511(defcustom viper-command-ring-size 14
1e70790f
MK
512 "The size of history of Vi commands repeatable with dot."
513 :type 'integer
8e41a31c 514 :group 'viper-misc)
9b70a748 515;; The command ring.
8626cfa2 516(defvar viper-command-ring nil)
3af0304a 517;; This is temp command ring. Used to do rotation for display purposes.
8626cfa2
MK
518;; When rotation just started, it is initialized to viper-command-ring.
519(defvar viper-temp-command-ring nil)
9b70a748 520
1e70790f 521;; Fast keyseq and ESC keyseq timeouts
8626cfa2 522(defcustom viper-fast-keyseq-timeout 200
1e70790f 523 "*Key sequence separated by no more than this many milliseconds is viewed as a Vi-style macro, if such a macro is defined.
3af0304a 524Setting this too high may slow down your typing. Setting this value too low
751d3bc4 525will make it hard to use Vi-style timeout macros."
1e70790f 526 :type 'integer
8e41a31c 527 :group 'viper-misc)
1e70790f 528
8c3ad6c4
MK
529;; This function determines if ESC key sequences are to be translated into
530;; commands.
531(defun viper-translate-all-ESC-keysequences ()
532 (not (viper-window-display-p)))
55d7ff38 533
9b70a748
MK
534;; Modes and related variables
535
536;; Current mode. One of: `emacs-state', `vi-state', `insert-state'
8626cfa2 537(viper-deflocalvar viper-current-state 'emacs-state)
9b70a748
MK
538
539
540;; Autoindent in insert
541
542;; Variable that keeps track of whether C-t has been pressed.
8626cfa2 543(viper-deflocalvar viper-cted nil "")
9b70a748
MK
544
545;; Preserve the indent value, used by C-d in insert mode.
8626cfa2 546(viper-deflocalvar viper-current-indent 0)
9b70a748
MK
547
548;; Whether to preserve the indent, used by C-d in insert mode.
8626cfa2 549(viper-deflocalvar viper-preserve-indent nil)
9b70a748 550
8626cfa2
MK
551(viper-deflocalvar viper-auto-indent nil "")
552(defcustom viper-auto-indent nil
1e70790f
MK
553 "*Enable autoindent, if t.
554This is a buffer-local variable."
555 :type 'boolean
556 :group 'viper)
557
8626cfa2
MK
558(viper-deflocalvar viper-electric-mode t "")
559(defcustom viper-electric-mode t
1e70790f
MK
560 "*If t, electrify Viper.
561Currently, this only electrifies auto-indentation, making it appropriate to the
562mode of the buffer.
563This means that auto-indentation will depart from standard Vi and will indent
3af0304a 564appropriate to the mode of the buffer. This is especially useful for editing
1e70790f
MK
565programs and LaTeX documents."
566 :type 'boolean
567 :group 'viper)
568
8626cfa2 569(defcustom viper-shift-width 8
2eb4bdca
MK
570 "*The value of the shiftwidth.
571This determines the number of columns by which the Ctl-t moves the cursor in
572the Insert state."
1e70790f
MK
573 :type 'integer
574 :group 'viper)
9b70a748
MK
575
576;; Variables for repeating destructive commands
577
8626cfa2 578(defcustom viper-keep-point-on-repeat t
9b70a748
MK
579 "*If t, don't move point when repeating previous command.
580This is useful for doing repeated changes with the '.' key.
581The user can change this to nil, if she likes when the cursor moves
1e70790f
MK
582to a new place after repeating previous Vi command."
583 :type 'boolean
f1097063 584 :group 'viper)
9b70a748
MK
585
586;; Remember insert point as a marker. This is a local marker that must be
8626cfa2
MK
587;; initialized to nil and moved with `viper-move-marker-locally'.
588(viper-deflocalvar viper-insert-point nil)
589(put 'viper-insert-point 'permanent-local t)
9b70a748
MK
590
591;; This remembers the point before dabbrev-expand was called.
8626cfa2
MK
592;; If viper-insert-point turns out to be bigger than that, it is reset
593;; back to viper-pre-command-point.
9b70a748
MK
594;; The reason this is needed is because dabbrev-expand (and possibly
595;; others) may jump to before the insertion point, delete something and
3af0304a 596;; then reinsert a bigger piece. For instance: bla^blo
8626cfa2 597;; If dabbrev-expand is called after `blo' and ^ undicates viper-insert-point,
3af0304a
MK
598;; then point jumps to the beginning of `blo'. If expansion is found, `blablo'
599;; is deleted, and we have |^, where | denotes point. Next, dabbrev-expand
9b70a748
MK
600;; will insert the expansion, and we get: blablo^
601;; Whatever we insert next goes before the ^, i.e., before the
3af0304a
MK
602;; viper-insert-point marker. So, Viper will think that nothing was
603;; inserted. Remembering the orig position of the marker circumvents the
9b70a748
MK
604;; problem.
605;; We don't know of any command, except dabbrev-expand, that has the same
3af0304a 606;; problem. However, the same trick can be used if such a command is
9b70a748
MK
607;; discovered later.
608;;
8626cfa2
MK
609(viper-deflocalvar viper-pre-command-point nil)
610(put 'viper-pre-command-point 'permanent-local t) ; this is probably an overkill
9b70a748
MK
611
612;; This is used for saving inserted text.
8626cfa2 613(defvar viper-last-insertion nil)
f1097063 614
9b70a748 615;; Remembers the last replaced region.
8626cfa2 616(defvar viper-last-replace-region "")
f1097063 617
9b70a748 618;; Remember com point as a marker.
3af0304a 619;; This is a local marker. Should be moved with `viper-move-marker-locally'
8626cfa2 620(viper-deflocalvar viper-com-point nil)
9b70a748
MK
621
622;; If non-nil, the value is a list (M-COM VAL COM REG inserted-text cmd-keys)
623;; It is used to re-execute last destructive command.
624;; M-COM is a Lisp symbol representing the function to be executed.
625;; VAL is the prefix argument that was used with that command.
626;; COM is an internal descriptor, such as ?r, ?c, ?C, which contains
627;; additional information on how the function in M-COM is to be handled.
628;; REG is the register used by command
629;; INSERTED-TEXT is text inserted by that command (in case of o, c, C, i, r
630;; commands).
631;; COMMAND-KEYS are the keys that were typed to invoke the command.
8626cfa2 632(defvar viper-d-com nil)
9b70a748
MK
633
634;; The character remembered by the Vi `r' command.
8626cfa2 635(defvar viper-d-char nil)
9b70a748
MK
636
637;; Name of register to store deleted or yanked strings
8626cfa2 638(defvar viper-use-register nil)
9b70a748
MK
639
640
34317da2 641;;; Variables for Moves and Searches
9b70a748 642
8e41a31c
MK
643(defgroup viper-search nil
644 "Variables that define the search and query-replace behavior of Viper."
645 :prefix "viper-"
646 :group 'viper)
647
9b70a748 648;; For use by `;' command.
8626cfa2 649(defvar viper-f-char nil)
9b70a748
MK
650
651;; For use by `.' command.
8626cfa2 652(defvar viper-F-char nil)
9b70a748
MK
653
654;; For use by `;' command.
8626cfa2 655(defvar viper-f-forward nil)
9b70a748
MK
656
657;; For use by `;' command.
8626cfa2 658(defvar viper-f-offset nil)
9b70a748
MK
659
660;; Last search string
8626cfa2 661(defvar viper-s-string "")
9b70a748 662
8626cfa2 663(defcustom viper-quote-string "> "
1e70790f
MK
664 "String inserted at the beginning of quoted region."
665 :type 'string
666 :group 'viper)
9b70a748
MK
667
668;; If t, search is forward.
8626cfa2 669(defvar viper-s-forward nil)
9b70a748 670
8626cfa2 671(defcustom viper-case-fold-search nil
1e70790f
MK
672 "*If not nil, search ignores cases."
673 :type 'boolean
8e41a31c 674 :group 'viper-search)
9b70a748 675
8626cfa2 676(defcustom viper-re-search t
1e70790f
MK
677 "*If not nil, search is regexp search, otherwise vanilla search."
678 :type 'boolean
679 :tag "Regexp Search"
8e41a31c 680 :group 'viper-search)
9b70a748 681
8626cfa2 682(defcustom viper-search-scroll-threshold 2
9b70a748
MK
683 "*If search lands within this threshnold from the window top/bottom,
684the window will be scrolled up or down appropriately, to reveal context.
685If you want Viper search to behave as usual in Vi, set this variable to a
1e70790f
MK
686negative number."
687 :type 'boolean
8e41a31c 688 :group 'viper-search)
1e70790f 689
8626cfa2 690(defcustom viper-re-query-replace t
1e70790f
MK
691 "*If t then do regexp replace, if nil then do string replace."
692 :type 'boolean
693 :tag "Regexp Query Replace"
8e41a31c 694 :group 'viper-search)
1e70790f 695
8626cfa2 696(defcustom viper-re-replace t
3af0304a 697 "*If t, do regexp replace. nil means do string replace."
1e70790f
MK
698 :type 'boolean
699 :tag "Regexp Replace"
8e41a31c 700 :group 'viper-search)
1e70790f 701
8626cfa2 702(defcustom viper-parse-sexp-ignore-comments t
1e70790f
MK
703 "*If t, `%' ignores the parentheses that occur inside comments."
704 :type 'boolean
705 :group 'viper)
706
8626cfa2
MK
707(viper-deflocalvar viper-ex-style-motion t "")
708(defcustom viper-ex-style-motion t
1e70790f
MK
709 "*If t, the commands l,h do not cross lines, etc (Ex-style).
710If nil, these commands cross line boundaries."
711 :type 'boolean
712 :group 'viper)
713
34317da2
MK
714(viper-deflocalvar viper-ex-style-editing t "")
715(defcustom viper-ex-style-editing t
716 "*If t, Ex-style behavior while editing in Vi command and insert states.
717`Backspace' and `Delete' don't cross line boundaries in insert.
718`X' and `x' can't delete characters across line boundary in Vi, etc.
1e70790f 719Note: this doesn't preclude `Backspace' and `Delete' from deleting characters
3af0304a 720by moving past the insertion point. This is a feature, not a bug.
34317da2
MK
721
722If nil, the above commands can work across lines."
1e70790f
MK
723 :type 'boolean
724 :group 'viper)
725
34317da2 726(viper-deflocalvar viper-ESC-moves-cursor-back viper-ex-style-editing "")
8626cfa2 727(defcustom viper-ESC-moves-cursor-back nil
1e70790f 728 "*If t, ESC moves cursor back when changing from insert to vi state.
34317da2 729If nil, the cursor stays where it was when ESC was hit."
1e70790f
MK
730 :type 'boolean
731 :group 'viper)
732
8626cfa2
MK
733(viper-deflocalvar viper-delete-backwards-in-replace nil "")
734(defcustom viper-delete-backwards-in-replace nil
9b70a748 735 "*If t, DEL key will delete characters while moving the cursor backwards.
1e70790f
MK
736If nil, the cursor will move backwards without deleting anything."
737 :type 'boolean
738 :group 'viper)
739
8626cfa2 740(defcustom viper-buffer-search-char nil
3af0304a 741 "*Key used for buffer-searching. Must be a character type, e.g., ?g."
1e70790f 742 :type '(choice (const nil) character)
8e41a31c 743 :group 'viper-search)
1e70790f 744
a5254f37 745(defcustom viper-search-wrap-around t
1e70790f
MK
746 "*If t, search wraps around."
747 :type 'boolean
748 :tag "Search Wraps Around"
8e41a31c 749 :group 'viper-search)
f1097063 750
8626cfa2
MK
751(viper-deflocalvar viper-related-files-and-buffers-ring nil "")
752(defcustom viper-related-files-and-buffers-ring nil
1e70790f
MK
753 "*List of file and buffer names that are considered to be related to the current buffer.
754Related buffers can be cycled through via :R and :P commands."
755 :type 'boolean
8e41a31c 756 :group 'viper-misc)
8626cfa2 757(put 'viper-related-files-and-buffers-ring 'permanent-local t)
9b70a748
MK
758
759;; Used to find out if we are done with searching the current buffer.
8626cfa2 760(viper-deflocalvar viper-local-search-start-marker nil)
9b70a748 761;; As above, but global
8626cfa2 762(defvar viper-search-start-marker (make-marker))
9b70a748
MK
763
764;; the search overlay
8626cfa2 765(viper-deflocalvar viper-search-overlay nil)
9b70a748
MK
766
767
f1097063 768(defvar viper-heading-start
9b70a748
MK
769 (concat "^\\s-*(\\s-*defun\\s-\\|" ; lisp
770 "^{\\s-*$\\|^[_a-zA-Z][^()]*[()].*{\\s-*$\\|" ; C/C++
771 "^\\s-*class.*{\\|^\\s-*struct.*{\\|^\\s-*enum.*{\\|"
772 "^\\\\[sb][a-z]*{.*}\\s-*$\\|" ; latex
773 "^@node\\|@table\\|^@m?enu\\|^@itemize\\|^@if\\|" ; texinfo
774 "^.+:-") ; prolog
3af0304a 775 "*Regexps for Headings. Used by \[\[ and \]\].")
9b70a748 776
f1097063 777(defvar viper-heading-end
9b70a748
MK
778 (concat "^}\\|" ; C/C++
779 "^\\\\end{\\|" ; latex
780 "^@end \\|" ; texinfo
781 ")\n\n[ \t\n]*\\|" ; lisp
782 "\\.\\s-*$") ; prolog
3af0304a 783 "*Regexps to end Headings/Sections. Used by \[\].")
9b70a748
MK
784
785
786;; These two vars control the interaction of jumps performed by ' and `.
787;; In this new version, '' doesn't erase the marks set by ``, so one can
cf503f7c 788;; use both kinds of jumps interchangeably and without losing positions
9b70a748
MK
789;; inside the lines.
790
791;; Remembers position of the last jump done using ``'.
8626cfa2 792(viper-deflocalvar viper-last-jump nil)
9b70a748 793;; Remembers position of the last jump done using `''.
8626cfa2 794(viper-deflocalvar viper-last-jump-ignore 0)
9b70a748
MK
795
796;; History variables
797
798;; History of search strings.
8626cfa2 799(defvar viper-search-history (list ""))
9b70a748 800;; History of query-replace strings used as a source.
8626cfa2 801(defvar viper-replace1-history nil)
9b70a748 802;; History of query-replace strings used as replacement.
8626cfa2 803(defvar viper-replace2-history nil)
9b70a748 804;; History of region quoting strings.
8626cfa2 805(defvar viper-quote-region-history (list viper-quote-string))
9b70a748 806;; History of Ex-style commands.
8626cfa2 807(defvar viper-ex-history nil)
9b70a748 808;; History of shell commands.
8626cfa2 809(defvar viper-shell-history nil)
9b70a748
MK
810
811
3af0304a 812;; Last shell command. There are two of these, one for Ex (in viper-ex)
9b70a748
MK
813;; and one for Vi.
814
815;; Last shell command executed with ! command.
8626cfa2 816(defvar viper-last-shell-com nil)
9b70a748 817
41497c90
MK
818\f
819;;; Face-saving tricks
820
41497c90
MK
821(defgroup viper-highlighting nil
822 "Hilighting of replace region, search pattern, minibuffer, etc."
823 :prefix "viper-"
824 :group 'viper)
825
41497c90 826
25c06649 827(defface viper-search
41497c90 828 '((((class color)) (:foreground "Black" :background "khaki"))
2d30d788 829 (t (:underline t :stipple "gray3")))
41497c90
MK
830 "*Face used to flash out the search pattern."
831 :group 'viper-highlighting)
3af0304a 832;; An internal variable. Viper takes the face from here.
25c06649 833(defvar viper-search-face 'viper-search
8e41a31c 834 "Face used to flash out the search pattern.
3af0304a 835DO NOT CHANGE this variable. Instead, use the customization widget
8ea74b0e 836to customize the actual face object `viper-search'
8e41a31c 837this variable represents.")
41497c90 838
25c06649 839(defface viper-replace-overlay
41497c90 840 '((((class color)) (:foreground "Black" :background "darkseagreen2"))
2d30d788 841 (t (:underline t :stipple "gray3")))
41497c90
MK
842 "*Face for highlighting replace regions on a window display."
843 :group 'viper-highlighting)
3af0304a 844;; An internal variable. Viper takes the face from here.
25c06649 845(defvar viper-replace-overlay-face 'viper-replace-overlay
8e41a31c 846 "Face for highlighting replace regions on a window display.
3af0304a 847DO NOT CHANGE this variable. Instead, use the customization widget
8ea74b0e 848to customize the actual face object `viper-replace-overlay'
8e41a31c 849this variable represents.")
41497c90 850
25c06649 851(defface viper-minibuffer-emacs
41497c90 852 '((((class color)) (:foreground "Black" :background "darkseagreen2"))
e31c1fd5 853 (t (:weight bold)))
41497c90
MK
854 "Face used in the Minibuffer when it is in Emacs state."
855 :group 'viper-highlighting)
3af0304a 856;; An internal variable. Viper takes the face from here.
25c06649 857(defvar viper-minibuffer-emacs-face 'viper-minibuffer-emacs
8e41a31c 858 "Face used in the Minibuffer when it is in Emacs state.
3af0304a 859DO NOT CHANGE this variable. Instead, use the customization widget
8ea74b0e 860to customize the actual face object `viper-minibuffer-emacs'
8e41a31c 861this variable represents.")
41497c90 862
25c06649 863(defface viper-minibuffer-insert
41497c90 864 '((((class color)) (:foreground "Black" :background "pink"))
e31c1fd5 865 (t (:slant italic)))
41497c90
MK
866 "Face used in the Minibuffer when it is in Insert state."
867 :group 'viper-highlighting)
3af0304a 868;; An internal variable. Viper takes the face from here.
25c06649 869(defvar viper-minibuffer-insert-face 'viper-minibuffer-insert
8e41a31c 870 "Face used in the Minibuffer when it is in Insert state.
3af0304a 871DO NOT CHANGE this variable. Instead, use the customization widget
8ea74b0e 872to customize the actual face object `viper-minibuffer-insert'
8e41a31c 873this variable represents.")
41497c90 874
25c06649 875(defface viper-minibuffer-vi
41497c90
MK
876 '((((class color)) (:foreground "DarkGreen" :background "grey"))
877 (t (:inverse-video t)))
878 "Face used in the Minibuffer when it is in Vi state."
879 :group 'viper-highlighting)
3af0304a 880;; An internal variable. Viper takes the face from here.
25c06649 881(defvar viper-minibuffer-vi-face 'viper-minibuffer-vi
8e41a31c 882 "Face used in the Minibuffer when it is in Vi state.
3af0304a 883DO NOT CHANGE this variable. Instead, use the customization widget
8ea74b0e 884to customize the actual face object `viper-minibuffer-vi'
8e41a31c 885this variable represents.")
f1097063 886
41497c90 887;; the current face to be used in the minibuffer
8e41a31c
MK
888(viper-deflocalvar
889 viper-minibuffer-current-face viper-minibuffer-emacs-face "")
9b70a748
MK
890
891\f
892;;; Miscellaneous
893
8626cfa2 894(defvar viper-inhibit-startup-message nil
9b70a748
MK
895 "Whether Viper startup message should be inhibited.")
896
8626cfa2 897(defcustom viper-spell-function 'ispell-region
1e70790f
MK
898 "Spell function used by #s<move> command to spell."
899 :type 'function
8e41a31c 900 :group 'viper-misc)
9b70a748 901
8626cfa2 902(defcustom viper-tags-file-name "TAGS"
1e70790f
MK
903 "The tags file used by Viper."
904 :type 'string
8e41a31c 905 :group 'viper-misc)
9b70a748 906
3af0304a
MK
907(defcustom viper-change-notification-threshold 1
908 "Notify the user when this many lines or characters have been deleted/yanked.
909For line-deleting/yanking commands (like `dd', `yy'), the value denotes the
910number of lines. For character-based commands (such as `x', `dw', etc.), the
911value refers to the number of characters affected."
912 :type 'integer
913 :group 'viper-misc)
914
9b70a748
MK
915;; Minibuffer
916
8626cfa2 917(defcustom viper-vi-style-in-minibuffer t
9b70a748 918 "If t, use vi-style editing in minibuffer.
8626cfa2 919Should be set in `~/.viper' file."
1e70790f
MK
920 :type 'boolean
921 :group 'viper)
f1097063 922
9b70a748 923;; overlay used in the minibuffer to indicate which state it is in
8626cfa2 924(viper-deflocalvar viper-minibuffer-overlay nil)
3af0304a 925(put 'viper-minibuffer-overlay 'permanent-local t)
9b70a748
MK
926
927;; Hook, specific to Viper, which is run just *before* exiting the minibuffer.
2eb4bdca
MK
928;; This is needed because beginning with Emacs 19.26, the standard
929;; `minibuffer-exit-hook' is run *after* exiting the minibuffer
930(defvar viper-minibuffer-exit-hook nil)
f1097063 931
9b70a748
MK
932
933;; Mode line
8626cfa2 934(defconst viper-vi-state-id "<V> "
9b70a748 935 "Mode line tag identifying the Vi mode of Viper.")
8626cfa2 936(defconst viper-emacs-state-id "<E> "
9b70a748 937 "Mode line tag identifying the Emacs mode of Viper.")
8626cfa2 938(defconst viper-insert-state-id "<I> "
9b70a748 939 "Mode line tag identifying the Insert mode of Viper.")
8626cfa2 940(defconst viper-replace-state-id "<R> "
9b70a748
MK
941 "Mode line tag identifying the Replace mode of Viper.")
942
9b70a748 943
8e41a31c
MK
944(defgroup viper-hooks nil
945 "Viper hooks."
946 :prefix "viper-"
947 :group 'viper)
948
7d027816 949(defcustom viper-vi-state-hook 'viper-restore-cursor-type
1e70790f
MK
950 "*Hooks run just before the switch to Vi mode is completed."
951 :type 'hook
8e41a31c 952 :group 'viper-hooks)
7d027816 953(defcustom viper-insert-state-hook 'viper-set-insert-cursor-type
1e70790f
MK
954 "*Hooks run just before the switch to Insert mode is completed."
955 :type 'hook
8e41a31c 956 :group 'viper-hooks)
7d027816 957(defcustom viper-replace-state-hook 'viper-restore-cursor-type
1e70790f
MK
958 "*Hooks run just before the switch to Replace mode is completed."
959 :type 'hook
8e41a31c 960 :group 'viper-hooks)
7d027816 961(defcustom viper-emacs-state-hook 'viper-restore-cursor-type
1e70790f
MK
962 "*Hooks run just before the switch to Emacs mode is completed."
963 :type 'hook
8e41a31c 964 :group 'viper-hooks)
f1097063 965
8626cfa2 966(defcustom viper-load-hook nil
1e70790f
MK
967 "Hooks run just after loading Viper."
968 :type 'hook
8e41a31c 969 :group 'viper-hooks)
f1097063 970
7d027816 971(defun viper-restore-cursor-type ()
bea3997a 972 (condition-case nil
e83d1fe8 973 (if (featurep 'xemacs)
e2de3a29 974 (set (make-local-variable 'bar-cursor) nil)
009fdc2e 975 (setq cursor-type (default-value 'cursor-type)))
50a07e18 976 (error nil)))
7d027816
MK
977
978(defun viper-set-insert-cursor-type ()
e83d1fe8 979 (if (featurep 'xemacs)
e2de3a29 980 (set (make-local-variable 'bar-cursor) 2)
7d027816
MK
981 (setq cursor-type '(bar . 2))))
982
42acc581
MK
983(defun viper-ESC-keyseq-timeout ()
984 "*Key sequence beginning with ESC and separated by no more than this many milliseconds is considered to be generated by a keyboard function key.
985Setting this too high may slow down switching from insert to vi state. Setting
986this value too low will make it impossible to use function keys in insert mode
987on a dumb terminal."
988 (if (viper-window-display-p)
989 0 viper-fast-keyseq-timeout))
990
991
1e70790f 992
26a7f02f
GM
993(provide 'viper-init)
994
995
e2de3a29
MK
996;; Local Variables:
997;; eval: (put 'viper-deflocalvar 'lisp-indent-hook 'defun)
998;; End:
1e70790f 999
60370d40 1000;;; viper-init.el ends here