Mercurial > emacs
annotate lisp/emulation/vi.el @ 85402:56ff56f77105
*** empty log message ***
author | Juanma Barranquero <lekktu@gmail.com> |
---|---|
date | Thu, 18 Oct 2007 13:27:04 +0000 |
parents | 9ba019f08d78 |
children | e1af3a725ca4 424b655804ca |
rev | line source |
---|---|
38431
853c3674f20a
Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
18383
diff
changeset
|
1 ;;; vi.el --- major mode for emulating "vi" editor under GNU Emacs |
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
2 |
60902
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
3 ;; This file is in the public domain because the authors distributed it |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
4 ;; without a copyright notice before the US signed the Bern Convention. |
11184
6878430e42fa
Explain why public domain.
Richard M. Stallman <rms@gnu.org>
parents:
9865
diff
changeset
|
5 |
38431
853c3674f20a
Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
18383
diff
changeset
|
6 ;; This file is part of GNU Emacs. |
853c3674f20a
Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
18383
diff
changeset
|
7 |
773
9c89fd7ddd41
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
707
diff
changeset
|
8 ;; Author: Neal Ziring <nz@rsch.wisc.edu> |
9c89fd7ddd41
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
707
diff
changeset
|
9 ;; Felix S. T. Wu <wu@crys.wisc.edu> |
812
485e82a8acb5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
789
diff
changeset
|
10 ;; Keywords: emulations |
773
9c89fd7ddd41
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
707
diff
changeset
|
11 |
38431
853c3674f20a
Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
18383
diff
changeset
|
12 ;;; Commentary: |
773
9c89fd7ddd41
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
707
diff
changeset
|
13 |
60902
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
14 ;; Originally written by : seismo!wucs!nz@rsch.wisc.edu (Neal Ziring) |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
15 ;; Extensively redesigned and rewritten by wu@crys.wisc.edu (Felix S.T. Wu) |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
16 ;; Last revision: 01/07/87 Wed (for GNU Emacs 18.33) |
11184
6878430e42fa
Explain why public domain.
Richard M. Stallman <rms@gnu.org>
parents:
9865
diff
changeset
|
17 |
60902
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
18 ;; INSTALLATION PROCEDURE: |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
19 ;; 1) Add a global key binding for command "vi-mode" (I use ESC ESC instead of |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
20 ;; the single ESC used in real "vi", so I can access other ESC prefixed emacs |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
21 ;; commands while I'm in "vi"), say, by putting the following line in your |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
22 ;; ".emacs" file: |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
23 ;; (define-key global-map "\e\e" 'vi-mode) ;quick switch into vi-mode |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
24 ;; 2) If you wish you can define "find-file-hook" to enter "vi" automatically |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
25 ;; after a file is loaded into the buffer. For example, I defined it as: |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
26 ;; (setq find-file-hook (list |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
27 ;; (function (lambda () |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
28 ;; (if (not (or (eq major-mode 'Info-mode) |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
29 ;; (eq major-mode 'vi-mode))) |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
30 ;; (vi-mode)))))) |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
31 ;; 3) In your .emacs file you can define the command "vi-mode" to be "autoload" |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
32 ;; or you can execute the "load" command to load "vi" directly. |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
33 ;; 4) Read the comments for command "vi-mode" before you start using it. |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
34 |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
35 ;; COULD DO |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
36 ;; 1). A general 'define-operator' function to replace current hack |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
37 ;; 2). In operator handling, should allow other point moving Emacs commands |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
38 ;; (such as ESC <, ESC >) to be used as arguments. |
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
39 |
773
9c89fd7ddd41
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
707
diff
changeset
|
40 ;;; Code: |
6 | 41 |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
42 (defvar vi-mode-old-major-mode) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
43 (defvar vi-mode-old-mode-name) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
44 (defvar vi-mode-old-local-map) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
45 (defvar vi-mode-old-case-fold) |
6 | 46 |
47 (if (null (where-is-internal 'vi-switch-mode (current-local-map))) | |
48 (define-key ctl-x-map "~" 'vi-switch-mode)) | |
49 | |
50 (defvar vi-tilde-map nil | |
51 "Keymap used for \\[vi-switch-mode] prefix key. Link to various major modes.") | |
52 | |
53 (if vi-tilde-map | |
54 nil | |
55 (setq vi-tilde-map (make-keymap)) | |
56 (define-key vi-tilde-map "a" 'abbrev-mode) | |
57 (define-key vi-tilde-map "c" 'c-mode) | |
58 (define-key vi-tilde-map "d" 'vi-debugging) | |
59 (define-key vi-tilde-map "e" 'emacs-lisp-mode) | |
60 (define-key vi-tilde-map "f" 'auto-fill-mode) | |
61 (define-key vi-tilde-map "g" 'prolog-mode) | |
62 (define-key vi-tilde-map "h" 'hanoi) | |
63 (define-key vi-tilde-map "i" 'info-mode) | |
64 (define-key vi-tilde-map "l" 'lisp-mode) | |
65 (define-key vi-tilde-map "n" 'nroff-mode) | |
66 (define-key vi-tilde-map "o" 'overwrite-mode) | |
67 (define-key vi-tilde-map "O" 'outline-mode) | |
68 (define-key vi-tilde-map "P" 'picture-mode) | |
69 (define-key vi-tilde-map "r" 'vi-readonly-mode) | |
70 (define-key vi-tilde-map "t" 'text-mode) | |
71 (define-key vi-tilde-map "v" 'vi-mode) | |
72 (define-key vi-tilde-map "x" 'tex-mode) | |
73 (define-key vi-tilde-map "~" 'vi-back-to-old-mode)) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
74 |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
75 (defun vi-switch-mode (arg mode-char) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
76 "Switch the major mode of current buffer as specified by the following char \\{vi-tilde-map}" |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
77 (interactive "P\nc") |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
78 (let ((mode-cmd (lookup-key vi-tilde-map (char-to-string mode-char)))) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
79 (if (null mode-cmd) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
80 (with-output-to-temp-buffer "*Help*" |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
81 (princ (substitute-command-keys "Possible major modes to switch to: \\{vi-tilde-map}")) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
82 (save-excursion |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
83 (set-buffer standard-output) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
84 (help-mode))) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
85 (setq prefix-arg arg) ; prefix arg will be passed down |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
86 (command-execute mode-cmd nil) ; may need to save mode-line-format etc |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
87 (force-mode-line-update)))) ; just in case |
6 | 88 |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
89 |
6 | 90 (defun vi-debugging (arg) |
91 "Toggle debug-on-error flag. If prefix arg is given, set t." | |
92 (interactive "P") | |
93 (if arg | |
94 (setq debug-on-error t) | |
95 (setq debug-on-error (not debug-on-error))) | |
96 (if debug-on-error | |
97 (message "Debug-on-error ...") | |
98 (message "NO more debug-on-error"))) | |
99 | |
100 (defun vi-back-to-old-mode () | |
101 "Go back to the previous mode without setting up for insertion." | |
102 (interactive) | |
103 (if vi-mode-old-major-mode | |
104 (progn | |
105 (setq mode-name vi-mode-old-mode-name) | |
106 (use-local-map vi-mode-old-local-map) | |
107 (setq major-mode vi-mode-old-major-mode) | |
108 (setq case-fold-search vi-mode-old-case-fold) | |
11567
bcf841745ef2
(vi-switch-mode, vi-back-to-old-mode): Use force-mode-line-update.
Karl Heuer <kwzh@gnu.org>
parents:
11184
diff
changeset
|
109 (force-mode-line-update)))) |
6 | 110 |
111 (defun vi-readonly-mode () | |
112 "Toggle current buffer's readonly flag." | |
113 (interactive) | |
114 (setq buffer-read-only (not buffer-read-only))) | |
115 | |
116 (defvar vi-com-map nil | |
117 "Keymap used in Evi's command state | |
118 Command state includes most of the vi editing commands, with some Emacs | |
119 command extensions.") | |
120 | |
121 (put 'vi-undefined 'suppress-keymap t) | |
122 (if vi-com-map nil | |
123 (setq vi-com-map (make-keymap)) | |
124 ;;(fillarray vi-com-map 'vi-undefined) | |
125 (define-key vi-com-map "\C-@" 'vi-mark-region) ; extension | |
126 (define-key vi-com-map "\C-a" 'vi-ask-for-info) ; extension | |
13951
b777c515e6dc
(vi-backward-windowful): Renamed from vi-backward-windowfull.
Karl Heuer <kwzh@gnu.org>
parents:
12735
diff
changeset
|
127 (define-key vi-com-map "\C-b" 'vi-backward-windowful) |
6 | 128 (define-key vi-com-map "\C-c" 'vi-do-old-mode-C-c-command) ; extension |
129 (define-key vi-com-map "\C-d" 'vi-scroll-down-window) | |
130 (define-key vi-com-map "\C-e" 'vi-expose-line-below) | |
13951
b777c515e6dc
(vi-backward-windowful): Renamed from vi-backward-windowfull.
Karl Heuer <kwzh@gnu.org>
parents:
12735
diff
changeset
|
131 (define-key vi-com-map "\C-f" 'vi-forward-windowful) |
6 | 132 (define-key vi-com-map "\C-g" 'keyboard-quit) |
133 (define-key vi-com-map "\C-i" 'indent-relative-maybe) ; TAB | |
134 (define-key vi-com-map "\C-j" 'vi-next-line) ; LFD | |
135 (define-key vi-com-map "\C-k" 'vi-kill-line) ; extension | |
136 (define-key vi-com-map "\C-l" 'recenter) | |
137 (define-key vi-com-map "\C-m" 'vi-next-line-first-nonwhite) ; RET | |
138 (define-key vi-com-map "\C-n" 'vi-next-line) | |
139 (define-key vi-com-map "\C-o" 'vi-split-open-line) | |
140 (define-key vi-com-map "\C-p" 'previous-line) | |
141 (define-key vi-com-map "\C-q" 'vi-query-replace) ; extension | |
142 (define-key vi-com-map "\C-r" 'vi-isearch-backward) ; modification | |
143 (define-key vi-com-map "\C-s" 'vi-isearch-forward) ; extension | |
144 (define-key vi-com-map "\C-t" 'vi-transpose-objects) ; extension | |
145 (define-key vi-com-map "\C-u" 'vi-scroll-up-window) | |
146 (define-key vi-com-map "\C-v" 'scroll-up) ; extension | |
147 (define-key vi-com-map "\C-w" 'vi-kill-region) ; extension | |
148 (define-key vi-com-map "\C-x" 'Control-X-prefix) ; extension | |
149 (define-key vi-com-map "\C-y" 'vi-expose-line-above) | |
150 (define-key vi-com-map "\C-z" 'suspend-emacs) | |
151 | |
152 (define-key vi-com-map "\e" 'ESC-prefix); C-[ (ESC) | |
153 (define-key vi-com-map "\C-\\" 'vi-unimplemented) | |
154 (define-key vi-com-map "\C-]" 'find-tag) | |
155 (define-key vi-com-map "\C-^" 'vi-locate-def) ; extension | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
156 (define-key vi-com-map "\C-_" 'vi-undefined) |
6 | 157 |
158 (define-key vi-com-map " " 'forward-char) | |
159 (define-key vi-com-map "!" 'vi-operator) | |
160 (define-key vi-com-map "\"" 'vi-char-argument) | |
161 (define-key vi-com-map "#" 'universal-argument) ; extension | |
162 (define-key vi-com-map "$" 'end-of-line) | |
163 (define-key vi-com-map "%" 'vi-find-matching-paren) | |
164 (define-key vi-com-map "&" 'vi-unimplemented) | |
165 (define-key vi-com-map "'" 'vi-goto-line-mark) | |
166 (define-key vi-com-map "(" 'backward-sexp) | |
167 (define-key vi-com-map ")" 'forward-sexp) | |
168 (define-key vi-com-map "*" 'vi-name-last-change-or-macro) ; extension | |
169 (define-key vi-com-map "+" 'vi-next-line-first-nonwhite) | |
170 (define-key vi-com-map "," 'vi-reverse-last-find-char) | |
171 (define-key vi-com-map "-" 'vi-previous-line-first-nonwhite) | |
172 (define-key vi-com-map "." 'vi-redo-last-change-command) | |
173 (define-key vi-com-map "/" 'vi-search-forward) | |
174 (define-key vi-com-map "0" 'beginning-of-line) | |
175 | |
176 (define-key vi-com-map "1" 'vi-digit-argument) | |
177 (define-key vi-com-map "2" 'vi-digit-argument) | |
178 (define-key vi-com-map "3" 'vi-digit-argument) | |
179 (define-key vi-com-map "4" 'vi-digit-argument) | |
180 (define-key vi-com-map "5" 'vi-digit-argument) | |
181 (define-key vi-com-map "6" 'vi-digit-argument) | |
182 (define-key vi-com-map "7" 'vi-digit-argument) | |
183 (define-key vi-com-map "8" 'vi-digit-argument) | |
184 (define-key vi-com-map "9" 'vi-digit-argument) | |
185 | |
186 (define-key vi-com-map ":" 'vi-ex-cmd) | |
187 (define-key vi-com-map ";" 'vi-repeat-last-find-char) | |
188 (define-key vi-com-map "<" 'vi-operator) | |
189 (define-key vi-com-map "=" 'vi-operator) | |
190 (define-key vi-com-map ">" 'vi-operator) | |
191 (define-key vi-com-map "?" 'vi-search-backward) | |
192 (define-key vi-com-map "@" 'vi-call-named-change-or-macro) ; extension | |
193 | |
194 (define-key vi-com-map "A" 'vi-append-at-end-of-line) | |
195 (define-key vi-com-map "B" 'vi-backward-blank-delimited-word) | |
196 (define-key vi-com-map "C" 'vi-change-rest-of-line) | |
197 (define-key vi-com-map "D" 'vi-kill-line) | |
198 (define-key vi-com-map "E" 'vi-end-of-blank-delimited-word) | |
199 (define-key vi-com-map "F" 'vi-backward-find-char) | |
200 (define-key vi-com-map "G" 'vi-goto-line) | |
201 (define-key vi-com-map "H" 'vi-home-window-line) | |
202 (define-key vi-com-map "I" 'vi-insert-before-first-nonwhite) | |
203 (define-key vi-com-map "J" 'vi-join-lines) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
204 (define-key vi-com-map "K" 'vi-undefined) |
6 | 205 (define-key vi-com-map "L" 'vi-last-window-line) |
206 (define-key vi-com-map "M" 'vi-middle-window-line) | |
207 (define-key vi-com-map "N" 'vi-reverse-last-search) | |
208 (define-key vi-com-map "O" 'vi-open-above) | |
209 (define-key vi-com-map "P" 'vi-put-before) | |
210 (define-key vi-com-map "Q" 'vi-quote-words) ; extension | |
211 (define-key vi-com-map "R" 'vi-replace-chars) | |
212 (define-key vi-com-map "S" 'vi-substitute-lines) | |
213 (define-key vi-com-map "T" 'vi-backward-upto-char) | |
214 (define-key vi-com-map "U" 'vi-unimplemented) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
215 (define-key vi-com-map "V" 'vi-undefined) |
6 | 216 (define-key vi-com-map "W" 'vi-forward-blank-delimited-word) |
217 (define-key vi-com-map "X" 'call-last-kbd-macro) ; modification/extension | |
218 (define-key vi-com-map "Y" 'vi-yank-line) | |
219 (define-key vi-com-map "Z" (make-sparse-keymap)) ;allow below prefix command | |
220 (define-key vi-com-map "ZZ" 'vi-save-all-and-exit) | |
221 | |
222 (define-key vi-com-map "[" 'vi-unimplemented) | |
223 (define-key vi-com-map "\\" 'vi-operator) ; extension for vi-narrow-op | |
224 (define-key vi-com-map "]" 'vi-unimplemented) | |
225 (define-key vi-com-map "^" 'back-to-indentation) | |
226 (define-key vi-com-map "_" 'vi-undefined) | |
227 (define-key vi-com-map "`" 'vi-goto-char-mark) | |
228 | |
229 (define-key vi-com-map "a" 'vi-insert-after) | |
230 (define-key vi-com-map "b" 'backward-word) | |
231 (define-key vi-com-map "c" 'vi-operator) | |
232 (define-key vi-com-map "d" 'vi-operator) | |
233 (define-key vi-com-map "e" 'vi-end-of-word) | |
234 (define-key vi-com-map "f" 'vi-forward-find-char) | |
235 (define-key vi-com-map "g" 'vi-beginning-of-buffer) ; extension | |
236 (define-key vi-com-map "h" 'backward-char) | |
237 (define-key vi-com-map "i" 'vi-insert-before) | |
238 (define-key vi-com-map "j" 'vi-next-line) | |
239 (define-key vi-com-map "k" 'previous-line) | |
240 (define-key vi-com-map "l" 'forward-char) | |
241 (define-key vi-com-map "m" 'vi-set-mark) | |
242 (define-key vi-com-map "n" 'vi-repeat-last-search) | |
243 (define-key vi-com-map "o" 'vi-open-below) | |
244 (define-key vi-com-map "p" 'vi-put-after) | |
245 (define-key vi-com-map "q" 'vi-replace) | |
246 (define-key vi-com-map "r" 'vi-replace-1-char) | |
247 (define-key vi-com-map "s" 'vi-substitute-chars) | |
248 (define-key vi-com-map "t" 'vi-forward-upto-char) | |
249 (define-key vi-com-map "u" 'undo) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
250 (define-key vi-com-map "v" 'vi-verify-spelling) |
6 | 251 (define-key vi-com-map "w" 'vi-forward-word) |
252 (define-key vi-com-map "x" 'vi-kill-char) | |
253 (define-key vi-com-map "y" 'vi-operator) | |
254 (define-key vi-com-map "z" 'vi-adjust-window) | |
255 | |
256 (define-key vi-com-map "{" 'backward-paragraph) | |
257 (define-key vi-com-map "|" 'vi-goto-column) | |
258 (define-key vi-com-map "}" 'forward-paragraph) | |
259 (define-key vi-com-map "~" 'vi-change-case) | |
260 (define-key vi-com-map "\177" 'delete-backward-char)) | |
261 | |
262 (put 'backward-char 'point-moving-unit 'char) | |
263 (put 'vi-next-line 'point-moving-unit 'line) | |
264 (put 'next-line 'point-moving-unit 'line) | |
265 (put 'forward-line 'point-moving-unit 'line) | |
266 (put 'previous-line 'point-moving-unit 'line) | |
267 (put 'vi-isearch-backward 'point-moving-unit 'search) | |
268 (put 'vi-search-backward 'point-moving-unit 'search) | |
269 (put 'vi-isearch-forward 'point-moving-unit 'search) | |
270 (put 'vi-search-forward 'point-moving-unit 'search) | |
271 (put 'forward-char 'point-moving-unit 'char) | |
272 (put 'end-of-line 'point-moving-unit 'char) | |
273 (put 'vi-find-matching-paren 'point-moving-unit 'match) | |
274 (put 'vi-goto-line-mark 'point-moving-unit 'line) | |
275 (put 'backward-sexp 'point-moving-unit 'sexp) | |
276 (put 'forward-sexp 'point-moving-unit 'sexp) | |
277 (put 'vi-next-line-first-nonwhite 'point-moving-unit 'line) | |
278 (put 'vi-previous-line-first-nonwhite 'point-moving-unit 'line) | |
279 (put 'vi-reverse-last-find-char 'point-moving-unit 'rev-find) | |
280 (put 'vi-re-search-forward 'point-moving-unit 'search) | |
281 (put 'beginning-of-line 'point-moving-unit 'char) | |
282 (put 'vi-beginning-of-buffer 'point-moving-unit 'char) | |
283 (put 'vi-repeat-last-find-char 'point-moving-unit 'find) | |
284 (put 'vi-re-search-backward 'point-moving-unit 'search) | |
285 (put 'vi-backward-blank-delimited-word 'point-moving-unit 'WORD) | |
286 (put 'vi-end-of-blank-delimited-word 'point-moving-unit 'match) | |
287 (put 'vi-backward-find-char 'point-moving-unit 'find) | |
288 (put 'vi-goto-line 'point-moving-unit 'line) | |
289 (put 'vi-home-window-line 'point-moving-unit 'line) | |
290 (put 'vi-last-window-line 'point-moving-unit 'line) | |
291 (put 'vi-middle-window-line 'point-moving-unit 'line) | |
292 (put 'vi-reverse-last-search 'point-moving-unit 'rev-search) | |
293 (put 'vi-backward-upto-char 'point-moving-unit 'find) | |
294 (put 'vi-forward-blank-delimited-word 'point-moving-unit 'WORD) | |
295 (put 'back-to-indentation 'point-moving-unit 'char) | |
296 (put 'vi-goto-char-mark 'point-moving-unit 'char) | |
297 (put 'backward-word 'point-moving-unit 'word) | |
298 (put 'vi-end-of-word 'point-moving-unit 'match) | |
299 (put 'vi-forward-find-char 'point-moving-unit 'find) | |
300 (put 'backward-char 'point-moving-unit 'char) | |
301 (put 'vi-forward-char 'point-moving-unit 'char) | |
302 (put 'vi-repeat-last-search 'point-moving-unit 'search) | |
303 (put 'vi-forward-upto-char 'point-moving-unit 'find) | |
304 (put 'vi-forward-word 'point-moving-unit 'word) | |
305 (put 'vi-goto-column 'point-moving-unit 'match) | |
306 (put 'forward-paragraph 'point-moving-unit 'paragraph) | |
307 (put 'backward-paragraph 'point-moving-unit 'paragraph) | |
308 | |
309 ;;; region mark commands | |
310 (put 'mark-page 'point-moving-unit 'region) | |
311 (put 'mark-paragraph 'point-moving-unit 'region) | |
312 (put 'mark-word 'point-moving-unit 'region) | |
313 (put 'mark-sexp 'point-moving-unit 'region) | |
314 (put 'mark-defun 'point-moving-unit 'region) | |
315 (put 'mark-whole-buffer 'point-moving-unit 'region) | |
316 (put 'mark-end-of-sentence 'point-moving-unit 'region) | |
63942
c9581f50bd50
(vi-mark-region): Use c-mark-function.
Richard M. Stallman <rms@gnu.org>
parents:
63401
diff
changeset
|
317 (put 'c-mark-function 'point-moving-unit 'region) |
6 | 318 ;;; |
319 | |
320 (defvar vi-mark-alist nil | |
321 "Alist of (NAME . MARK), marks are local to each buffer.") | |
322 | |
323 (defvar vi-scroll-amount (/ (window-height) 2) | |
12735
2e79a07a9c27
(vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
11567
diff
changeset
|
324 "Default amount of lines for scrolling (used by \"^D\"/\"^U\").") |
6 | 325 |
326 (defvar vi-shift-width 4 | |
12735
2e79a07a9c27
(vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
11567
diff
changeset
|
327 "Shift amount for \"<\"/\">\" operators.") |
6 | 328 |
329 (defvar vi-ins-point nil ; integer | |
12735
2e79a07a9c27
(vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
11567
diff
changeset
|
330 "Last insertion point. Should use `mark' instead.") |
6 | 331 |
332 (defvar vi-ins-length nil ; integer | |
333 "Length of last insertion.") | |
334 | |
335 (defvar vi-ins-repetition nil ; integer | |
336 "The repetition required for last insertion.") | |
337 | |
338 (defvar vi-ins-overwrt-p nil ; boolean | |
339 "T if last insertion was a replace actually.") | |
340 | |
341 (defvar vi-ins-prefix-code nil ; ready-to-eval sexp | |
342 "Code to be eval'ed before (redo-)insertion begins.") | |
343 | |
344 (defvar vi-last-find-char nil ; cons cell | |
345 "Save last direction, char and upto-flag used for char finding.") | |
346 | |
347 (defvar vi-last-change-command nil ; cons cell | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
1577
diff
changeset
|
348 "Save commands for redoing last changes. Each command is in (FUNC . ARGS) |
12735
2e79a07a9c27
(vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
11567
diff
changeset
|
349 form that is ready to be `apply'ed.") |
6 | 350 |
351 (defvar vi-last-shell-command nil ; last shell op command line | |
352 "Save last shell command given for \"!\" operator.") | |
353 | |
354 (defvar vi-insert-state nil ; boolean | |
12735
2e79a07a9c27
(vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
11567
diff
changeset
|
355 "Non-nil if it is in insert state.") |
6 | 356 |
357 ; in "loaddefs.el" | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
358 ;(defvar search-last-string "" |
6 | 359 ; "Last string search for by a search command.") |
360 | |
361 (defvar vi-search-last-command nil ; (re-)search-forward(backward) | |
362 "Save last search command for possible redo.") | |
363 | |
364 (defvar vi-mode-old-local-map nil | |
365 "Save the local-map used before entering vi-mode.") | |
366 | |
367 (defvar vi-mode-old-mode-name nil | |
368 "Save the mode-name before entering vi-mode.") | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
369 |
6 | 370 (defvar vi-mode-old-major-mode nil |
371 "Save the major-mode before entering vi-mode.") | |
372 | |
373 (defvar vi-mode-old-case-fold nil) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
374 |
6 | 375 ;(defconst vi-add-to-mode-line-1 |
376 ; '(overwrite-mode nil " Insert")) | |
377 | |
378 ;; Value is same as vi-add-to-mode-line-1 when in vi mode, | |
379 ;; but nil in other buffers. | |
380 ;(defvar vi-add-to-mode-line nil) | |
381 | |
382 (defun vi-mode-setup () | |
383 "Setup a buffer for vi-mode by creating necessary buffer-local variables." | |
384 ; (make-local-variable 'vi-add-to-mode-line) | |
385 ; (setq vi-add-to-mode-line vi-add-to-mode-line-1) | |
386 ; (or (memq vi-add-to-mode-line minor-mode-alist) | |
387 ; (setq minor-mode-alist (cons vi-add-to-mode-line minor-mode-alist))) | |
388 (make-local-variable 'vi-scroll-amount) | |
389 (setq vi-scroll-amount (/ (window-height) 2)) | |
390 (make-local-variable 'vi-shift-width) | |
391 (setq vi-shift-width 4) | |
392 (make-local-variable 'vi-ins-point) | |
393 (make-local-variable 'vi-ins-length) | |
394 (make-local-variable 'vi-ins-repetition) | |
395 (make-local-variable 'vi-ins-overwrt-p) | |
396 (make-local-variable 'vi-ins-prefix-code) | |
397 (make-local-variable 'vi-last-change-command) | |
398 (make-local-variable 'vi-last-shell-command) | |
399 (make-local-variable 'vi-last-find-char) | |
400 (make-local-variable 'vi-mark-alist) | |
401 (make-local-variable 'vi-insert-state) | |
402 (make-local-variable 'vi-mode-old-local-map) | |
403 (make-local-variable 'vi-mode-old-mode-name) | |
404 (make-local-variable 'vi-mode-old-major-mode) | |
405 (make-local-variable 'vi-mode-old-case-fold) | |
62758
3225f62f5e9f
(vi-mode-setup): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents:
60902
diff
changeset
|
406 (run-mode-hooks 'vi-mode-hook)) |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
407 |
258 | 408 ;;;###autoload |
6 | 409 (defun vi-mode () |
410 "Major mode that acts like the `vi' editor. | |
411 The purpose of this mode is to provide you the combined power of vi (namely, | |
412 the \"cross product\" effect of commands and repeat last changes) and Emacs. | |
413 | |
414 This command redefines nearly all keys to look like vi commands. | |
415 It records the previous major mode, and any vi command for input | |
416 \(`i', `a', `s', etc.) switches back to that mode. | |
417 Thus, ordinary Emacs (in whatever major mode you had been using) | |
418 is \"input\" mode as far as vi is concerned. | |
419 | |
420 To get back into vi from \"input\" mode, you must issue this command again. | |
421 Therefore, it is recommended that you assign it to a key. | |
422 | |
423 Major differences between this mode and real vi : | |
424 | |
425 * Limitations and unsupported features | |
426 - Search patterns with line offset (e.g. /pat/+3 or /pat/z.) are | |
427 not supported. | |
428 - Ex commands are not implemented; try ':' to get some hints. | |
429 - No line undo (i.e. the 'U' command), but multi-undo is a standard feature. | |
430 | |
431 * Modifications | |
432 - The stopping positions for some point motion commands (word boundary, | |
433 pattern search) are slightly different from standard 'vi'. | |
434 Also, no automatic wrap around at end of buffer for pattern searching. | |
435 - Since changes are done in two steps (deletion then insertion), you need | |
436 to undo twice to completely undo a change command. But this is not needed | |
437 for undoing a repeated change command. | |
438 - No need to set/unset 'magic', to search for a string with regular expr | |
439 in it just put a prefix arg for the search commands. Replace cmds too. | |
440 - ^R is bound to incremental backward search, so use ^L to redraw screen. | |
441 | |
442 * Extensions | |
443 - Some standard (or modified) Emacs commands were integrated, such as | |
444 incremental search, query replace, transpose objects, and keyboard macros. | |
445 - In command state, ^X links to the 'ctl-x-map', and ESC can be linked to | |
446 esc-map or set undefined. These can give you the full power of Emacs. | |
447 - See vi-com-map for those keys that are extensions to standard vi, e.g. | |
448 `vi-name-last-change-or-macro', `vi-verify-spelling', `vi-locate-def', | |
449 `vi-mark-region', and 'vi-quote-words'. Some of them are quite handy. | |
450 - Use \\[vi-switch-mode] to switch among different modes quickly. | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
451 |
6 | 452 Syntax table and abbrevs while in vi mode remain as they were in Emacs." |
453 (interactive) | |
454 (if (null vi-mode-old-major-mode) ; very first call for current buffer | |
455 (vi-mode-setup)) | |
456 | |
457 (if (eq major-mode 'vi-mode) | |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
458 (progn (ding) (message "Already in vi-mode.")) |
6 | 459 (setq vi-mode-old-local-map (current-local-map)) |
460 (setq vi-mode-old-mode-name mode-name) | |
461 (setq vi-mode-old-major-mode major-mode) | |
462 (setq vi-mode-old-case-fold case-fold-search) ; this is needed !! | |
463 (setq case-fold-search nil) ; exact case match in searching | |
464 (use-local-map vi-com-map) | |
465 (setq major-mode 'vi-mode) | |
466 (setq mode-name "VI") | |
11567
bcf841745ef2
(vi-switch-mode, vi-back-to-old-mode): Use force-mode-line-update.
Karl Heuer <kwzh@gnu.org>
parents:
11184
diff
changeset
|
467 (force-mode-line-update) ; force mode line update |
6 | 468 (if vi-insert-state ; this is a return from insertion |
469 (vi-end-of-insert-state)))) | |
470 | |
471 (defun vi-ding() | |
472 "Ding !" | |
473 (interactive) | |
474 (ding)) | |
475 | |
476 (defun vi-save-all-and-exit () | |
477 "Save all modified buffers without asking, then exits emacs." | |
478 (interactive) | |
479 (save-some-buffers t) | |
480 (kill-emacs)) | |
481 | |
482 ;; to be used by "ex" commands | |
483 (defvar vi-replaced-string nil) | |
484 (defvar vi-replacing-string nil) | |
485 | |
486 (defun vi-ex-cmd () | |
487 "Ex commands are not implemented in Evi mode. For some commonly used ex | |
488 commands, you can use the following alternatives for similar effect : | |
489 w C-x C-s (save-buffer) | |
490 wq C-x C-c (save-buffers-kill-emacs) | |
491 w fname C-x C-w (write-file) | |
492 e fname C-x C-f (find-file) | |
493 r fname C-x i (insert-file) | |
494 s/old/new use q (vi-replace) to do unconditional replace | |
495 use C-q (vi-query-replace) to do query replace | |
496 set sw=n M-x set-variable vi-shift-width n " | |
497 (interactive) | |
498 ;; (let ((cmd (read-string ":")) (lines 1)) | |
499 ;; (cond ((string-match "s")))) | |
500 (with-output-to-temp-buffer "*Help*" | |
9842
6f9b0830f124
(vi-switch-mode, vi-ex-cmd): Set help-mode in *Help* buffer.
Karl Heuer <kwzh@gnu.org>
parents:
3591
diff
changeset
|
501 (princ (documentation 'vi-ex-cmd)) |
6f9b0830f124
(vi-switch-mode, vi-ex-cmd): Set help-mode in *Help* buffer.
Karl Heuer <kwzh@gnu.org>
parents:
3591
diff
changeset
|
502 (save-excursion |
6f9b0830f124
(vi-switch-mode, vi-ex-cmd): Set help-mode in *Help* buffer.
Karl Heuer <kwzh@gnu.org>
parents:
3591
diff
changeset
|
503 (set-buffer standard-output) |
6f9b0830f124
(vi-switch-mode, vi-ex-cmd): Set help-mode in *Help* buffer.
Karl Heuer <kwzh@gnu.org>
parents:
3591
diff
changeset
|
504 (help-mode)))) |
6 | 505 |
506 (defun vi-undefined () | |
507 (interactive) | |
508 (message "Command key \"%s\" is undefined in Evi." | |
509 (single-key-description last-command-char)) | |
510 (ding)) | |
511 | |
512 (defun vi-unimplemented () | |
513 (interactive) | |
514 (message "Command key \"%s\" is not implemented in Evi." | |
515 (single-key-description last-command-char)) | |
516 (ding)) | |
517 | |
518 ;;;;; | |
519 (defun vi-goto-insert-state (repetition &optional prefix-code do-it-now-p) | |
520 "Go into insert state, the text entered will be repeated if REPETITION > 1. | |
521 If PREFIX-CODE is given, do it before insertion begins if DO-IT-NOW-P is T. | |
522 In any case, the prefix-code will be done before each 'redo-insert'. | |
63401
f32aaa9cbdf6
(vi-goto-insert-state): Fix quoting in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
62758
diff
changeset
|
523 This function expects `overwrite-mode' being set properly beforehand." |
6 | 524 (if do-it-now-p (apply (car prefix-code) (cdr prefix-code))) |
525 (setq vi-ins-point (point)) | |
526 (setq vi-ins-repetition repetition) | |
527 (setq vi-ins-prefix-code prefix-code) | |
528 (setq mode-name vi-mode-old-mode-name) | |
529 (setq case-fold-search vi-mode-old-case-fold) | |
530 (use-local-map vi-mode-old-local-map) | |
531 (setq major-mode vi-mode-old-major-mode) | |
11567
bcf841745ef2
(vi-switch-mode, vi-back-to-old-mode): Use force-mode-line-update.
Karl Heuer <kwzh@gnu.org>
parents:
11184
diff
changeset
|
532 (force-mode-line-update) |
6 | 533 (setq vi-insert-state t)) |
534 | |
535 (defun vi-end-of-insert-state () | |
536 "Terminate insertion and set up last change command." | |
537 (if (or (< (point) vi-ins-point) ;Check if there is any effective change | |
538 (and (= (point) vi-ins-point) (null vi-ins-prefix-code)) | |
539 (<= vi-ins-repetition 0)) | |
540 (vi-goto-command-state t) | |
541 (if (> vi-ins-repetition 1) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
542 (progn |
6 | 543 (let ((str (buffer-substring vi-ins-point (point)))) |
544 (while (> vi-ins-repetition 1) | |
545 (insert str) | |
546 (setq vi-ins-repetition (1- vi-ins-repetition)))))) | |
547 (vi-set-last-change-command 'vi-first-redo-insertion vi-ins-point (point) | |
548 overwrite-mode vi-ins-prefix-code) | |
549 (vi-goto-command-state t))) | |
550 | |
551 (defun vi-first-redo-insertion (begin end &optional overwrite-p prefix-code) | |
552 "Redo last insertion the first time. Extract the string and save it for | |
553 future redoes. Do prefix-code if it's given, use overwrite mode if asked." | |
554 (let ((str (buffer-substring begin end))) | |
555 (if prefix-code (apply (car prefix-code) (cdr prefix-code))) | |
556 (if overwrite-p (delete-region (point) (+ (point) (length str)))) | |
557 (insert str) | |
558 (vi-set-last-change-command 'vi-more-redo-insertion str overwrite-p prefix-code))) | |
559 | |
560 (defun vi-more-redo-insertion (str &optional overwrite-p prefix-code) | |
561 "Redo more insertion : copy string from STR to point, use overwrite mode | |
562 if overwrite-p is T; apply prefix-code first if it's non-nil." | |
563 (if prefix-code (apply (car prefix-code) (cdr prefix-code))) | |
564 (if overwrite-p (delete-region (point) (+ (point) (length str)))) | |
565 (insert str)) | |
566 | |
567 (defun vi-goto-command-state (&optional from-insert-state-p) | |
568 "Go to vi-mode command state. If optional arg exists, means return from | |
569 insert state." | |
570 (use-local-map vi-com-map) | |
571 (setq vi-insert-state nil) | |
572 (if from-insert-state-p | |
573 (if overwrite-mode | |
574 (overwrite-mode 0) | |
575 ; (set-minor-mode 'ins "Insert" nil) | |
576 ))) | |
577 | |
578 (defun vi-kill-line (arg) | |
579 "kill specified number of lines (=d$), text saved in the kill ring." | |
580 (interactive "*P") | |
581 (kill-line arg) | |
582 (vi-set-last-change-command 'kill-line arg)) | |
583 | |
9865
9ca8b94a9f07
(vi-kill-region): Pass args to kill-region.
Karl Heuer <kwzh@gnu.org>
parents:
9842
diff
changeset
|
584 (defun vi-kill-region (start end) |
9ca8b94a9f07
(vi-kill-region): Pass args to kill-region.
Karl Heuer <kwzh@gnu.org>
parents:
9842
diff
changeset
|
585 (interactive "*r") |
9ca8b94a9f07
(vi-kill-region): Pass args to kill-region.
Karl Heuer <kwzh@gnu.org>
parents:
9842
diff
changeset
|
586 (kill-region start end) |
6 | 587 (vi-set-last-change-command 'kill-region)) |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
588 |
6 | 589 (defun vi-append-at-end-of-line (arg) |
590 "go to end of line and then go into vi insert state." | |
591 (interactive "*p") | |
592 (vi-goto-insert-state arg '(end-of-line) t)) | |
593 | |
594 (defun vi-change-rest-of-line (arg) | |
595 "Change the rest of (ARG) lines (= c$ in vi)." | |
596 (interactive "*P") | |
597 (vi-goto-insert-state 1 (list 'kill-line arg) t)) | |
598 | |
599 (defun vi-insert-before-first-nonwhite (arg) | |
600 "(= ^i in vi)" | |
601 (interactive "*p") | |
602 (vi-goto-insert-state arg '(back-to-indentation) t)) | |
603 | |
604 (defun vi-open-above (arg) | |
605 "open new line(s) above current line and enter insert state." | |
606 (interactive "*p") | |
607 (vi-goto-insert-state 1 | |
608 (list (function (lambda (x) | |
609 (or (beginning-of-line) | |
610 (open-line x)))) arg) | |
611 t)) | |
612 | |
613 (defun vi-open-below (arg) | |
614 "open new line(s) and go into insert mode on the last line." | |
615 (interactive "*p") | |
616 (vi-goto-insert-state 1 | |
617 (list (function (lambda (x) | |
618 (or (end-of-line) | |
619 (open-line x) | |
620 (forward-line x)))) arg) | |
621 t)) | |
622 | |
623 (defun vi-insert-after (arg) | |
624 "start vi insert state after cursor." | |
625 (interactive "*p") | |
626 (vi-goto-insert-state arg | |
627 (list (function (lambda () | |
628 (if (not (eolp)) (forward-char))))) | |
629 t)) | |
630 | |
631 (defun vi-insert-before (arg) | |
632 "enter insert state before the cursor." | |
633 (interactive "*p") | |
634 (vi-goto-insert-state arg)) | |
635 | |
636 (defun vi-goto-line (arg) | |
637 "Go to ARGth line." | |
638 (interactive "P") | |
639 (if (null (vi-raw-numeric-prefix arg)) | |
63942
c9581f50bd50
(vi-mark-region): Use c-mark-function.
Richard M. Stallman <rms@gnu.org>
parents:
63401
diff
changeset
|
640 (with-no-warnings |
c9581f50bd50
(vi-mark-region): Use c-mark-function.
Richard M. Stallman <rms@gnu.org>
parents:
63401
diff
changeset
|
641 (end-of-buffer)) |
6 | 642 (goto-line (vi-prefix-numeric-value arg)))) |
643 | |
644 (defun vi-beginning-of-buffer () | |
645 "Move point to the beginning of current buffer." | |
646 (interactive) | |
647 (goto-char (point-min))) | |
648 | |
649 ;;;;; not used now | |
650 ;;(defvar regexp-search t ; string | |
651 ;; "*T if search string can contain regular expressions. (= set magic in vi)") | |
652 ;;;;; | |
653 | |
654 (defun vi-isearch-forward (arg) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
655 "Incremental search forward. Use regexp version if ARG is non-nil." |
6 | 656 (interactive "P") |
657 (let ((scmd (if arg 'isearch-forward-regexp 'isearch-forward)) | |
658 (opoint (point))) | |
659 (call-interactively scmd) | |
660 (if (= opoint (point)) | |
661 nil | |
662 (setq vi-search-last-command (if arg 're-search-forward 'search-forward))))) | |
663 | |
664 (defun vi-isearch-backward (arg) | |
665 "Incremental search backward. Use regexp version if ARG is non-nil." | |
666 (interactive "P") | |
667 (let ((scmd (if arg 'isearch-backward-regexp 'isearch-backward)) | |
668 (opoint (point))) | |
669 (call-interactively scmd) | |
670 (if (= opoint (point)) | |
671 nil | |
672 (setq vi-search-last-command (if arg 're-search-backward 'search-backward))))) | |
673 | |
674 (defun vi-search-forward (arg string) | |
675 "Nonincremental search forward. Use regexp version if ARG is non-nil." | |
676 (interactive (if current-prefix-arg | |
677 (list t (read-string "regexp/" nil)) | |
678 (list nil (read-string "/" nil)))) | |
679 (setq vi-search-last-command (if arg 're-search-forward 'search-forward)) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
680 (if (> (length string) 0) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
681 (isearch-update-ring string arg)) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
682 (funcall vi-search-last-command string nil nil 1)) |
6 | 683 |
684 (defun vi-search-backward (arg string) | |
685 "Nonincremental search backward. Use regexp version if ARG is non-nil." | |
686 (interactive (if current-prefix-arg | |
687 (list t (read-string "regexp?" nil)) | |
688 (list nil (read-string "?" nil)))) | |
689 (setq vi-search-last-command (if arg 're-search-backward 'search-backward)) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
690 (if (> (length string) 0) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
691 (isearch-update-ring string arg)) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
692 (funcall vi-search-last-command string nil nil 1)) |
6 | 693 |
694 (defun vi-repeat-last-search (arg &optional search-command search-string) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
695 "Repeat last search command. |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
696 If optional search-command/string are given, |
6 | 697 use those instead of the ones saved." |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
698 (interactive "p") |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
699 (if (null search-command) (setq search-command vi-search-last-command)) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
700 (if (null search-string) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
701 (setq search-string |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
702 (car (if (memq search-command |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
703 '(re-search-forward re-search-backward)) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
704 regexp-search-ring |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
705 search-ring)))) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
706 (if (null search-command) |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
707 (progn (ding) (message "No last search command to repeat.")) |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
708 (funcall search-command search-string nil nil arg))) |
6 | 709 |
710 (defun vi-reverse-last-search (arg &optional search-command search-string) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
711 "Redo last search command in reverse direction. |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
712 If the optional search args are given, use those instead of the ones saved." |
6 | 713 (interactive "p") |
714 (if (null search-command) (setq search-command vi-search-last-command)) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
715 (if (null search-string) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
716 (setq search-string |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
717 (car (if (memq search-command |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
718 '(re-search-forward re-search-backward)) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
719 regexp-search-ring |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
720 search-ring)))) |
6 | 721 (if (null search-command) |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
722 (progn (ding) (message "No last search command to repeat.")) |
6 | 723 (funcall (cond ((eq search-command 're-search-forward) 're-search-backward) |
724 ((eq search-command 're-search-backward) 're-search-forward) | |
725 ((eq search-command 'search-forward) 'search-backward) | |
726 ((eq search-command 'search-backward) 'search-forward)) | |
727 search-string nil nil arg))) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
728 |
6 | 729 (defun vi-join-lines (arg) |
730 "join ARG lines from current line (default 2), cleaning up white space." | |
731 (interactive "P") | |
732 (if (null (vi-raw-numeric-prefix arg)) | |
733 (delete-indentation t) | |
17979
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
734 (let ((count (vi-prefix-numeric-value arg))) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
735 (while (>= count 2) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
736 (delete-indentation t) |
2265b685be6a
(vi-join-lines): Locally bind count.
Richard M. Stallman <rms@gnu.org>
parents:
17976
diff
changeset
|
737 (setq count (1- count))))) |
6 | 738 (vi-set-last-change-command 'vi-join-lines arg)) |
739 | |
740 (defun vi-backward-kill-line () | |
741 "kill the current line. Only works in insert state." | |
742 (interactive) | |
743 (if (not vi-insert-state) | |
744 nil | |
745 (beginning-of-line 1) | |
746 (kill-line nil))) | |
747 | |
748 (defun vi-abort-ins () | |
749 "abort insert state, kill inserted text and go back to command state." | |
750 (interactive) | |
751 (if (not vi-insert-state) | |
752 nil | |
753 (if (> (point) vi-ins-point) | |
754 (kill-region vi-ins-point (point))) | |
755 (vi-goto-command-state t))) | |
756 | |
13951
b777c515e6dc
(vi-backward-windowful): Renamed from vi-backward-windowfull.
Karl Heuer <kwzh@gnu.org>
parents:
12735
diff
changeset
|
757 (defun vi-backward-windowful (count) |
b777c515e6dc
(vi-backward-windowful): Renamed from vi-backward-windowfull.
Karl Heuer <kwzh@gnu.org>
parents:
12735
diff
changeset
|
758 "Backward COUNT windowfuls. Default is one." |
6 | 759 (interactive "p") |
760 ; (set-mark-command nil) | |
761 (while (> count 0) | |
762 (scroll-down nil) | |
763 (setq count (1- count)))) | |
764 | |
765 (defun vi-scroll-down-window (count) | |
1577 | 766 "Scrolls down window COUNT lines. |
767 If COUNT is nil (actually, non-integer), scrolls default amount. | |
768 The given COUNT is remembered for future scrollings." | |
6 | 769 (interactive "P") |
770 (if (integerp count) | |
771 (setq vi-scroll-amount count)) | |
772 (scroll-up vi-scroll-amount)) | |
773 | |
774 (defun vi-expose-line-below (count) | |
775 "Expose COUNT more lines below the current window. Default COUNT is 1." | |
776 (interactive "p") | |
777 (scroll-up count)) | |
778 | |
13951
b777c515e6dc
(vi-backward-windowful): Renamed from vi-backward-windowfull.
Karl Heuer <kwzh@gnu.org>
parents:
12735
diff
changeset
|
779 (defun vi-forward-windowful (count) |
b777c515e6dc
(vi-backward-windowful): Renamed from vi-backward-windowfull.
Karl Heuer <kwzh@gnu.org>
parents:
12735
diff
changeset
|
780 "Forward COUNT windowfuls. Default is one." |
6 | 781 (interactive "p") |
782 ; (set-mark-command nil) | |
783 (while (> count 0) | |
784 (scroll-up nil) | |
785 (setq count (1- count)))) | |
786 | |
787 (defun vi-next-line (count) | |
788 "Go down count lines, try to keep at the same column." | |
789 (interactive "p") | |
790 (setq this-command 'next-line) ; this is a needed trick | |
78534
9ba019f08d78
(vi-next-line): Ignore return value of line-move.
Richard M. Stallman <rms@gnu.org>
parents:
74580
diff
changeset
|
791 (if (= (point) (progn (line-move count) (point))) |
6 | 792 (ding) ; no moving, already at end of buffer |
793 (setq last-command 'next-line))) | |
794 | |
795 (defun vi-next-line-first-nonwhite (count) | |
796 "Go down COUNT lines. Stop at first non-white." | |
797 (interactive "p") | |
798 (if (= (point) (progn (forward-line count) (back-to-indentation) (point))) | |
799 (ding))) ; no moving, already at end of buffer | |
800 | |
801 (defun vi-previous-line-first-nonwhite (count) | |
802 "Go up COUNT lines. Stop at first non-white." | |
803 (interactive "p") | |
804 (previous-line count) | |
805 (back-to-indentation)) | |
806 | |
807 (defun vi-scroll-up-window (count) | |
1577 | 808 "Scrolls up window COUNT lines. |
809 If COUNT is nil (actually, non-integer), scrolls default amount. | |
810 The given COUNT is remembered for future scrollings." | |
6 | 811 (interactive "P") |
812 (if (integerp count) | |
813 (setq vi-scroll-amount count)) | |
814 (scroll-down vi-scroll-amount)) | |
815 | |
816 (defun vi-expose-line-above (count) | |
817 "Expose COUNT more lines above the current window. Default COUNT is 1." | |
818 (interactive "p") | |
819 (scroll-down count)) | |
820 | |
821 (defun vi-char-argument (arg) | |
822 "Get following character (could be any CHAR) as part of the prefix argument. | |
74580
17d458291533
(vi-char-argument): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents:
63942
diff
changeset
|
823 Possible prefix-arg cases are nil, INTEGER, (nil . CHAR) or (INTEGER . CHAR)." |
6 | 824 (interactive "P") |
825 (let ((char (read-char))) | |
826 (cond ((null arg) (setq prefix-arg (cons nil char))) | |
827 ((integerp arg) (setq prefix-arg (cons arg char))) | |
828 ; This can happen only if the user changed his/her mind for CHAR, | |
829 ; Or there are some leading "universal-argument"s | |
830 (t (setq prefix-arg (cons (car arg) char)))))) | |
831 | |
832 (defun vi-goto-mark (mark-char &optional line-flag) | |
1577 | 833 "Go to marked position or line (if line-flag is given). |
834 Goto mark '@' means jump into and pop the top mark on the mark ring." | |
6 | 835 (cond ((char-equal mark-char last-command-char) ; `` or '' |
836 (exchange-point-and-mark) (if line-flag (back-to-indentation))) | |
837 ((char-equal mark-char ?@) ; jump and pop mark | |
838 (set-mark-command t) (if line-flag (back-to-indentation))) | |
839 (t | |
840 (let ((mark (vi-get-mark mark-char))) | |
841 (if (null mark) | |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
842 (progn (vi-ding) (message "Mark register undefined.")) |
6 | 843 (set-mark-command nil) |
844 (goto-char mark) | |
845 (if line-flag (back-to-indentation))))))) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
846 |
6 | 847 (defun vi-goto-line-mark (char) |
848 "Go to the line (at first non-white) marked by next char." | |
849 (interactive "c") | |
850 (vi-goto-mark char t)) | |
851 | |
852 (defun vi-goto-char-mark (char) | |
853 "Go to the char position marked by next mark-char." | |
854 (interactive "c") | |
855 (vi-goto-mark char)) | |
856 | |
857 (defun vi-digit-argument (arg) | |
858 "Set numeric prefix argument." | |
859 (interactive "P") | |
860 (cond ((null arg) (digit-argument arg)) | |
861 ((integerp arg) (digit-argument nil) | |
862 (setq prefix-arg (* prefix-arg arg))) | |
863 (t (digit-argument nil) ; in (NIL . CHAR) or (NUM . CHAR) form | |
864 (setq prefix-arg (cons (* prefix-arg | |
865 (if (null (car arg)) 1 (car arg))) | |
866 (cdr arg)))))) | |
867 | |
868 (defun vi-raw-numeric-prefix (arg) | |
869 "Return the raw value of numeric part prefix argument." | |
870 (if (consp arg) (car arg) arg)) | |
871 | |
872 (defun vi-prefix-numeric-value (arg) | |
873 "Return numeric meaning of the raw prefix argument. This is a modification | |
874 to the standard one provided in `callint.c' to handle (_ . CHAR) cases." | |
875 (cond ((null arg) 1) | |
876 ((integerp arg) arg) | |
877 ((consp arg) (if (car arg) (car arg) 1)))) | |
878 | |
879 (defun vi-reverse-last-find-char (count &optional find-arg) | |
880 "Reverse last f F t T operation COUNT times. If the optional FIND-ARG | |
881 is given, it is used instead of the saved one." | |
882 (interactive "p") | |
883 (if (null find-arg) (setq find-arg vi-last-find-char)) | |
884 (if (null find-arg) | |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
885 (progn (ding) (message "No last find char to repeat.")) |
6 | 886 (vi-find-char (cons (* (car find-arg) -1) (cdr find-arg)) count))) ;6/13/86 |
887 | |
888 (defun vi-find-char (arg count) | |
889 "Find in DIRECTION (1/-1) for CHAR of COUNT'th times on current line. | |
890 If UPTO-FLAG is T, stop before the char. ARG = (DIRECTION.CHAR.UPTO-FLAG." | |
891 (let* ((direction (car arg)) (char (car (cdr arg))) | |
892 (upto-flag (cdr (cdr arg))) (pos (+ (point) direction))) | |
893 (if (catch 'exit-find-char | |
894 (while t | |
895 (cond ((null (char-after pos)) (throw 'exit-find-char nil)) | |
896 ((char-equal (char-after pos) ?\n) (throw 'exit-find-char nil)) | |
897 ((char-equal char (char-after pos)) (setq count (1- count)) | |
898 (if (= count 0) | |
899 (throw 'exit-find-char | |
900 (if upto-flag | |
901 (setq pos (- pos direction)) | |
902 pos))))) | |
903 (setq pos (+ pos direction)))) | |
904 (goto-char pos) | |
905 (ding)))) | |
906 | |
907 (defun vi-repeat-last-find-char (count &optional find-arg) | |
908 "Repeat last f F t T operation COUNT times. If optional FIND-ARG is given, | |
909 it is used instead of the saved one." | |
910 (interactive "p") | |
911 (if (null find-arg) (setq find-arg vi-last-find-char)) | |
912 (if (null find-arg) | |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
913 (progn (ding) (message "No last find char to repeat.")) |
6 | 914 (vi-find-char find-arg count))) |
915 | |
916 (defun vi-backward-find-char (count char) | |
917 "Find the COUNT'th CHAR backward on current line." | |
918 (interactive "p\nc") | |
919 (setq vi-last-find-char (cons -1 (cons char nil))) | |
920 (vi-repeat-last-find-char count)) | |
921 | |
922 (defun vi-forward-find-char (count char) | |
923 "Find the COUNT'th CHAR forward on current line." | |
924 (interactive "p\nc") | |
925 (setq vi-last-find-char (cons 1 (cons char nil))) | |
926 (vi-repeat-last-find-char count)) | |
927 | |
928 (defun vi-backward-upto-char (count char) | |
929 "Find upto the COUNT'th CHAR backward on current line." | |
930 (interactive "p\nc") | |
931 (setq vi-last-find-char (cons -1 (cons char t))) | |
932 (vi-repeat-last-find-char count)) | |
933 | |
934 (defun vi-forward-upto-char (count char) | |
935 "Find upto the COUNT'th CHAR forward on current line." | |
936 (interactive "p\nc") | |
937 (setq vi-last-find-char (cons 1 (cons char t))) | |
938 (vi-repeat-last-find-char count)) | |
939 | |
940 (defun vi-end-of-word (count) | |
941 "Move forward until encountering the end of a word. | |
942 With argument, do this that many times." | |
943 (interactive "p") | |
944 (if (not (eobp)) (forward-char)) | |
945 (if (re-search-forward "\\W*\\w+\\>" nil t count) | |
946 (backward-char))) | |
947 | |
948 (defun vi-replace-1-char (count char) | |
949 "Replace char after point by CHAR. Repeat COUNT times." | |
950 (interactive "p\nc") | |
951 (delete-char count nil) ; don't save in kill ring | |
952 (setq last-command-char char) | |
953 (self-insert-command count) | |
954 (vi-set-last-change-command 'vi-replace-1-char count char)) | |
955 | |
956 (defun vi-replace-chars (arg) | |
957 "Replace chars over old ones." | |
958 (interactive "*p") | |
959 (overwrite-mode 1) | |
960 (vi-goto-insert-state arg)) | |
961 | |
962 (defun vi-substitute-chars (count) | |
963 "Substitute COUNT chars by the input chars, enter insert state." | |
964 (interactive "*p") | |
965 (vi-goto-insert-state 1 (list (function (lambda (c) ; this is a bit tricky | |
966 (delete-region (point) | |
967 (+ (point) c)))) | |
968 count) t)) | |
969 | |
970 (defun vi-substitute-lines (count) | |
971 "Substitute COUNT lines by the input chars. (=cc in vi)" | |
972 (interactive "*p") | |
973 (vi-goto-insert-state 1 (list 'vi-delete-op 'next-line (1- count)) t)) | |
974 | |
975 (defun vi-prefix-char-value (arg) | |
976 "Get the char part of the current prefix argument." | |
977 (cond ((null arg) nil) | |
978 ((integerp arg) nil) | |
979 ((consp arg) (cdr arg)) | |
980 (t nil))) | |
981 | |
982 (defun vi-operator (arg) | |
983 "Handling vi operators (d/c/</>/!/=/y). Current implementation requires | |
984 the key bindings of the operators being fixed." | |
985 (interactive "P") | |
986 (catch 'vi-exit-op | |
987 (let ((this-op-char last-command-char)) | |
988 (setq last-command-char (read-char)) | |
989 (setq this-command (lookup-key vi-com-map (char-to-string last-command-char))) | |
990 (if (not (eq this-command 'vi-digit-argument)) | |
991 (setq prefix-arg arg) | |
992 (vi-digit-argument arg) | |
993 (setq last-command-char (read-char)) | |
994 (setq this-command (lookup-key vi-com-map (char-to-string last-command-char)))) | |
995 (cond ((char-equal this-op-char last-command-char) ; line op | |
996 (vi-execute-op this-op-char 'next-line | |
997 (cons (1- (vi-prefix-numeric-value prefix-arg)) | |
998 (vi-prefix-char-value prefix-arg)))) | |
999 ;; We assume any command that has no property 'point-moving-unit' | |
1000 ;; as having that property with the value 'CHAR'. 3/12/86 | |
1001 (t ;; (get this-command 'point-moving-unit) | |
1002 (vi-execute-op this-op-char this-command prefix-arg)))))) | |
1003 ;; (t (throw 'vi-exit-op (ding))))))) | |
1004 | |
1005 (defun vi-execute-op (op-char motion-command arg) | |
1006 "Execute vi edit operator as specified by OP-CHAR, the operand is the region | |
1007 determined by the MOTION-COMMAND with ARG." | |
1008 (cond ((= op-char ?d) | |
1009 (if (vi-delete-op motion-command arg) | |
1010 (vi-set-last-change-command 'vi-delete-op (vi-repeat-command-of motion-command) arg))) | |
1011 ((= op-char ?c) | |
1012 (if (vi-delete-op motion-command arg) | |
1013 (vi-goto-insert-state 1 (list 'vi-delete-op | |
1014 (vi-repeat-command-of motion-command) arg) nil))) | |
1015 ((= op-char ?y) | |
1016 (if (vi-yank-op motion-command arg) | |
1017 (vi-set-last-change-command 'vi-yank-op (vi-repeat-command-of motion-command) arg))) | |
1018 ((= op-char ?!) | |
1019 (if (vi-shell-op motion-command arg) | |
1020 (vi-set-last-change-command 'vi-shell-op (vi-repeat-command-of motion-command) arg vi-last-shell-command))) | |
1021 ((= op-char ?<) | |
1022 (if (vi-shift-op motion-command arg (- vi-shift-width)) | |
1023 (vi-set-last-change-command 'vi-shift-op (vi-repeat-command-of motion-command) arg (- vi-shift-width)))) | |
1024 ((= op-char ?>) | |
1025 (if (vi-shift-op motion-command arg vi-shift-width) | |
1026 (vi-set-last-change-command 'vi-shift-op (vi-repeat-command-of motion-command) arg vi-shift-width))) | |
1027 ((= op-char ?=) | |
1028 (if (vi-indent-op motion-command arg) | |
1029 (vi-set-last-change-command 'vi-indent-op (vi-repeat-command-of motion-command) arg))) | |
1030 ((= op-char ?\\) | |
1031 (vi-narrow-op motion-command arg)))) | |
1032 | |
1033 (defun vi-repeat-command-of (command) | |
1034 "Return the command for redo the given command." | |
1035 (let ((cmd-type (get command 'point-moving-unit))) | |
1036 (cond ((eq cmd-type 'search) 'vi-repeat-last-search) | |
1037 ((eq cmd-type 'find) 'vi-repeat-last-find-char) | |
1038 (t command)))) | |
1039 | |
1040 (defun vi-effective-range (motion-command arg) | |
1041 "Return (begin . end) of the range spanned by executing the given | |
1042 MOTION-COMMAND with ARG. | |
1043 MOTION-COMMAND in ready-to-eval list form is not yet supported." | |
1044 (save-excursion | |
1045 (let ((begin (point)) end opoint | |
1046 (moving-unit (get motion-command 'point-moving-unit))) | |
1047 (setq prefix-arg arg) | |
1048 (setq opoint (point)) | |
1049 (command-execute motion-command nil) | |
1050 ;; Check if there is any effective motion. Note that for single line operation | |
1051 ;; the motion-command causes no effective point movement (since it moves up or | |
1052 ;; down zero lines), but it should be counted as effectively moved. | |
1053 (if (and (= (point) opoint) (not (eq moving-unit 'line))) | |
1054 (cons opoint opoint) ; no effective motion | |
1055 (if (eq moving-unit 'region) | |
1056 (setq begin (or (mark) (point)))) | |
1057 (if (<= begin (point)) | |
1058 (setq end (point)) | |
1059 (setq end begin) | |
1060 (setq begin (point))) | |
1061 (cond ((or (eq moving-unit 'match) (eq moving-unit 'find)) | |
1062 (setq end (1+ end))) | |
1063 ((eq moving-unit 'line) | |
1064 (goto-char begin) (beginning-of-line) (setq begin (point)) | |
1065 (goto-char end) (next-line 1) (beginning-of-line) (setq end (point)))) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
1066 (if (> end (point-max)) (setq end (point-max))) ; force in buffer region |
6 | 1067 (cons begin end))))) |
1068 | |
1069 (defun vi-delete-op (motion-command arg) | |
1070 "Delete range specified by MOTION-COMMAND with ARG." | |
1071 (let* ((range (vi-effective-range motion-command arg)) | |
1072 (begin (car range)) (end (cdr range)) reg) | |
1073 (if (= begin end) | |
1074 nil ; point not moved, abort op | |
1075 (setq reg (vi-prefix-char-value arg)) | |
1076 (if (null reg) | |
1077 (kill-region begin end) ; kill ring as unnamed registers | |
1078 (if (and (>= reg ?A) (<= reg ?Z)) | |
1079 (append-to-register (downcase reg) begin end t) | |
1080 (copy-to-register reg begin end t))) | |
1081 t))) | |
1082 | |
1083 (defun vi-yank-op (motion-command arg) | |
1084 "Yank (in vi sense) range specified by MOTION-COMMAND with ARG." | |
1085 (let* ((range (vi-effective-range motion-command arg)) | |
1086 (begin (car range)) (end (cdr range)) reg) | |
1087 (if (= begin end) | |
1088 nil ; point not moved, abort op | |
1089 (setq reg (vi-prefix-char-value arg)) | |
1090 (if (null reg) | |
1091 (copy-region-as-kill begin end); kill ring as unnamed registers | |
1092 (if (and (>= reg ?A) (<= reg ?Z)) | |
1093 (append-to-register (downcase reg) begin end nil) | |
1094 (copy-to-register reg begin end nil))) | |
1095 t))) | |
1096 | |
1097 (defun vi-yank-line (arg) | |
1098 "Yank (in vi sense) lines (= `yy' command)." | |
1099 (interactive "*P") | |
1100 (setq arg (cons (1- (vi-prefix-numeric-value arg)) (vi-prefix-char-value arg))) | |
1101 (if (vi-yank-op 'next-line arg) | |
1102 (vi-set-last-change-command 'vi-yank-op 'next-line arg))) | |
1103 | |
1104 (defun vi-string-end-with-nl-p (string) | |
1577 | 1105 "See if STRING ends with a newline char. |
1106 Used in checking whether the yanked text should be put back as lines or not." | |
6 | 1107 (= (aref string (1- (length string))) ?\n)) |
1108 | |
1109 (defun vi-put-before (arg &optional after-p) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
1110 "Put yanked (in vi sense) text back before/above cursor. |
1577 | 1111 If a numeric prefix value (currently it should be >1) is given, put back |
1112 text as lines. If the optional after-p is given, put after/below the cursor." | |
6 | 1113 (interactive "P") |
1114 (let ((reg (vi-prefix-char-value arg)) put-text) | |
1115 (if (and reg (or (< reg ?1) (> reg ?9)) (null (get-register reg))) | |
1116 (error "Nothing in register %c" reg) | |
1117 (if (null reg) (setq reg ?1)) ; the default is the last text killed | |
1118 (setq put-text | |
707 | 1119 (cond |
1120 ((and (>= reg ?1) (<= reg ?9)) | |
1121 (setq this-command 'yank) ; So we may yank-pop !! | |
1122 (current-kill (- reg ?0 1) 'do-not-rotate)) | |
1123 ((stringp (get-register reg)) (get-register reg)) | |
1124 (t (error "Register %c is not containing text string" reg)))) | |
6 | 1125 (if (vi-string-end-with-nl-p put-text) ; put back text as lines |
1126 (if after-p | |
1127 (progn (next-line 1) (beginning-of-line)) | |
1128 (beginning-of-line)) | |
1129 (if after-p (forward-char 1))) | |
1130 (push-mark (point)) | |
1131 (insert put-text) | |
1132 (exchange-point-and-mark) | |
1133 ;; (back-to-indentation) ; this is not allowed if we allow yank-pop | |
1134 (vi-set-last-change-command 'vi-put-before arg after-p)))) | |
1135 | |
1136 (defun vi-put-after (arg) | |
1137 "Put yanked (in vi sense) text back after/below cursor." | |
1138 (interactive "P") | |
1139 (vi-put-before arg t)) | |
1140 | |
1141 (defun vi-shell-op (motion-command arg &optional shell-command) | |
1577 | 1142 "Perform shell command (as filter). |
1143 Performs command on range specified by MOTION-COMMAND | |
6 | 1144 with ARG. If SHELL-COMMAND is not given, ask for one from minibuffer. |
1145 If char argument is given, it directs the output to a *temp* buffer." | |
1146 (let* ((range (vi-effective-range motion-command arg)) | |
1147 (begin (car range)) (end (cdr range))) | |
1148 (if (= begin end) | |
1149 nil ; point not moved, abort op | |
1150 (cond ((null shell-command) | |
1151 (setq shell-command (read-string "!" nil)) | |
1152 (setq vi-last-shell-command shell-command))) | |
1153 (shell-command-on-region begin end shell-command (not (vi-prefix-char-value arg))) | |
1154 t))) | |
1155 | |
1156 (defun vi-shift-op (motion-command arg amount) | |
1157 "Perform shift command on range specified by MOTION-COMMAND with ARG for | |
1158 AMOUNT on each line. Negative amount means shift left. | |
1159 SPECIAL FEATURE: char argument can be used to specify shift amount(1-9)." | |
1160 (let* ((range (vi-effective-range motion-command arg)) | |
1161 (begin (car range)) (end (cdr range))) | |
1162 (if (= begin end) | |
1163 nil ; point not moved, abort op | |
1164 (if (vi-prefix-char-value arg) | |
1165 (setq amount (if (> amount 0) | |
1166 (- (vi-prefix-char-value arg) ?0) | |
1167 (- ?0 (vi-prefix-char-value arg))))) | |
1168 (indent-rigidly begin end amount) | |
1169 t))) | |
1170 | |
1171 (defun vi-indent-op (motion-command arg) | |
1172 "Perform indent command on range specified by MOTION-COMMAND with ARG." | |
1173 (let* ((range (vi-effective-range motion-command arg)) | |
1174 (begin (car range)) (end (cdr range))) | |
1175 (if (= begin end) | |
1176 nil ; point not moved, abort op | |
1177 (indent-region begin end nil) ; insert TAB as indent command | |
1178 t))) | |
1179 | |
1180 (defun vi-narrow-op (motion-command arg) | |
1181 "Narrow to region specified by MOTION-COMMAND with ARG." | |
1182 (let* ((range (vi-effective-range motion-command arg)) | |
1183 (begin (car range)) (end (cdr range)) reg) | |
1184 (if (= begin end) | |
1185 nil ; point not moved, abort op | |
1186 (narrow-to-region begin end)))) | |
1187 | |
1188 (defun vi-get-mark (char) | |
1189 "Return contents of vi mark register named CHAR, or nil if undefined." | |
1190 (cdr (assq char vi-mark-alist))) | |
1191 | |
1192 (defun vi-set-mark (char) | |
1577 | 1193 "Set contents of vi mark register named CHAR to current point. |
1194 '@' is the special anonymous mark register." | |
6 | 1195 (interactive "c") |
1196 (if (char-equal char ?@) | |
1197 (set-mark-command nil) | |
1198 (let ((aelt (assq char vi-mark-alist))) | |
1199 (if aelt | |
1200 (move-marker (cdr aelt) (point)) ; fixed 6/12/86 | |
1201 (setq aelt (cons char (copy-marker (point)))) | |
1202 (setq vi-mark-alist (cons aelt vi-mark-alist)))))) | |
1203 | |
1204 (defun vi-find-matching-paren () | |
1205 "Locate the matching paren. It's a hack right now." | |
1206 (interactive) | |
1207 (cond ((looking-at "[[({]") (forward-sexp 1) (backward-char 1)) | |
1208 ((looking-at "[])}]") (forward-char 1) (backward-sexp 1)) | |
1209 (t (ding)))) | |
1210 | |
1211 (defun vi-backward-blank-delimited-word (count) | |
1212 "Backward COUNT blank-delimited words." | |
1213 (interactive "p") | |
1214 (if (re-search-backward "[ \t\n\`][^ \t\n\`]+" nil t count) | |
1215 (if (not (bobp)) (forward-char 1)))) | |
1216 | |
1217 (defun vi-forward-blank-delimited-word (count) | |
1218 "Forward COUNT blank-delimited words." | |
1219 (interactive "p") | |
1220 (if (re-search-forward "[^ \t\n]*[ \t\n]+[^ \t\n]" nil t count) | |
1221 (if (not (eobp)) (backward-char 1)))) | |
1222 | |
1223 (defun vi-end-of-blank-delimited-word (count) | |
1224 "Forward to the end of the COUNT'th blank-delimited word." | |
1225 (interactive "p") | |
1226 (if (re-search-forward "[^ \t\n\']+[ \t\n\']" nil t count) | |
1227 (if (not (eobp)) (backward-char 2)))) | |
1228 | |
1229 (defun vi-home-window-line (arg) | |
1230 "To window home or arg'th line from the top of the window." | |
1231 (interactive "p") | |
1232 (move-to-window-line (1- arg)) | |
1233 (back-to-indentation)) | |
1234 | |
1235 (defun vi-last-window-line (arg) | |
1236 "To window last line or arg'th line from the bottom of the window." | |
1237 (interactive "p") | |
1238 (move-to-window-line (- arg)) | |
1239 (back-to-indentation)) | |
1240 | |
1241 (defun vi-middle-window-line () | |
1242 "To the middle line of the window." | |
1243 (interactive) | |
1244 (move-to-window-line nil) | |
1245 (back-to-indentation)) | |
1246 | |
1247 (defun vi-forward-word (count) | |
1248 "Stop at the beginning of the COUNT'th words from point." | |
1249 (interactive "p") | |
1250 (if (re-search-forward "\\w*\\W+\\<" nil t count) | |
1251 t | |
1252 (vi-ding))) | |
1253 | |
1254 (defun vi-set-last-change-command (fun &rest args) | |
1577 | 1255 "Set (FUN . ARGS) as the `last-change-command'." |
6 | 1256 (setq vi-last-change-command (cons fun args))) |
1257 | |
1258 (defun vi-redo-last-change-command (count &optional command) | |
1259 "Redo last change command COUNT times. If the optional COMMAND is given, | |
1577 | 1260 it is used instead of the current `last-change-command'." |
6 | 1261 (interactive "p") |
1262 (if (null command) | |
1263 (setq command vi-last-change-command)) | |
1264 (if (null command) | |
1265 (message "No last change command available.") | |
1266 (while (> count 0) | |
1267 (apply (car command) (cdr command)) | |
1268 (setq count (1- count))))) | |
1269 | |
1270 (defun vi-kill-char (count) | |
1271 "Kill COUNT chars from current point." | |
1272 (interactive "*p") | |
1273 (delete-char count t) ; save in kill ring | |
1274 (vi-set-last-change-command 'delete-char count t)) | |
1275 | |
1276 (defun vi-transpose-objects (arg unit) | |
1577 | 1277 "Transpose objects. |
1278 The following char specifies unit of objects to be | |
6 | 1279 transposed -- \"c\" for chars, \"l\" for lines, \"w\" for words, \"s\" for |
1280 sexp, \"p\" for paragraph. | |
1281 For the use of the prefix-arg, refer to individual functions called." | |
1282 (interactive "*P\nc") | |
1283 (if (char-equal unit ??) | |
1284 (progn | |
1285 (message "Transpose: c(har), l(ine), p(aragraph), s(-exp), w(ord),") | |
1286 (setq unit (read-char)))) | |
1287 (vi-set-last-change-command 'vi-transpose-objects arg unit) | |
1288 (cond ((char-equal unit ?c) (transpose-chars arg)) | |
1289 ((char-equal unit ?l) (transpose-lines (vi-prefix-numeric-value arg))) | |
1290 ((char-equal unit ?p) (transpose-paragraphs (vi-prefix-numeric-value arg))) | |
1291 ((char-equal unit ?s) (transpose-sexps (vi-prefix-numeric-value arg))) | |
1292 ((char-equal unit ?w) (transpose-words (vi-prefix-numeric-value arg))) | |
1293 (t (vi-transpose-objects arg ??)))) | |
1294 | |
1295 (defun vi-query-replace (arg) | |
1296 "Query replace, use regexp version if ARG is non-nil." | |
1297 (interactive "*P") | |
1298 (let ((rcmd (if arg 'query-replace-regexp 'query-replace))) | |
1299 (call-interactively rcmd nil))) | |
1300 | |
1301 (defun vi-replace (arg) | |
1302 "Replace strings, use regexp version if ARG is non-nil." | |
1303 (interactive "*P") | |
1304 (let ((rcmd (if arg 'replace-regexp 'replace-string))) | |
1305 (call-interactively rcmd nil))) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
1306 |
6 | 1307 (defun vi-adjust-window (arg position) |
1308 "Move current line to the top/center/bottom of the window." | |
1309 (interactive "p\nc") | |
1310 (cond ((char-equal position ?\r) (recenter 0)) | |
1311 ((char-equal position ?-) (recenter -1)) | |
1312 ((char-equal position ?.) (recenter (/ (window-height) 2))) | |
1313 (t (message "Move current line to: \\r(top) -(bottom) .(middle)") | |
1314 (setq position (read-char)) | |
1315 (vi-adjust-window arg position)))) | |
1316 | |
1317 (defun vi-goto-column (col) | |
1318 "Go to given column of the current line." | |
1319 (interactive "p") | |
1320 (let ((opoint (point))) | |
1321 (beginning-of-line) | |
1322 (while (> col 1) | |
1323 (if (eolp) | |
1324 (setq col 0) | |
1325 (forward-char 1) | |
1326 (setq col (1- col)))) | |
1327 (if (= col 1) | |
1328 t | |
1329 (goto-char opoint) | |
1330 (ding)))) | |
1331 | |
1332 (defun vi-name-last-change-or-macro (arg char) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
1333 "Give name to the last change command or just defined kbd macro. |
1577 | 1334 If prefix ARG is given, name last macro, otherwise name last change command. |
1335 The following CHAR will be the name for the command or macro." | |
6 | 1336 (interactive "P\nc") |
1337 (if arg | |
1338 (name-last-kbd-macro (intern (char-to-string char))) | |
1339 (if (eq (car vi-last-change-command) 'vi-first-redo-insertion) | |
1340 (let* ((args (cdr vi-last-change-command)) ; save the insertion text | |
1341 (str (buffer-substring (nth 0 args) (nth 1 args))) | |
1342 (overwrite-p (nth 2 args)) | |
1343 (prefix-code (nth 3 args))) | |
1344 (vi-set-last-change-command 'vi-more-redo-insertion str | |
1345 overwrite-p prefix-code))) | |
1346 (fset (intern (char-to-string char)) vi-last-change-command))) | |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38431
diff
changeset
|
1347 |
6 | 1348 (defun vi-call-named-change-or-macro (count char) |
1349 "Execute COUNT times the keyboard macro definition named by the following CHAR." | |
1350 (interactive "p\nc") | |
1351 (if (stringp (symbol-function (intern (char-to-string char)))) | |
1352 (execute-kbd-macro (intern (char-to-string char)) count) | |
1353 (vi-redo-last-change-command count (symbol-function (intern (char-to-string char)))))) | |
1354 | |
1355 (defun vi-change-case (arg) ; could be made as an operator ? | |
1356 "Change the case of the char after point." | |
1357 (interactive "*p") | |
1358 (catch 'exit | |
1359 (if (looking-at "[a-z]") | |
1360 (upcase-region (point) (+ (point) arg)) | |
1361 (if (looking-at "[A-Z]") | |
1362 (downcase-region (point) (+ (point) arg)) | |
1363 (ding) | |
1364 (throw 'exit nil))) | |
1365 (vi-set-last-change-command 'vi-change-case arg) ;should avoid redundant save | |
1366 (forward-char arg))) | |
1367 | |
1368 (defun vi-ask-for-info (char) | |
1369 "Inquire status info. The next CHAR will specify the particular info requested." | |
1370 (interactive "c") | |
1371 (cond ((char-equal char ?l) (what-line)) | |
1372 ((char-equal char ?c) (what-cursor-position)) | |
1373 ((char-equal char ?p) (what-page)) | |
1374 (t (message "Ask for: l(ine number), c(ursor position), p(age number)") | |
1375 (setq char (read-char)) | |
1376 (vi-ask-for-info char)))) | |
1377 | |
1378 (defun vi-mark-region (arg region) | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
1577
diff
changeset
|
1379 "Mark region appropriately. The next char REGION is d(efun),s(-exp),b(uffer), |
6 | 1380 p(aragraph), P(age), f(unction in C/Pascal etc.), w(ord), e(nd of sentence), |
1381 l(ines)." | |
1382 (interactive "p\nc") | |
9865
9ca8b94a9f07
(vi-kill-region): Pass args to kill-region.
Karl Heuer <kwzh@gnu.org>
parents:
9842
diff
changeset
|
1383 (cond ((char-equal region ?d) (mark-defun)) |
6 | 1384 ((char-equal region ?s) (mark-sexp arg)) |
1385 ((char-equal region ?b) (mark-whole-buffer)) | |
9865
9ca8b94a9f07
(vi-kill-region): Pass args to kill-region.
Karl Heuer <kwzh@gnu.org>
parents:
9842
diff
changeset
|
1386 ((char-equal region ?p) (mark-paragraph)) |
6 | 1387 ((char-equal region ?P) (mark-page arg)) |
63942
c9581f50bd50
(vi-mark-region): Use c-mark-function.
Richard M. Stallman <rms@gnu.org>
parents:
63401
diff
changeset
|
1388 ((char-equal region ?f) (c-mark-function)) |
6 | 1389 ((char-equal region ?w) (mark-word arg)) |
1390 ((char-equal region ?e) (mark-end-of-sentence arg)) | |
1391 ((char-equal region ?l) (vi-mark-lines arg)) | |
1392 (t (message "Mark: d(efun),s(-exp),b(uf),p(arag),P(age),f(unct),w(ord),e(os),l(ines)") | |
1393 (setq region (read-char)) | |
1394 (vi-mark-region arg region)))) | |
1395 | |
1396 (defun vi-mark-lines (num) | |
1397 "Mark NUM of lines from current line as current region." | |
1398 (beginning-of-line 1) | |
1399 (push-mark) | |
1400 (end-of-line num)) | |
1401 | |
1402 (defun vi-verify-spelling (arg unit) | |
1403 "Verify spelling for the objects specified by char UNIT : [b(uffer), | |
1404 r(egion), s(tring), w(ord) ]." | |
1405 (interactive "P\nc") | |
1406 (setq prefix-arg arg) ; seems not needed | |
1407 (cond ((char-equal unit ?b) (call-interactively 'spell-buffer)) | |
1408 ((char-equal unit ?r) (call-interactively 'spell-region)) | |
1409 ((char-equal unit ?s) (call-interactively 'spell-string)) | |
1410 ((char-equal unit ?w) (call-interactively 'spell-word)) | |
1411 (t (message "Spell check: b(uffer), r(egion), s(tring), w(ord)") | |
1412 (setq unit (read-char)) | |
1413 (vi-verify-spelling arg unit)))) | |
1414 | |
1415 (defun vi-do-old-mode-C-c-command (arg) | |
1416 "This is a hack for accessing mode specific C-c commands in vi-mode." | |
1417 (interactive "P") | |
1418 (let ((cmd (lookup-key vi-mode-old-local-map | |
1419 (concat "\C-c" (char-to-string (read-char)))))) | |
1420 (if (catch 'exit-vi-mode ; kludge hack due to dynamic binding | |
1421 ; of case-fold-search | |
1422 (if (null cmd) | |
1423 (progn (ding) nil) | |
1424 (let ((case-fold-search vi-mode-old-case-fold)) ; a hack | |
1425 (setq prefix-arg arg) | |
1426 (command-execute cmd nil) | |
1427 nil))) | |
1428 (progn | |
1429 (vi-back-to-old-mode) | |
1430 (setq prefix-arg arg) | |
1431 (command-execute cmd nil))))) | |
1432 | |
1433 (defun vi-quote-words (arg char) | |
1577 | 1434 "Quote ARG words from the word point is on with pattern specified by CHAR. |
1435 Currently, CHAR could be [,{,(,\",',`,<,*, etc." | |
6 | 1436 (interactive "*p\nc") |
1437 (while (not (string-match "[[({<\"'`*]" (char-to-string char))) | |
1438 (message "Enter any of [,{,(,<,\",',`,* as quoting character.") | |
1439 (setq char (read-char))) | |
1440 (vi-set-last-change-command 'vi-quote-words arg char) | |
1441 (if (not (looking-at "\\<")) (forward-word -1)) | |
1442 (insert char) | |
1443 (cond ((char-equal char ?[) (setq char ?])) | |
1444 ((char-equal char ?{) (setq char ?})) | |
1445 ((char-equal char ?<) (setq char ?>)) | |
1446 ((char-equal char ?() (setq char ?))) | |
1447 ((char-equal char ?`) (setq char ?'))) | |
1448 (vi-end-of-word arg) | |
1449 (forward-char 1) | |
1450 (insert char)) | |
1451 | |
1452 (defun vi-locate-def () | |
1577 | 1453 "Locate definition in current file for the name before the point. |
1454 It assumes a `(def..' always starts at the beginning of a line." | |
6 | 1455 (interactive) |
1456 (let (name) | |
1457 (save-excursion | |
1458 (setq name (buffer-substring (progn (vi-backward-blank-delimited-word 1) | |
1459 (skip-chars-forward "^a-zA-Z") | |
1460 (point)) | |
1461 (progn (vi-end-of-blank-delimited-word 1) | |
1462 (forward-char) | |
1463 (skip-chars-backward "^a-zA-Z") | |
1464 (point))))) | |
1465 (set-mark-command nil) | |
1466 (goto-char (point-min)) | |
1467 (if (re-search-forward (concat "^(def[unvarconst ]*" name) nil t) | |
1468 nil | |
53863
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1469 (ding) |
3c9fc6a0a6db
(vi-mode): Remove extra format string argument.
Andreas Schwab <schwab@suse.de>
parents:
52401
diff
changeset
|
1470 (message "No definition for \"%s\" in current file." name) |
6 | 1471 (set-mark-command t)))) |
1472 | |
1473 (defun vi-split-open-line (arg) | |
1474 "Insert a newline and leave point before it. | |
1577 | 1475 With ARG, inserts that many newlines." |
6 | 1476 (interactive "*p") |
1477 (vi-goto-insert-state 1 | |
1478 (list (function (lambda (arg) | |
1479 (let ((flag (and (bolp) (not (bobp))))) | |
1480 (if flag (forward-char -1)) | |
1481 (while (> arg 0) | |
1482 (save-excursion | |
1483 (insert ?\n) | |
1484 (if fill-prefix (insert fill-prefix))) | |
1485 (setq arg (1- arg))) | |
1486 (if flag (forward-char 1))))) arg) | |
1487 t)) | |
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
1488 |
18383 | 1489 (provide 'vi) |
1490 | |
60902
7160fe3a7ef1
find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53863
diff
changeset
|
1491 ;; arch-tag: ac9bdac3-8acb-4ddd-bdae-c6dd873153b3 |
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
1492 ;;; vi.el ends here |