| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 |
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 |
|
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
(provide 'viper-init) |
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 |
(defvar mark-even-if-inactive) |
|---|
| 33 |
(defvar quail-mode) |
|---|
| 34 |
(defvar iso-accents-mode) |
|---|
| 35 |
(defvar viper-current-state) |
|---|
| 36 |
(defvar viper-version) |
|---|
| 37 |
(defvar viper-expert-level) |
|---|
| 38 |
(defvar current-input-method) |
|---|
| 39 |
(defvar default-input-method) |
|---|
| 40 |
(defvar describe-current-input-method-function) |
|---|
| 41 |
(defvar bar-cursor) |
|---|
| 42 |
(defvar default-cursor-type) |
|---|
| 43 |
(defvar cursor-type) |
|---|
| 44 |
|
|---|
| 45 |
|
|---|
| 46 |
|
|---|
| 47 |
|
|---|
| 48 |
(defun viper-version () |
|---|
| 49 |
(interactive) |
|---|
| 50 |
(message "Viper version is %s" viper-version)) |
|---|
| 51 |
|
|---|
| 52 |
|
|---|
| 53 |
(defconst viper-xemacs-p (string-match "XEmacs" emacs-version)) |
|---|
| 54 |
|
|---|
| 55 |
(defconst viper-emacs-p (not viper-xemacs-p)) |
|---|
| 56 |
|
|---|
| 57 |
|
|---|
| 58 |
|
|---|
| 59 |
|
|---|
| 60 |
|
|---|
| 61 |
|
|---|
| 62 |
|
|---|
| 63 |
(defmacro viper-cond-compile-for-xemacs-or-emacs (xemacs-form emacs-form) |
|---|
| 64 |
(if (string-match "XEmacs" emacs-version) |
|---|
| 65 |
xemacs-form emacs-form)) |
|---|
| 66 |
|
|---|
| 67 |
|
|---|
| 68 |
(defsubst viper-device-type () |
|---|
| 69 |
(viper-cond-compile-for-xemacs-or-emacs |
|---|
| 70 |
(device-type (selected-device)) |
|---|
| 71 |
window-system |
|---|
| 72 |
)) |
|---|
| 73 |
|
|---|
| 74 |
(defun viper-color-display-p () |
|---|
| 75 |
(condition-case nil |
|---|
| 76 |
(viper-cond-compile-for-xemacs-or-emacs |
|---|
| 77 |
(eq (device-class (selected-device)) 'color) |
|---|
| 78 |
(if (fboundp 'display-color-p) |
|---|
| 79 |
(display-color-p) |
|---|
| 80 |
(x-display-color-p)) |
|---|
| 81 |
) |
|---|
| 82 |
(error nil))) |
|---|
| 83 |
|
|---|
| 84 |
|
|---|
| 85 |
(defun viper-window-display-p () |
|---|
| 86 |
(and (viper-device-type) (not (memq (viper-device-type) '(tty stream pc))))) |
|---|
| 87 |
|
|---|
| 88 |
(defcustom viper-ms-style-os-p (memq system-type |
|---|
| 89 |
'(ms-dos windows-nt windows-95)) |
|---|
| 90 |
"Tells if Emacs is running under an MS-style OS: ms-dos, windows-nt, W95." |
|---|
| 91 |
:type 'boolean |
|---|
| 92 |
:tag "Is it Microsoft-made OS?" |
|---|
| 93 |
:group 'viper-misc) |
|---|
| 94 |
(defcustom viper-vms-os-p (memq system-type '(vax-vms axp-vms)) |
|---|
| 95 |
"Tells if Emacs is running under VMS." |
|---|
| 96 |
:type 'boolean |
|---|
| 97 |
:tag "Is it VMS?" |
|---|
| 98 |
:group 'viper-misc) |
|---|
| 99 |
|
|---|
| 100 |
(defcustom viper-force-faces nil |
|---|
| 101 |
"If t, Viper will think that it is running on a display that supports faces. |
|---|
| 102 |
This is provided as a temporary relief for users of graphics-capable terminals |
|---|
| 103 |
that Viper doesn't know about. |
|---|
| 104 |
In all likelihood, you don't need to bother with this setting." |
|---|
| 105 |
:type 'boolean |
|---|
| 106 |
:group 'viper-highlighting) |
|---|
| 107 |
|
|---|
| 108 |
(defun viper-has-face-support-p () |
|---|
| 109 |
(cond ((viper-window-display-p)) |
|---|
| 110 |
(viper-force-faces) |
|---|
| 111 |
((viper-color-display-p)) |
|---|
| 112 |
(viper-emacs-p (memq (viper-device-type) '(pc))) |
|---|
| 113 |
(viper-xemacs-p (memq (viper-device-type) '(tty pc))))) |
|---|
| 114 |
|
|---|
| 115 |
|
|---|
| 116 |
|
|---|
| 117 |
|
|---|
| 118 |
(defmacro viper-deflocalvar (var default-value &optional documentation) |
|---|
| 119 |
`(progn |
|---|
| 120 |
(defvar ,var ,default-value |
|---|
| 121 |
,(format "%s\n\(buffer local\)" documentation)) |
|---|
| 122 |
(make-variable-buffer-local ',var))) |
|---|
| 123 |
|
|---|
| 124 |
|
|---|
| 125 |
(defmacro viper-loop (count &rest body) |
|---|
| 126 |
`(let ((count ,count)) |
|---|
| 127 |
(while (> count 0) |
|---|
| 128 |
,@body |
|---|
| 129 |
(setq count (1- count))))) |
|---|
| 130 |
|
|---|
| 131 |
(defmacro viper-buffer-live-p (buf) |
|---|
| 132 |
`(and ,buf (get-buffer ,buf) (buffer-name (get-buffer ,buf)))) |
|---|
| 133 |
|
|---|
| 134 |
|
|---|
| 135 |
(defmacro viper-kbd-buf-alist (macro-elt) |
|---|
| 136 |
`(nth 1 ,macro-elt)) |
|---|
| 137 |
|
|---|
| 138 |
(defmacro viper-kbd-buf-pair (macro-elt) |
|---|
| 139 |
`(assoc (buffer-name) (viper-kbd-buf-alist ,macro-elt))) |
|---|
| 140 |
|
|---|
| 141 |
(defmacro viper-kbd-buf-definition (macro-elt) |
|---|
| 142 |
`(cdr (viper-kbd-buf-pair ,macro-elt))) |
|---|
| 143 |
|
|---|
| 144 |
|
|---|
| 145 |
(defmacro viper-kbd-mode-alist (macro-elt) |
|---|
| 146 |
`(nth 2 ,macro-elt)) |
|---|
| 147 |
|
|---|
| 148 |
(defmacro viper-kbd-mode-pair (macro-elt) |
|---|
| 149 |
`(assoc major-mode (viper-kbd-mode-alist ,macro-elt))) |
|---|
| 150 |
|
|---|
| 151 |
(defmacro viper-kbd-mode-definition (macro-elt) |
|---|
| 152 |
`(cdr (viper-kbd-mode-pair ,macro-elt))) |
|---|
| 153 |
|
|---|
| 154 |
|
|---|
| 155 |
(defmacro viper-kbd-global-pair (macro-elt) |
|---|
| 156 |
`(nth 3 ,macro-elt)) |
|---|
| 157 |
|
|---|
| 158 |
(defmacro viper-kbd-global-definition (macro-elt) |
|---|
| 159 |
`(cdr (viper-kbd-global-pair ,macro-elt))) |
|---|
| 160 |
|
|---|
| 161 |
|
|---|
| 162 |
(defsubst viper-seq-last-elt (seq) |
|---|
| 163 |
(elt seq (1- (length seq)))) |
|---|
| 164 |
|
|---|
| 165 |
(defsubst viper-string-to-list (string) |
|---|
| 166 |
(append (vconcat string) nil)) |
|---|
| 167 |
|
|---|
| 168 |
(defsubst viper-charlist-to-string (list) |
|---|
| 169 |
(mapconcat 'char-to-string list "")) |
|---|
| 170 |
|
|---|
| 171 |
|
|---|
| 172 |
(defun viper-char-at-pos (direction &optional offset) |
|---|
| 173 |
(or (integerp offset) (setq offset 0)) |
|---|
| 174 |
(if (eq direction 'forward) |
|---|
| 175 |
(char-after (+ (point) offset)) |
|---|
| 176 |
(char-before (- (point) offset)))) |
|---|
| 177 |
|
|---|
| 178 |
|
|---|
| 179 |
(defvar viper-minibuffer-overlay-priority 300) |
|---|
| 180 |
(defvar viper-replace-overlay-priority 400) |
|---|
| 181 |
(defvar viper-search-overlay-priority 500) |
|---|
| 182 |
|
|---|
| 183 |
|
|---|
| 184 |
|
|---|
| 185 |
|
|---|
| 186 |
|
|---|
| 187 |
(viper-deflocalvar viper-vi-intercept-minor-mode nil) |
|---|
| 188 |
|
|---|
| 189 |
(viper-deflocalvar viper-vi-basic-minor-mode nil |
|---|
| 190 |
"Viper's minor mode for Vi bindings.") |
|---|
| 191 |
|
|---|
| 192 |
(viper-deflocalvar viper-vi-local-user-minor-mode nil |
|---|
| 193 |
"Auxiliary minor mode for user-defined local bindings in Vi state.") |
|---|
| 194 |
|
|---|
| 195 |
(viper-deflocalvar viper-vi-global-user-minor-mode nil |
|---|
| 196 |
"Auxiliary minor mode for user-defined global bindings in Vi state.") |
|---|
| 197 |
|
|---|
| 198 |
(viper-deflocalvar viper-vi-state-modifier-minor-mode nil |
|---|
| 199 |
"Minor mode used to make major-mode-specific modification to Vi state.") |
|---|
| 200 |
|
|---|
| 201 |
(viper-deflocalvar viper-vi-diehard-minor-mode nil |
|---|
| 202 |
"This minor mode is in effect when the user wants Viper to be Vi.") |
|---|
| 203 |
|
|---|
| 204 |
(viper-deflocalvar viper-vi-kbd-minor-mode nil |
|---|
| 205 |
"Minor mode for Ex command macros in Vi state. |
|---|
| 206 |
The corresponding keymap stores key bindings of Vi macros defined with |
|---|
| 207 |
the Ex command :map.") |
|---|
| 208 |
|
|---|
| 209 |
|
|---|
| 210 |
(viper-deflocalvar viper-insert-intercept-minor-mode nil) |
|---|
| 211 |
|
|---|
| 212 |
(viper-deflocalvar viper-insert-basic-minor-mode nil |
|---|
| 213 |
"Viper's minor mode for bindings in Insert mode.") |
|---|
| 214 |
|
|---|
| 215 |
(viper-deflocalvar viper-insert-local-user-minor-mode nil |
|---|
| 216 |
"Auxiliary minor mode for buffer-local user-defined bindings in Insert state. |
|---|
| 217 |
This is a way to overshadow normal Insert mode bindings locally to certain |
|---|
| 218 |
designated buffers.") |
|---|
| 219 |
|
|---|
| 220 |
(viper-deflocalvar viper-insert-global-user-minor-mode nil |
|---|
| 221 |
"Auxiliary minor mode for global user-defined bindings in Insert state.") |
|---|
| 222 |
|
|---|
| 223 |
(viper-deflocalvar viper-insert-state-modifier-minor-mode nil |
|---|
| 224 |
"Minor mode used to make major-mode-specific modification to Insert state.") |
|---|
| 225 |
|
|---|
| 226 |
(viper-deflocalvar viper-insert-diehard-minor-mode nil |
|---|
| 227 |
"Minor mode that simulates Vi very closely. |
|---|
| 228 |
Not recommened, except for the novice user.") |
|---|
| 229 |
|
|---|
| 230 |
(viper-deflocalvar viper-insert-kbd-minor-mode nil |
|---|
| 231 |
"Minor mode for Ex command macros Insert state. |
|---|
| 232 |
The corresponding keymap stores key bindings of Vi macros defined with |
|---|
| 233 |
the Ex command :map!.") |
|---|
| 234 |
|
|---|
| 235 |
(viper-deflocalvar viper-replace-minor-mode nil |
|---|
| 236 |
"Minor mode in effect in replace state (cw, C, and the like commands).") |
|---|
| 237 |
|
|---|
| 238 |
|
|---|
| 239 |
|
|---|
| 240 |
|
|---|
| 241 |
(viper-deflocalvar viper-emacs-intercept-minor-mode nil) |
|---|
| 242 |
|
|---|
| 243 |
(viper-deflocalvar viper-emacs-local-user-minor-mode nil |
|---|
| 244 |
"Minor mode for local user bindings effective in Emacs state. |
|---|
| 245 |
Users can use it to override Emacs bindings when Viper is in its Emacs |
|---|
| 246 |
state.") |
|---|
| 247 |
|
|---|
| 248 |
(viper-deflocalvar viper-emacs-global-user-minor-mode nil |
|---|
| 249 |
"Minor mode for global user bindings in effect in Emacs state. |
|---|
| 250 |
Users can use it to override Emacs bindings when Viper is in its Emacs |
|---|
| 251 |
state.") |
|---|
| 252 |
|
|---|
| 253 |
(viper-deflocalvar viper-emacs-kbd-minor-mode nil |
|---|
| 254 |
"Minor mode for Vi style macros in Emacs state. |
|---|
| 255 |
The corresponding keymap stores key bindings of Vi macros defined with |
|---|
| 256 |
`viper-record-kbd-macro' command. There is no Ex-level command to do this |
|---|
| 257 |
interactively.") |
|---|
| 258 |
|
|---|
| 259 |
(viper-deflocalvar viper-emacs-state-modifier-minor-mode nil |
|---|
| 260 |
"Minor mode used to make major-mode-specific modification to Emacs state. |
|---|
| 261 |
For instance, a Vi purist may want to bind `dd' in Dired mode to a function |
|---|
| 262 |
that deletes a file.") |
|---|
| 263 |
|
|---|
| 264 |
(viper-deflocalvar viper-vi-minibuffer-minor-mode nil |
|---|
| 265 |
"Minor mode that forces Vi-style when the Minibuffer is in Vi state.") |
|---|
| 266 |
|
|---|
| 267 |
(viper-deflocalvar viper-insert-minibuffer-minor-mode nil |
|---|
| 268 |
"Minor mode that forces Vi-style when the Minibuffer is in Insert state.") |
|---|
| 269 |
|
|---|
| 270 |
|
|---|
| 271 |
|
|---|
| 272 |
|
|---|
| 273 |
|
|---|
| 274 |
(defconst viper-SpuriousText "Spurious text after command" "") |
|---|
| 275 |
(defconst viper-BadExCommand "Not an editor command" "") |
|---|
| 276 |
(defconst viper-InvalidCommandArgument "Invalid command argument" "") |
|---|
| 277 |
(defconst viper-NoPrevSearch "No previous search string" "") |
|---|
| 278 |
(defconst viper-EmptyRegister "`%c': Nothing in this register" "") |
|---|
| 279 |
(defconst viper-InvalidRegister "`%c': Invalid register" "") |
|---|
| 280 |
(defconst viper-EmptyTextmarker "`%c': Text marker doesn't point anywhere" "") |
|---|
| 281 |
(defconst viper-InvalidTextmarker "`%c': Invalid text marker" "") |
|---|
| 282 |
(defconst viper-InvalidViCommand "Invalid command" "") |
|---|
| 283 |
(defconst viper-BadAddress "Ill-formed address" "") |
|---|
| 284 |
(defconst viper-FirstAddrExceedsSecond "First address exceeds second" "") |
|---|
| 285 |
(defconst viper-NoFileSpecified "No file specified" "") |
|---|
| 286 |
|
|---|
| 287 |
|
|---|
| 288 |
|
|---|
| 289 |
(defvar viper-first-time t) |
|---|
| 290 |
|
|---|
| 291 |
(defvar viper-expert-level (if (boundp 'viper-expert-level) viper-expert-level 0) |
|---|
| 292 |
"User's expert level. |
|---|
| 293 |
The minor mode viper-vi-diehard-minor-mode is in effect when |
|---|
| 294 |
viper-expert-level is 1 or 2 or when viper-want-emacs-keys-in-vi is t. |
|---|
| 295 |
The minor mode viper-insert-diehard-minor-mode is in effect when |
|---|
| 296 |
viper-expert-level is 1 or 2 or if viper-want-emacs-keys-in-insert is t. |
|---|
| 297 |
Use `M-x viper-set-expert-level' to change this.") |
|---|
| 298 |
|
|---|
| 299 |
|
|---|
| 300 |
|
|---|
| 301 |
(defconst viper-max-expert-level 5) |
|---|
| 302 |
|
|---|
| 303 |
|
|---|
| 304 |
|
|---|
| 305 |
|
|---|
| 306 |
|
|---|
| 307 |
|
|---|
| 308 |
|
|---|
| 309 |
(viper-deflocalvar viper-automatic-iso-accents nil "") |
|---|
| 310 |
|
|---|
| 311 |
(defsubst viper-set-iso-accents-mode (arg) |
|---|
| 312 |
(if (boundp 'iso-accents-mode) |
|---|
| 313 |
(setq iso-accents-mode arg))) |
|---|
| 314 |
|
|---|
| 315 |
|
|---|
| 316 |
|
|---|
| 317 |
(defvar viper-mule-hook-flag t) |
|---|
| 318 |
|
|---|
| 319 |
(viper-deflocalvar viper-special-input-method nil "") |
|---|
| 320 |
|
|---|
| 321 |
|
|---|
| 322 |
(defun viper-activate-input-method-action () |
|---|
| 323 |
(if (null viper-mule-hook-flag) |
|---|
| 324 |
() |
|---|
| 325 |
(setq viper-special-input-method t) |
|---|
| 326 |
|
|---|
| 327 |
(if (eq viper-current-state 'vi-state) |
|---|
| 328 |
(viper-set-input-method nil)) |
|---|
| 329 |
(if (memq viper-current-state '(vi-state insert-state replace-state)) |
|---|
| 330 |
(message "Viper special input method%s: on" |
|---|
| 331 |
(if (or current-input-method default-input-method) |
|---|
| 332 |
(format " %S" |
|---|
| 333 |
(or current-input-method default-input-method)) |
|---|
| 334 |
""))) |
|---|
| 335 |
)) |
|---|
| 336 |
|
|---|
| 337 |
|
|---|
| 338 |
(defun viper-inactivate-input-method-action () |
|---|
| 339 |
(if (null viper-mule-hook-flag) |
|---|
| 340 |
() |
|---|
| 341 |
(setq viper-special-input-method nil) |
|---|
| 342 |
(if (memq viper-current-state '(vi-state insert-state replace-state)) |
|---|
| 343 |
(message "Viper special input method%s: off" |
|---|
| 344 |
(if (or current-input-method default-input-method) |
|---|
| 345 |
(format " %S" |
|---|
| 346 |
(or current-input-method default-input-method)) |
|---|
| 347 |
""))))) |
|---|
| 348 |
|
|---|
| 349 |
(defun viper-inactivate-input-method () |
|---|
| 350 |
(cond ((and viper-emacs-p (fboundp 'inactivate-input-method)) |
|---|
| 351 |
(inactivate-input-method)) |
|---|
| 352 |
((and viper-xemacs-p (boundp 'current-input-method)) |
|---|
| 353 |
|
|---|
| 354 |
|
|---|
| 355 |
(setq quail-mode nil) |
|---|
| 356 |
(if (featurep 'quail) |
|---|
| 357 |
(quail-delete-overlays)) |
|---|
| 358 |
(setq describe-current-input-method-function nil) |
|---|
| 359 |
(setq current-input-method nil) |
|---|
| 360 |
(run-hooks 'input-method-inactivate-hook) |
|---|
| 361 |
(force-mode-line-update)) |
|---|
| 362 |
)) |
|---|
| 363 |
(defun viper-activate-input-method () |
|---|
| 364 |
(cond ((and viper-emacs-p (fboundp 'activate-input-method)) |
|---|
| 365 |
(activate-input-method default-input-method)) |
|---|
| 366 |
((featurep 'xemacs) |
|---|
| 367 |
(if (fboundp 'quail-mode) (quail-mode 1))))) |
|---|
| 368 |
|
|---|
| 369 |
|
|---|
| 370 |
(defun viper-set-input-method (arg) |
|---|
| 371 |
(setq viper-mule-hook-flag t) |
|---|
| 372 |
(let (viper-mule-hook-flag) |
|---|
| 373 |
(cond ((and arg (> (prefix-numeric-value arg) 0) default-input-method) |
|---|
| 374 |
|
|---|
| 375 |
(viper-activate-input-method)) |
|---|
| 376 |
(t |
|---|
| 377 |
(viper-inactivate-input-method))) |
|---|
| 378 |
)) |
|---|
| 379 |
|
|---|
| 380 |
|
|---|
| 381 |
|
|---|
| 382 |
|
|---|
| 383 |
|
|---|
| 384 |
(viper-deflocalvar viper-undo-needs-adjustment nil) |
|---|
| 385 |
(put 'viper-undo-needs-adjustment 'permanent-local t) |
|---|
| 386 |
|
|---|
| 387 |
|
|---|
| 388 |
|
|---|
| 389 |
|
|---|
| 390 |
(defconst viper-buffer-undo-list-mark 'viper) |
|---|
| 391 |
|
|---|
| 392 |
(defcustom viper-keep-point-on-undo nil |
|---|
| 393 |
"*Non-nil means not to move point while undoing commands. |
|---|
| 394 |
This style is different from Emacs and Vi. Try it to see if |
|---|
| 395 |
it better fits your working style." |
|---|
| 396 |
:type 'boolean |
|---|
| 397 |
:tag "Preserve Position of Point After Undo" |
|---|
| 398 |
:group 'viper) |
|---|
| 399 |
|
|---|
| 400 |
|
|---|
| 401 |
|
|---|
| 402 |
|
|---|
| 403 |
(viper-deflocalvar viper-intermediate-command nil "") |
|---|
| 404 |
|
|---|
| 405 |
|
|---|
| 406 |
|
|---|
| 407 |
|
|---|
| 408 |
|
|---|
| 409 |
|
|---|
| 410 |
(defconst viper-this-command-keys nil) |
|---|
| 411 |
|
|---|
| 412 |
|
|---|
| 413 |
(viper-deflocalvar viper-began-as-replace nil "") |
|---|
| 414 |
|
|---|
| 415 |
(defcustom viper-allow-multiline-replace-regions t |
|---|
| 416 |
"If non-nil, Viper will allow multi-line replace regions. |
|---|
| 417 |
This is an extension to standard Vi. |
|---|
| 418 |
If nil, commands that attempt to replace text spanning multiple lines first |
|---|
| 419 |
delete the text being replaced, as in standard Vi." |
|---|
| 420 |
:type 'boolean |
|---|
| 421 |
:group 'viper) |
|---|
| 422 |
|
|---|
| 423 |
(defcustom viper-replace-overlay-cursor-color "Red" |
|---|
| 424 |
"*Cursor color when Viper is in Replace state." |
|---|
| 425 |
:type 'string |
|---|
| 426 |
:group 'viper) |
|---|
| 427 |
(if (fboundp 'make-variable-frame-local) |
|---|
| 428 |
(make-variable-frame-local 'viper-replace-overlay-cursor-color)) |
|---|
| 429 |
|
|---|
| 430 |
(defcustom viper-insert-state-cursor-color "Green" |
|---|
| 431 |
"Cursor color when Viper is in insert state." |
|---|
| 432 |
:type 'string |
|---|
| 433 |
:group 'viper) |
|---|
| 434 |
(if (fboundp 'make-variable-frame-local) |
|---|
| 435 |
(make-variable-frame-local 'viper-insert-state-cursor-color)) |
|---|
| 436 |
|
|---|
| 437 |
|
|---|
| 438 |
|
|---|
| 439 |
|
|---|
| 440 |
(defcustom viper-emacs-state-cursor-color nil |
|---|
| 441 |
"Cursor color when Viper is in Emacs state." |
|---|
| 442 |
:type 'string |
|---|
| 443 |
:group 'viper) |
|---|
| 444 |
(if (fboundp 'make-variable-frame-local) |
|---|
| 445 |
(make-variable-frame-local 'viper-emacs-state-cursor-color)) |
|---|
| 446 |
|
|---|
| 447 |
|
|---|
| 448 |
(defvar viper-vi-state-cursor-color nil) |
|---|
| 449 |
(if (fboundp 'make-variable-frame-local) |
|---|
| 450 |
(make-variable-frame-local 'viper-vi-state-cursor-color)) |
|---|
| 451 |
|
|---|
| 452 |
(viper-deflocalvar viper-replace-overlay nil "") |
|---|
| 453 |
(put 'viper-replace-overlay 'permanent-local t) |
|---|
| 454 |
|
|---|
| 455 |
(defcustom viper-replace-region-end-delimiter "$" |
|---|
| 456 |
"A string marking the end of replacement regions. |
|---|
| 457 |
It is used only with TTYs or if `viper-use-replace-region-delimiters' |
|---|
| 458 |
is non-nil." |
|---|
| 459 |
:type 'string |
|---|
| 460 |
:group 'viper) |
|---|
| 461 |
(defcustom viper-replace-region-start-delimiter "" |
|---|
| 462 |
"A string marking the beginning of replacement regions. |
|---|
| 463 |
It is used only with TTYs or if `viper-use-replace-region-delimiters' |
|---|
| 464 |
is non-nil." |
|---|
| 465 |
:type 'string |
|---|
| 466 |
:group 'viper) |
|---|
| 467 |
(defcustom viper-use-replace-region-delimiters |
|---|
| 468 |
(or (not (viper-has-face-support-p)) |
|---|
| 469 |
(and viper-xemacs-p (eq (viper-device-type) 'tty))) |
|---|
| 470 |
"*If non-nil, Viper will always use `viper-replace-region-end-delimiter' and |
|---|
| 471 |
`viper-replace-region-start-delimiter' to delimit replacement regions, even on |
|---|
| 472 |
color displays. By default, the delimiters are used only on TTYs." |
|---|
| 473 |
:type 'boolean |
|---|
| 474 |
:group 'viper) |
|---|
| 475 |
|
|---|
| 476 |
(defcustom viper-read-buffer-function 'read-buffer |
|---|
| 477 |
"Function to use for prompting the user for a buffer name." |
|---|
| 478 |
:type 'symbol |
|---|
| 479 |
:group 'viper) |
|---|
| 480 |
|
|---|
| 481 |
|
|---|
| 482 |
(viper-cond-compile-for-xemacs-or-emacs |
|---|
| 483 |
(progn |
|---|
| 484 |
(or (glyphp viper-replace-region-end-delimiter) |
|---|
| 485 |
(setq viper-replace-region-end-delimiter |
|---|
| 486 |
(make-glyph viper-replace-region-end-delimiter))) |
|---|
| 487 |
(or (glyphp viper-replace-region-start-delimiter) |
|---|
| 488 |
(setq viper-replace-region-start-delimiter |
|---|
| 489 |
(make-glyph viper-replace-region-start-delimiter))) |
|---|
| 490 |
) |
|---|
| 491 |
nil |
|---|
| 492 |
) |
|---|
| 493 |
|
|---|
| 494 |
|
|---|
| 495 |
|
|---|
| 496 |
|
|---|
| 497 |
|
|---|
| 498 |
|
|---|
| 499 |
|
|---|
| 500 |
(viper-deflocalvar viper-last-posn-in-replace-region nil) |
|---|
| 501 |
|
|---|
| 502 |
(viper-deflocalvar viper-last-posn-while-in-insert-state nil) |
|---|
| 503 |
(put 'viper-last-posn-in-replace-region 'permanent-local t) |
|---|
| 504 |
(put 'viper-last-posn-while-in-insert-state 'permanent-local t) |
|---|
| 505 |
|
|---|
| 506 |
(viper-deflocalvar viper-sitting-in-replace nil "") |
|---|
| 507 |
(put 'viper-sitting-in-replace 'permanent-local t) |
|---|
| 508 |
|
|---|
| 509 |
|
|---|
| 510 |
|
|---|
| 511 |
(viper-deflocalvar viper-replace-chars-to-delete 0 "") |
|---|
| 512 |
|
|---|
| 513 |
|
|---|
| 514 |
|
|---|
| 515 |
|
|---|
| 516 |
|
|---|
| 517 |
(viper-deflocalvar viper-replace-region-chars-deleted 0 "") |
|---|
| 518 |
|
|---|
| 519 |
|
|---|
| 520 |
(defcustom viper-insertion-ring-size 14 |
|---|
| 521 |
"The size of history of inserted text. |
|---|
| 522 |
This is a list where Viper keeps the history of previously inserted pieces of |
|---|
| 523 |
text." |
|---|
| 524 |
:type 'integer |
|---|
| 525 |
:group 'viper-misc) |
|---|
| 526 |
|
|---|
| 527 |
(defvar viper-insertion-ring nil) |
|---|
| 528 |
|
|---|
| 529 |
|
|---|
| 530 |
(defvar viper-temp-insertion-ring nil) |
|---|
| 531 |
(defvar viper-last-inserted-string-from-insertion-ring "") |
|---|
| 532 |
|
|---|
| 533 |
(defcustom viper-command-ring-size 14 |
|---|
| 534 |
"The size of history of Vi commands repeatable with dot." |
|---|
| 535 |
:type 'integer |
|---|
| 536 |
:group 'viper-misc) |
|---|
| 537 |
|
|---|
| 538 |
(defvar viper-command-ring nil) |
|---|
| 539 |
|
|---|
| 540 |
|
|---|
| 541 |
(defvar viper-temp-command-ring nil) |
|---|
| 542 |
|
|---|
| 543 |
|
|---|
| 544 |
(defcustom viper-fast-keyseq-timeout 200 |
|---|
| 545 |
"*Key sequence separated by no more than this many milliseconds is viewed as a Vi-style macro, if such a macro is defined. |
|---|
| 546 |
Setting this too high may slow down your typing. Setting this value too low |
|---|
| 547 |
will make it hard to use Vi-style timeout macros." |
|---|
| 548 |
:type 'integer |
|---|
| 549 |
:group 'viper-misc) |
|---|
| 550 |
|
|---|
| 551 |
(defcustom viper-ESC-keyseq-timeout (if (viper-window-display-p) |
|---|
| 552 |
0 viper-fast-keyseq-timeout) |
|---|
| 553 |
"*Key sequence beginning with ESC and separated by no more than this many milliseconds is considered to be generated by a keyboard function key. |
|---|
| 554 |
Setting this too high may slow down switching from insert to vi state. Setting |
|---|
| 555 |
this value too low will make it impossible to use function keys in insert mode |
|---|
| 556 |
on a dumb terminal." |
|---|
| 557 |
:type 'integer |
|---|
| 558 |
:group 'viper-misc) |
|---|
| 559 |
|
|---|
| 560 |
(defcustom viper-translate-all-ESC-keysequences (not (viper-window-display-p)) |
|---|
| 561 |
"Allow translation of all key sequences into commands. |
|---|
| 562 |
Normally, Viper lets Emacs translate only those ESC key sequences that are |
|---|
| 563 |
defined in the low-level key-translation-map or function-key-map, such as those |
|---|
| 564 |
emitted by the arrow and function keys. Other sequences, e.g., \\e/, are |
|---|
| 565 |
treated as ESC command followed by a `/'. This is done for people who type fast |
|---|
| 566 |
and tend to hit other characters right after they hit ESC. Other people like |
|---|
| 567 |
Emacs to translate ESC sequences all the time. |
|---|
| 568 |
The default is to translate all sequences only when using a dumb terminal. |
|---|
| 569 |
This permits you to use ESC as a meta key in insert mode." |
|---|
| 570 |
:type 'boolean |
|---|
| 571 |
:group 'viper-misc) |
|---|
| 572 |
|
|---|
| 573 |
|
|---|
| 574 |
|
|---|
| 575 |
|
|---|
| 576 |
(viper-deflocalvar viper-current-state 'emacs-state) |
|---|
| 577 |
|
|---|
| 578 |
|
|---|
| 579 |
|
|---|
| 580 |
|
|---|
| 581 |
|
|---|
| 582 |
(viper-deflocalvar viper-cted nil "") |
|---|
| 583 |
|
|---|
| 584 |
|
|---|
| 585 |
(viper-deflocalvar viper-current-indent 0) |
|---|
| 586 |
|
|---|
| 587 |
|
|---|
| 588 |
(viper-deflocalvar viper-preserve-indent nil) |
|---|
| 589 |
|
|---|
| 590 |
(viper-deflocalvar viper-auto-indent nil "") |
|---|
| 591 |
(defcustom viper-auto-indent nil |
|---|
| 592 |
"*Enable autoindent, if t. |
|---|
| 593 |
This is a buffer-local variable." |
|---|
| 594 |
:type 'boolean |
|---|
| 595 |
:group 'viper) |
|---|
| 596 |
|
|---|
| 597 |
(viper-deflocalvar viper-electric-mode t "") |
|---|
| 598 |
(defcustom viper-electric-mode t |
|---|
| 599 |
"*If t, electrify Viper. |
|---|
| 600 |
Currently, this only electrifies auto-indentation, making it appropriate to the |
|---|
| 601 |
mode of the buffer. |
|---|
| 602 |
This means that auto-indentation will depart from standard Vi and will indent |
|---|
| 603 |
appropriate to the mode of the buffer. This is especially useful for editing |
|---|
| 604 |
programs and LaTeX documents." |
|---|
| 605 |
:type 'boolean |
|---|
| 606 |
:group 'viper) |
|---|
| 607 |
|
|---|
| 608 |
(defcustom viper-shift-width 8 |
|---|
| 609 |
"*The value of the shiftwidth. |
|---|
| 610 |
This determines the number of columns by which the Ctl-t moves the cursor in |
|---|
| 611 |
the Insert state." |
|---|
| 612 |
:type 'integer |
|---|
| 613 |
:group 'viper) |
|---|
| 614 |
|
|---|
| 615 |
|
|---|
| 616 |
|
|---|
| 617 |
(defcustom viper-keep-point-on-repeat t |
|---|
| 618 |
"*If t, don't move point when repeating previous command. |
|---|
| 619 |
This is useful for doing repeated changes with the '.' key. |
|---|
| 620 |
The user can change this to nil, if she likes when the cursor moves |
|---|
| 621 |
to a new place after repeating previous Vi command." |
|---|
| 622 |
:type 'boolean |
|---|
| 623 |
:group 'viper) |
|---|
| 624 |
|
|---|
| 625 |
|
|---|
| 626 |
|
|---|
| 627 |
(viper-deflocalvar viper-insert-point nil) |
|---|
| 628 |
(put 'viper-insert-point 'permanent-local t) |
|---|
| 629 |
|
|---|
| 630 |
|
|---|
| 631 |
|
|---|
| 632 |
|
|---|
| 633 |
|
|---|
| 634 |
|
|---|
| 635 |
|
|---|
| 636 |
|
|---|
| 637 |
|
|---|
| 638 |
|
|---|
| 639 |
|
|---|
| 640 |
|
|---|
| 641 |
|
|---|
| 642 |
|
|---|
| 643 |
|
|---|
| 644 |
|
|---|
| 645 |
|
|---|
| 646 |
|
|---|
| 647 |
|
|---|
| 648 |
(viper-deflocalvar viper-pre-command-point nil) |
|---|
| 649 |
(put 'viper-pre-command-point 'permanent-local t) |
|---|
| 650 |
|
|---|
| 651 |
|
|---|
| 652 |
(defvar viper-last-insertion nil) |
|---|
| 653 |
|
|---|
| 654 |
|
|---|
| 655 |
(defvar viper-last-replace-region "") |
|---|
| 656 |
|
|---|
| 657 |
|
|---|
| 658 |
|
|---|
| 659 |
(viper-deflocalvar viper-com-point nil) |
|---|
| 660 |
|
|---|
| 661 |
|
|---|
| 662 |
|
|---|
| 663 |
|
|---|
| 664 |
|
|---|
| 665 |
|
|---|
| 666 |
|
|---|
| 667 |
|
|---|
| 668 |
|
|---|
| 669 |
|
|---|
| 670 |
|
|---|
| 671 |
(defvar viper-d-com nil) |
|---|
| 672 |
|
|---|
| 673 |
|
|---|
| 674 |
(defvar viper-d-char nil) |
|---|
| 675 |
|
|---|
| 676 |
|
|---|
| 677 |
(defvar viper-use-register nil) |
|---|
| 678 |
|
|---|
| 679 |
|
|---|
| 680 |
|
|---|
| 681 |
|
|---|
| 682 |
(defgroup viper-search nil |
|---|
| 683 |
"Variables that define the search and query-replace behavior of Viper." |
|---|
| 684 |
:prefix "viper-" |
|---|
| 685 |
:group 'viper) |
|---|
| 686 |
|
|---|
| 687 |
|
|---|
| 688 |
(defvar viper-f-char nil) |
|---|
| 689 |
|
|---|
| 690 |
|
|---|
| 691 |
(defvar viper-F-char nil) |
|---|
| 692 |
|
|---|
| 693 |
|
|---|
| 694 |
(defvar viper-f-forward nil) |
|---|
| 695 |
|
|---|
| 696 |
|
|---|
| 697 |
(defvar viper-f-offset nil) |
|---|
| 698 |
|
|---|
| 699 |
|
|---|
| 700 |
(defvar viper-s-string "") |
|---|
| 701 |
|
|---|
| 702 |
(defcustom viper-quote-string "> " |
|---|
| 703 |
"String inserted at the beginning of quoted region." |
|---|
| 704 |
:type 'string |
|---|
| 705 |
:group 'viper) |
|---|
| 706 |
|
|---|
| 707 |
|
|---|
| 708 |
(defvar viper-s-forward nil) |
|---|
| 709 |
|
|---|
| 710 |
(defcustom viper-case-fold-search nil |
|---|
| 711 |
"*If not nil, search ignores cases." |
|---|
| 712 |
:type 'boolean |
|---|
| 713 |
:group 'viper-search) |
|---|
| 714 |
|
|---|
| 715 |
(defcustom viper-re-search t |
|---|
| 716 |
"*If not nil, search is regexp search, otherwise vanilla search." |
|---|
| 717 |
:type 'boolean |
|---|
| 718 |
:tag "Regexp Search" |
|---|
| 719 |
:group 'viper-search) |
|---|
| 720 |
|
|---|
| 721 |
(defcustom viper-search-scroll-threshold 2 |
|---|
| 722 |
"*If search lands within this threshnold from the window top/bottom, |
|---|
| 723 |
the window will be scrolled up or down appropriately, to reveal context. |
|---|
| 724 |
If you want Viper search to behave as usual in Vi, set this variable to a |
|---|
| 725 |
negative number." |
|---|
| 726 |
:type 'boolean |
|---|
| 727 |
:group 'viper-search) |
|---|
| 728 |
|
|---|
| 729 |
(defcustom viper-re-query-replace t |
|---|
| 730 |
"*If t then do regexp replace, if nil then do string replace." |
|---|
| 731 |
:type 'boolean |
|---|
| 732 |
:tag "Regexp Query Replace" |
|---|
| 733 |
:group 'viper-search) |
|---|
| 734 |
|
|---|
| 735 |
(defcustom viper-re-replace t |
|---|
| 736 |
"*If t, do regexp replace. nil means do string replace." |
|---|
| 737 |
:type 'boolean |
|---|
| 738 |
:tag "Regexp Replace" |
|---|
| 739 |
:group 'viper-search) |
|---|
| 740 |
|
|---|
| 741 |
(defcustom viper-parse-sexp-ignore-comments t |
|---|
| 742 |
"*If t, `%' ignores the parentheses that occur inside comments." |
|---|
| 743 |
:type 'boolean |
|---|
| 744 |
:group 'viper) |
|---|
| 745 |
|
|---|
| 746 |
(viper-deflocalvar viper-ex-style-motion t "") |
|---|
| 747 |
(defcustom viper-ex-style-motion t |
|---|
| 748 |
"*If t, the commands l,h do not cross lines, etc (Ex-style). |
|---|
| 749 |
If nil, these commands cross line boundaries." |
|---|
| 750 |
:type 'boolean |
|---|
| 751 |
:group 'viper) |
|---|
| 752 |
|
|---|
| 753 |
(viper-deflocalvar viper-ex-style-editing t "") |
|---|
| 754 |
(defcustom viper-ex-style-editing t |
|---|
| 755 |
"*If t, Ex-style behavior while editing in Vi command and insert states. |
|---|
| 756 |
`Backspace' and `Delete' don't cross line boundaries in insert. |
|---|
| 757 |
`X' and `x' can't delete characters across line boundary in Vi, etc. |
|---|
| 758 |
Note: this doesn't preclude `Backspace' and `Delete' from deleting characters |
|---|
| 759 |
by moving past the insertion point. This is a feature, not a bug. |
|---|
| 760 |
|
|---|
| 761 |
If nil, the above commands can work across lines." |
|---|
| 762 |
:type 'boolean |
|---|
| 763 |
:group 'viper) |
|---|
| 764 |
|
|---|
| 765 |
(viper-deflocalvar viper-ESC-moves-cursor-back viper-ex-style-editing "") |
|---|
| 766 |
(defcustom viper-ESC-moves-cursor-back nil |
|---|
| 767 |
"*If t, ESC moves cursor back when changing from insert to vi state. |
|---|
| 768 |
If nil, the cursor stays where it was when ESC was hit." |
|---|
| 769 |
:type 'boolean |
|---|
| 770 |
:group 'viper) |
|---|
| 771 |
|
|---|
| 772 |
(viper-deflocalvar viper-delete-backwards-in-replace nil "") |
|---|
| 773 |
(defcustom viper-delete-backwards-in-replace nil |
|---|
| 774 |
"*If t, DEL key will delete characters while moving the cursor backwards. |
|---|
| 775 |
If nil, the cursor will move backwards without deleting anything." |
|---|
| 776 |
:type 'boolean |
|---|
| 777 |
:group 'viper) |
|---|
| 778 |
|
|---|
| 779 |
(defcustom viper-buffer-search-char nil |
|---|
| 780 |
"*Key used for buffer-searching. Must be a character type, e.g., ?g." |
|---|
| 781 |
:type '(choice (const nil) character) |
|---|
| 782 |
:group 'viper-search) |
|---|
| 783 |
|
|---|
| 784 |
(defcustom viper-search-wrap-around-t t |
|---|
| 785 |
"*If t, search wraps around." |
|---|
| 786 |
:type 'boolean |
|---|
| 787 |
:tag "Search Wraps Around" |
|---|
| 788 |
:group 'viper-search) |
|---|
| 789 |
|
|---|
| 790 |
(viper-deflocalvar viper-related-files-and-buffers-ring nil "") |
|---|
| 791 |
(defcustom viper-related-files-and-buffers-ring nil |
|---|
| 792 |
"*List of file and buffer names that are considered to be related to the current buffer. |
|---|
| 793 |
Related buffers can be cycled through via :R and :P commands." |
|---|
| 794 |
:type 'boolean |
|---|
| 795 |
:group 'viper-misc) |
|---|
| 796 |
(put 'viper-related-files-and-buffers-ring 'permanent-local t) |
|---|
| 797 |
|
|---|
| 798 |
|
|---|
| 799 |
(viper-deflocalvar viper-local-search-start-marker nil) |
|---|
| 800 |
|
|---|
| 801 |
(defvar viper-search-start-marker (make-marker)) |
|---|
| 802 |
|
|---|
| 803 |
|
|---|
| 804 |
(viper-deflocalvar viper-search-overlay nil) |
|---|
| 805 |
|
|---|
| 806 |
|
|---|
| 807 |
(defvar viper-heading-start |
|---|
| 808 |
(concat "^\\s-*(\\s-*defun\\s-\\|" |
|---|
| 809 |
"^{\\s-*$\\|^[_a-zA-Z][^()]*[()].*{\\s-*$\\|" |
|---|
| 810 |
"^\\s-*class.*{\\|^\\s-*struct.*{\\|^\\s-*enum.*{\\|" |
|---|
| 811 |
"^\\\\[sb][a-z]*{.*}\\s-*$\\|" |
|---|
| 812 |
"^@node\\|@table\\|^@m?enu\\|^@itemize\\|^@if\\|" |
|---|
| 813 |
"^.+:-") |
|---|
| 814 |
"*Regexps for Headings. Used by \[\[ and \]\].") |
|---|
| 815 |
|
|---|
| 816 |
(defvar viper-heading-end |
|---|
| 817 |
(concat "^}\\|" |
|---|
| 818 |
"^\\\\end{\\|" |
|---|
| 819 |
"^@end \\|" |
|---|
| 820 |
")\n\n[ \t\n]*\\|" |
|---|
| 821 |
"\\.\\s-*$") |
|---|
| 822 |
"*Regexps to end Headings/Sections. Used by \[\].") |
|---|
| 823 |
|
|---|
| 824 |
|
|---|
| 825 |
|
|---|
| 826 |
|
|---|
| 827 |
|
|---|
| 828 |
|
|---|
| 829 |
|
|---|
| 830 |
|
|---|
| 831 |
(viper-deflocalvar viper-last-jump nil) |
|---|
| 832 |
|
|---|
| 833 |
(viper-deflocalvar viper-last-jump-ignore 0) |
|---|
| 834 |
|
|---|
| 835 |
|
|---|
| 836 |
|
|---|
| 837 |
|
|---|
| 838 |
(defvar viper-search-history (list "")) |
|---|
| 839 |
|
|---|
| 840 |
(defvar viper-replace1-history nil) |
|---|
| 841 |
|
|---|
| 842 |
(defvar viper-replace2-history nil) |
|---|
| 843 |
|
|---|
| 844 |
(defvar viper-quote-region-history (list viper-quote-string)) |
|---|
| 845 |
|
|---|
| 846 |
(defvar viper-ex-history nil) |
|---|
| 847 |
|
|---|
| 848 |
(defvar viper-shell-history nil) |
|---|
| 849 |
|
|---|
| 850 |
|
|---|
| 851 |
|
|---|
| 852 |
|
|---|
| 853 |
|
|---|
| 854 |
|
|---|
| 855 |
(defvar viper-last-shell-com nil) |
|---|
| 856 |
|
|---|
| 857 |
|
|---|
| 858 |
|
|---|
| 859 |
|
|---|
| 860 |
(defgroup viper-highlighting nil |
|---|
| 861 |
"Hilighting of replace region, search pattern, minibuffer, etc." |
|---|
| 862 |
:prefix "viper-" |
|---|
| 863 |
:group 'viper) |
|---|
| 864 |
|
|---|
| 865 |
|
|---|
| 866 |
(defface viper-search |
|---|
| 867 |
'((((class color)) (:foreground "Black" :background "khaki")) |
|---|
| 868 |
(t (:underline t :stipple "gray3"))) |
|---|
| 869 |
"*Face used to flash out the search pattern." |
|---|
| 870 |
:group 'viper-highlighting) |
|---|
| 871 |
|
|---|
| 872 |
(defvar viper-search-face 'viper-search |
|---|
| 873 |
"Face used to flash out the search pattern. |
|---|
| 874 |
DO NOT CHANGE this variable. Instead, use the customization widget |
|---|
| 875 |
to customize the actual face object `viper-search' |
|---|
| 876 |
this variable represents.") |
|---|
| 877 |
|
|---|
| 878 |
(defface viper-replace-overlay |
|---|
| 879 |
'((((class color)) (:foreground "Black" :background "darkseagreen2")) |
|---|
| 880 |
(t (:underline t :stipple "gray3"))) |
|---|
| 881 |
"*Face for highlighting replace regions on a window display." |
|---|
| 882 |
|
|---|