]> code.delx.au - gnu-emacs/blob - lisp/emulation/tpu-edt.el
2ae6c52f0f2a91bfe886f3c4306251752fa972bd
[gnu-emacs] / lisp / emulation / tpu-edt.el
1 ;;; tpu-edt.el --- Emacs emulating TPU emulating EDT
2
3 ;; Copyright (C) 1993 Free Software Foundation, Inc.
4
5 ;; Author: Rob Riepel <riepel@networking.stanford.edu>
6 ;; Maintainer: Rob Riepel <riepel@networking.stanford.edu>
7 ;; Version: 3.2
8 ;; Keywords: emulations
9
10 ;; This file is part of GNU Emacs.
11
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; any later version.
16
17 ;; GNU Emacs is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
21
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs; see the file COPYING. If not, write to
24 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25
26 ;;; Code:
27
28
29 ;;;
30 ;;; Revision and Version Information
31 ;;;
32 (defconst tpu-version "3.2" "TPU-edt version number.")
33
34
35 ;;;
36 ;;; User Configurable Variables
37 ;;;
38 (defconst tpu-have-ispell t
39 "*If non-nil (default), TPU-edt uses ispell for spell checking.")
40
41 (defconst tpu-kill-buffers-silently nil
42 "*If non-nil, TPU-edt kills modified buffers without asking.")
43
44 (defvar tpu-percent-scroll 75
45 "*Percentage of the screen to scroll for next/previous screen commands.")
46
47 (defvar tpu-pan-columns 16
48 "*Number of columns the tpu-pan functions scroll left or right.")
49
50
51 ;;;
52 ;;; Emacs version identifiers - currently referenced by
53 ;;;
54 ;;; o tpu-mark o tpu-set-mark
55 ;;; o tpu-string-prompt o tpu-regexp-prompt
56 ;;; o tpu-edt-on o tpu-load-xkeys
57 ;;; o tpu-update-mode-line o mode line section
58 ;;;
59 (defconst tpu-emacs19-p (not (string-lessp emacs-version "19"))
60 "Non-NIL if we are running Lucid or GNU Emacs version 19.")
61
62 (defconst tpu-gnu-emacs18-p (not tpu-emacs19-p)
63 "Non-NIL if we are running GNU Emacs version 18.")
64
65 (defconst tpu-lucid-emacs19-p
66 (and tpu-emacs19-p (string-match "Lucid" emacs-version))
67 "Non-NIL if we are running Lucid Emacs version 19.")
68
69 (defconst tpu-gnu-emacs19-p (and tpu-emacs19-p (not tpu-lucid-emacs19-p))
70 "Non-NIL if we are running GNU Emacs version 19.")
71
72
73 ;;;
74 ;;; Global Keymaps
75 ;;;
76 (defvar CSI-map (make-sparse-keymap)
77 "Maps the CSI function keys on the VT100 keyboard.
78 CSI is DEC's name for the sequence <ESC>[.")
79
80 (defvar SS3-map (make-sparse-keymap)
81 "Maps the SS3 function keys on the VT100 keyboard.
82 SS3 is DEC's name for the sequence <ESC>O.")
83
84 (defvar GOLD-map (make-keymap)
85 "Maps the function keys on the VT100 keyboard preceeded by PF1.
86 GOLD is the ASCII 7-bit escape sequence <ESC>OP.")
87
88 (defvar GOLD-CSI-map (make-sparse-keymap)
89 "Maps the function keys on the VT100 keyboard preceeded by GOLD-CSI.")
90
91 (defvar GOLD-SS3-map (make-sparse-keymap)
92 "Maps the function keys on the VT100 keyboard preceeded by GOLD-SS3.")
93
94 (defvar tpu-global-map nil "TPU-edt global keymap.")
95 (defvar tpu-original-global-map (copy-keymap global-map)
96 "Original global keymap.")
97
98 (and tpu-lucid-emacs19-p
99 (defvar minibuffer-local-ns-map (make-sparse-keymap)
100 "Hack to give Lucid emacs the same maps as GNU emacs."))
101
102
103 ;;;
104 ;;; Global Variables
105 ;;;
106 (defvar tpu-edt-mode nil
107 "If non-nil, TPU-edt mode is active.")
108
109 (defvar tpu-last-replaced-text ""
110 "Last text deleted by a TPU-edt replace command.")
111 (defvar tpu-last-deleted-region ""
112 "Last text deleted by a TPU-edt remove command.")
113 (defvar tpu-last-deleted-lines ""
114 "Last text deleted by a TPU-edt line-delete command.")
115 (defvar tpu-last-deleted-words ""
116 "Last text deleted by a TPU-edt word-delete command.")
117 (defvar tpu-last-deleted-char ""
118 "Last character deleted by a TPU-edt character-delete command.")
119
120 (defvar tpu-searching-forward t
121 "If non-nil, TPU-edt is searching in the forward direction.")
122 (defvar tpu-search-last-string ""
123 "Last text searched for by the TPU-edt search commands.")
124
125 (defvar tpu-regexp-p nil
126 "If non-nil, TPU-edt uses regexp search and replace routines.")
127 (defvar tpu-rectangular-p nil
128 "If non-nil, TPU-edt removes and inserts rectangles.")
129 (defvar tpu-advance t
130 "True when TPU-edt is operating in the forward direction.")
131 (defvar tpu-reverse nil
132 "True when TPU-edt is operating in the backward direction.")
133 (defvar tpu-control-keys t
134 "If non-nil, control keys are set to perform TPU functions.")
135 (defvar tpu-xkeys-file nil
136 "File containing TPU-edt X key map.")
137
138 (defvar tpu-rectangle-string nil
139 "Mode line string to identify rectangular mode.")
140 (defvar tpu-direction-string nil
141 "Mode line string to identify current direction.")
142
143 (defvar tpu-add-at-bol-hist nil
144 "History variable for tpu-edt-add-at-bol function.")
145 (defvar tpu-add-at-eol-hist nil
146 "History variable for tpu-edt-add-at-eol function.")
147 (defvar tpu-regexp-prompt-hist nil
148 "History variable for search and replace functions.")
149
150
151 ;;;
152 ;;; Buffer Local Variables
153 ;;;
154 (defvar tpu-newline-and-indent-p nil
155 "If non-nil, Return produces a newline and indents.")
156 (make-variable-buffer-local 'tpu-newline-and-indent-p)
157
158 (defvar tpu-newline-and-indent-string nil
159 "Mode line string to identify AutoIndent mode.")
160 (make-variable-buffer-local 'tpu-newline-and-indent-string)
161
162 (defvar tpu-saved-delete-func nil
163 "Saved value of the delete key.")
164 (make-variable-buffer-local 'tpu-saved-delete-func)
165
166 (defvar tpu-buffer-local-map nil
167 "TPU-edt buffer local key map.")
168 (make-variable-buffer-local 'tpu-buffer-local-map)
169
170
171 ;;;
172 ;;; Mode Line - Modify the mode line to show the following
173 ;;;
174 ;;; o If the mark is set.
175 ;;; o Direction of motion.
176 ;;; o Active rectangle mode.
177 ;;;
178 (defvar tpu-original-mode-line mode-line-format)
179 (defvar tpu-original-mm-alist minor-mode-alist)
180
181 (defvar tpu-mark-flag " ")
182 (make-variable-buffer-local 'tpu-mark-flag)
183
184 (defun tpu-set-mode-line (for-tpu)
185 "Set the mode for TPU-edt, or reset it to default Emacs."
186 (cond ((not for-tpu)
187 (setq mode-line-format tpu-original-mode-line)
188 (setq minor-mode-alist tpu-original-mm-alist))
189 (t
190 (setq-default mode-line-format
191 (list (purecopy "")
192 'mode-line-modified
193 'mode-line-buffer-identification
194 (purecopy " ")
195 'global-mode-string
196 (purecopy " ")
197 'tpu-mark-flag
198 (purecopy " %[(")
199 'mode-name 'minor-mode-alist "%n" 'mode-line-process
200 (purecopy ")%]----")
201 (purecopy '(-3 . "%p"))
202 (purecopy "-%-")))
203 (or (assq 'tpu-newline-and-indent-p minor-mode-alist)
204 (setq minor-mode-alist
205 (cons '(tpu-newline-and-indent-p
206 tpu-newline-and-indent-string)
207 minor-mode-alist)))
208 (or (assq 'tpu-rectangular-p minor-mode-alist)
209 (setq minor-mode-alist
210 (cons '(tpu-rectangular-p tpu-rectangle-string)
211 minor-mode-alist)))
212 (or (assq 'tpu-direction-string minor-mode-alist)
213 (setq minor-mode-alist
214 (cons '(tpu-direction-string tpu-direction-string)
215 minor-mode-alist))))))
216
217 (defun tpu-update-mode-line nil
218 "Make sure mode-line in the current buffer reflects all changes."
219 (setq tpu-mark-flag (if (tpu-mark) "M" " "))
220 (cond (tpu-emacs19-p (force-mode-line-update))
221 (t (set-buffer-modified-p (buffer-modified-p)) (sit-for 0))))
222
223 (cond (tpu-gnu-emacs19-p
224 (add-hook 'activate-mark-hook 'tpu-update-mode-line)
225 (add-hook 'deactivate-mark-hook 'tpu-update-mode-line))
226 (tpu-lucid-emacs19-p
227 (add-hook 'zmacs-deactivate-region-hook 'tpu-update-mode-line)
228 (add-hook 'zmacs-activate-region-hook 'tpu-update-mode-line)))
229
230
231 ;;;
232 ;;; Match Markers -
233 ;;;
234 ;;; Set in: Search
235 ;;;
236 ;;; Used in: Replace, Substitute, Store-Text, Cut/Remove,
237 ;;; Append, and Change-Case
238 ;;;
239 (defvar tpu-match-beginning-mark (make-marker))
240 (defvar tpu-match-end-mark (make-marker))
241
242 (defun tpu-set-match nil
243 "Set markers at match beginning and end."
244 ;; Add one to beginning mark so it stays with the first character of
245 ;; the string even if characters are added just before the string.
246 (setq tpu-match-beginning-mark (copy-marker (1+ (match-beginning 0))))
247 (setq tpu-match-end-mark (copy-marker (match-end 0))))
248
249 (defun tpu-unset-match nil
250 "Unset match beginning and end markers."
251 (set-marker tpu-match-beginning-mark nil)
252 (set-marker tpu-match-end-mark nil))
253
254 (defun tpu-match-beginning nil
255 "Returns the location of the last match beginning."
256 (1- (marker-position tpu-match-beginning-mark)))
257
258 (defun tpu-match-end nil
259 "Returns the location of the last match end."
260 (marker-position tpu-match-end-mark))
261
262 (defun tpu-check-match nil
263 "Returns t if point is between tpu-match markers.
264 Otherwise sets the tpu-match markers to nil and returns nil."
265 ;; make sure 1- marker is in this buffer
266 ;; 2- point is at or after beginning marker
267 ;; 3- point is before ending marker, or in the case of
268 ;; zero length regions (like bol, or eol) that the
269 ;; beginning, end, and point are equal.
270 (cond ((and
271 (equal (marker-buffer tpu-match-beginning-mark) (current-buffer))
272 (>= (point) (1- (marker-position tpu-match-beginning-mark)))
273 (or
274 (< (point) (marker-position tpu-match-end-mark))
275 (and (= (1- (marker-position tpu-match-beginning-mark))
276 (marker-position tpu-match-end-mark))
277 (= (marker-position tpu-match-end-mark) (point))))) t)
278 (t
279 (tpu-unset-match) nil)))
280
281 (defun tpu-show-match-markers nil
282 "Show the values of the match markers."
283 (interactive)
284 (if (markerp tpu-match-beginning-mark)
285 (let ((beg (marker-position tpu-match-beginning-mark)))
286 (message "(%s, %s) in %s -- current %s in %s"
287 (if beg (1- beg) nil)
288 (marker-position tpu-match-end-mark)
289 (marker-buffer tpu-match-end-mark)
290 (point) (current-buffer)))))
291
292
293 ;;;
294 ;;; Utilities
295 ;;;
296 (defun tpu-caar (thingy) (car (car thingy)))
297 (defun tpu-cadr (thingy) (car (cdr thingy)))
298
299 (defun tpu-mark nil
300 "TPU-edt version of the mark function.
301 Return the appropriate value of the mark for the current
302 version of emacs."
303 (cond (tpu-lucid-emacs19-p (mark (not zmacs-regions)))
304 (tpu-gnu-emacs19-p (and mark-active (mark (not transient-mark-mode))))
305 (t (mark))))
306
307 (defun tpu-set-mark (pos)
308 "TPU-edt verion of the set-mark function.
309 Sets the mark at POS and activates the region acording to the
310 current version of emacs."
311 (set-mark pos)
312 (and tpu-lucid-emacs19-p pos (zmacs-activate-region)))
313
314 (defun tpu-string-prompt (prompt history-symbol)
315 "Read a string with PROMPT."
316 (if tpu-emacs19-p
317 (read-from-minibuffer prompt nil nil nil history-symbol)
318 (read-string prompt)))
319
320 (defvar tpu-last-answer nil "Most recent response to tpu-y-or-n-p.")
321
322 (defun tpu-y-or-n-p (prompt &optional not-yes)
323 "Prompt for a y or n answer with positive default.
324 Optional second argument NOT-YES changes default to negative.
325 Like emacs y-or-n-p, also accepts space as y and DEL as n."
326 (message (format "%s[%s]" prompt (if not-yes "n" "y")))
327 (let ((doit t))
328 (while doit
329 (setq doit nil)
330 (let ((ans (read-char)))
331 (cond ((or (= ans ?y) (= ans ?Y) (= ans ?\ ))
332 (setq tpu-last-answer t))
333 ((or (= ans ?n) (= ans ?N) (= ans ?\C-?))
334 (setq tpu-last-answer nil))
335 ((= ans ?\r) (setq tpu-last-answer (not not-yes)))
336 (t
337 (setq doit t) (beep)
338 (message (format "Please answer y or n. %s[%s]"
339 prompt (if not-yes "n" "y"))))))))
340 tpu-last-answer)
341
342 (defun tpu-local-set-key (key func)
343 "Replace a key in the TPU-edt local key map.
344 Create the key map if necessary."
345 (cond ((not (keymapp tpu-buffer-local-map))
346 (setq tpu-buffer-local-map (if (current-local-map)
347 (copy-keymap (current-local-map))
348 (make-sparse-keymap)))
349 (use-local-map tpu-buffer-local-map)))
350 (local-set-key key func))
351
352 (defun tpu-current-line nil
353 "Return the vertical position of point in the selected window.
354 Top line is 0. Counts each text line only once, even if it wraps."
355 (+ (count-lines (window-start) (point)) (if (= (current-column) 0) 1 0) -1))
356
357
358 ;;;
359 ;;; Breadcrumbs
360 ;;;
361 (defvar tpu-breadcrumb-plist nil
362 "The set of user-defined markers (breadcrumbs), as a plist.")
363
364 (defun tpu-drop-breadcrumb (num)
365 "Drops a breadcrumb that can be returned to later with goto-breadcrumb."
366 (interactive "p")
367 (put tpu-breadcrumb-plist num (list (current-buffer) (point)))
368 (message "Mark %d set." num))
369
370 (defun tpu-goto-breadcrumb (num)
371 "Returns to a breadcrumb set with drop-breadcrumb."
372 (interactive "p")
373 (cond ((get tpu-breadcrumb-plist num)
374 (switch-to-buffer (car (get tpu-breadcrumb-plist num)))
375 (goto-char (tpu-cadr (get tpu-breadcrumb-plist num)))
376 (message "mark %d found." num))
377 (t
378 (message "mark %d not found." num))))
379
380
381 ;;;
382 ;;; Miscellaneous
383 ;;;
384 (defun tpu-change-case (num)
385 "Change the case of the character under the cursor or region.
386 Accepts a prefix argument of the number of characters to invert."
387 (interactive "p")
388 (cond ((tpu-mark)
389 (let ((beg (region-beginning)) (end (region-end)))
390 (while (> end beg)
391 (funcall (if (= (downcase (char-after beg)) (char-after beg))
392 'upcase-region 'downcase-region)
393 beg (1+ beg))
394 (setq beg (1+ beg)))
395 (tpu-unselect t)))
396 ((tpu-check-match)
397 (let ((beg (tpu-match-beginning)) (end (tpu-match-end)))
398 (while (> end beg)
399 (funcall (if (= (downcase (char-after beg)) (char-after beg))
400 'upcase-region 'downcase-region)
401 beg (1+ beg))
402 (setq beg (1+ beg)))
403 (tpu-unset-match)))
404 (t
405 (while (> num 0)
406 (funcall (if (= (downcase (following-char)) (following-char))
407 'upcase-region 'downcase-region)
408 (point) (1+ (point)))
409 (forward-char (if tpu-reverse -1 1))
410 (setq num (1- num))))))
411
412 (defun tpu-fill (num)
413 "Fill paragraph or marked region.
414 With argument, fill and justify."
415 (interactive "P")
416 (cond ((tpu-mark)
417 (fill-region (point) (tpu-mark) num)
418 (tpu-unselect t))
419 (t
420 (fill-paragraph num))))
421
422 (defun tpu-version nil
423 "Print the TPU-edt version number."
424 (interactive)
425 (message
426 "TPU-edt version %s by Rob Riepel (riepel@networking.stanford.edu)"
427 tpu-version))
428
429 (defun tpu-reset-screen-size (height width)
430 "Sets the screen size."
431 (interactive "nnew screen height: \nnnew screen width: ")
432 (set-screen-height height)
433 (set-screen-width width))
434
435 (defun tpu-toggle-newline-and-indent nil
436 "Toggle between 'newline and indent' and 'simple newline'."
437 (interactive)
438 (cond (tpu-newline-and-indent-p
439 (setq tpu-newline-and-indent-string "")
440 (setq tpu-newline-and-indent-p nil)
441 (tpu-local-set-key "\C-m" 'newline))
442 (t
443 (setq tpu-newline-and-indent-string " AutoIndent")
444 (setq tpu-newline-and-indent-p t)
445 (tpu-local-set-key "\C-m" 'newline-and-indent)))
446 (tpu-update-mode-line)
447 (and (interactive-p)
448 (message "Carriage return inserts a newline%s"
449 (if tpu-newline-and-indent-p " and indents." "."))))
450
451 (defun tpu-spell-check nil
452 "Checks the spelling of the region, or of the entire buffer if no
453 region is selected."
454 (interactive)
455 (cond (tpu-have-ispell
456 (if (tpu-mark) (ispell-region (tpu-mark) (point)) (ispell-buffer)))
457 (t
458 (if (tpu-mark) (spell-region (tpu-mark) (point)) (spell-buffer))))
459 (if (tpu-mark) (tpu-unselect t)))
460
461 (defun tpu-toggle-overwrite-mode nil
462 "Switches in and out of overwrite mode"
463 (interactive)
464 (cond (overwrite-mode
465 (tpu-local-set-key "\177" tpu-saved-delete-func)
466 (overwrite-mode 0))
467 (t
468 (setq tpu-saved-delete-func (local-key-binding "\177"))
469 (tpu-local-set-key "\177" 'picture-backward-clear-column)
470 (overwrite-mode 1))))
471
472 (defun tpu-special-insert (num)
473 "Insert a character or control code according to
474 its ASCII decimal value."
475 (interactive "P")
476 (if overwrite-mode (delete-char 1))
477 (insert (if num num 0)))
478
479 (defun tpu-quoted-insert (num)
480 "Read next input character and insert it.
481 This is useful for inserting control characters."
482 (interactive "*p")
483 (let ((char (read-char)) )
484 (if overwrite-mode (delete-char num))
485 (insert-char char num)))
486
487
488 ;;;
489 ;;; TPU line-mode commands
490 ;;;
491 (defun tpu-include (file)
492 "TPU-like include file"
493 (interactive "fInclude file: ")
494 (save-excursion
495 (insert-file file)
496 (message "")))
497
498 (defun tpu-get (file)
499 "TPU-like get file"
500 (interactive "FFile to get: ")
501 (find-file file))
502
503 (defun tpu-what-line nil
504 "Tells what line the point is on,
505 and the total number of lines in the buffer."
506 (interactive)
507 (if (eobp)
508 (message "You are at the End of Buffer. The last line is %d."
509 (count-lines 1 (point-max)))
510 (message "Line %d of %d"
511 (count-lines 1 (1+ (point)))
512 (count-lines 1 (point-max)))))
513
514 (defun tpu-exit nil
515 "Exit the way TPU does, save current buffer and ask about others."
516 (interactive)
517 (if (not (eq (recursion-depth) 0))
518 (exit-recursive-edit)
519 (progn (save-buffer) (save-buffers-kill-emacs))))
520
521 (defun tpu-quit nil
522 "Quit the way TPU does, ask to make sure changes should be abandoned."
523 (interactive)
524 (let ((list (buffer-list))
525 (working t))
526 (while (and list working)
527 (let ((buffer (car list)))
528 (if (and (buffer-file-name buffer) (buffer-modified-p buffer))
529 (if (tpu-y-or-n-p
530 "Modifications will not be saved, continue quitting? ")
531 (kill-emacs t) (setq working nil)))
532 (setq list (cdr list))))
533 (if working (kill-emacs t))))
534
535
536 ;;;
537 ;;; Command and Function Aliases
538 ;;;
539 ;;;###autoload
540 (fset 'tpu-edt-mode 'tpu-edt-on)
541 (fset 'TPU-EDT-MODE 'tpu-edt-on)
542
543 ;;;###autoload
544 (fset 'tpu-edt 'tpu-edt-on)
545 (fset 'TPU-EDT 'tpu-edt-on)
546
547 (fset 'exit 'tpu-exit)
548 (fset 'EXIT 'tpu-exit)
549
550 (fset 'Get 'tpu-get)
551 (fset 'GET 'tpu-get)
552
553 (fset 'include 'tpu-include)
554 (fset 'INCLUDE 'tpu-include)
555
556 (fset 'quit 'tpu-quit)
557 (fset 'QUIT 'tpu-quit)
558
559 (fset 'spell 'tpu-spell-check)
560 (fset 'SPELL 'tpu-spell-check)
561
562 (fset 'what\ line 'tpu-what-line)
563 (fset 'WHAT\ LINE 'tpu-what-line)
564
565 (fset 'replace 'tpu-lm-replace)
566 (fset 'REPLACE 'tpu-lm-replace)
567
568 (fset 'help 'tpu-help)
569 (fset 'HELP 'tpu-help)
570
571 (fset 'set\ cursor\ free 'tpu-set-cursor-free)
572 (fset 'SET\ CURSOR\ FREE 'tpu-set-cursor-free)
573
574 (fset 'set\ cursor\ bound 'tpu-set-cursor-bound)
575 (fset 'SET\ CURSOR\ BOUND 'tpu-set-cursor-bound)
576
577 (fset 'set\ scroll\ margins 'tpu-set-scroll-margins)
578 (fset 'SET\ SCROLL\ MARGINS 'tpu-set-scroll-margins)
579
580
581 ;; Around emacs version 18.57, function line-move was renamed to
582 ;; next-line-internal. If we're running under an older emacs,
583 ;; make next-line-internal equivalent to line-move.
584
585 (if (not (fboundp 'next-line-internal)) (fset 'next-line-internal 'line-move))
586
587
588 ;;;
589 ;;; Help
590 ;;;
591 (defconst tpu-help-keypad-map "\f
592 _______________________ _______________________________
593 | HELP | Do | | | | | |
594 |KeyDefs| | | | | | |
595 |_______|_______________| |_______|_______|_______|_______|
596 _______________________ _______________________________
597 | Find |Insert |Remove | | Gold | HELP |FndNxt | Del L |
598 | | |Sto Tex| | key |E-Help | Find |Undel L|
599 |_______|_______|_______| |_______|_______|_______|_______|
600 |Select |Pre Scr|Nex Scr| | Page | Sect |Append | Del W |
601 | Reset |Pre Win|Nex Win| | Do | Fill |Replace|Undel W|
602 |_______|_______|_______| |_______|_______|_______|_______|
603 |Move up| |Forward|Reverse|Remove | Del C |
604 | Top | |Bottom | Top |Insert |Undel C|
605 _______|_______|_______ |_______|_______|_______|_______|
606 |Mov Lef|Mov Dow|Mov Rig| | Word | EOL | Char | |
607 |StaOfLi|Bottom |EndOfLi| |ChngCas|Del EOL|SpecIns| Enter |
608 |_______|_______|_______| |_______|_______|_______| |
609 | Line |Select | Subs |
610 | Open Line | Reset | |
611 |_______________|_______|_______|
612 ")
613
614 (defconst tpu-help-text "
615 \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\f
616
617 Control Characters
618
619 ^A toggle insert and overwrite
620 ^B recall
621 ^E end of line
622
623 ^G Cancel current operation
624 ^H beginning of line
625 ^J delete previous word
626
627 ^K learn
628 ^L insert page break
629 ^R remember (during learn), re-center
630
631 ^U delete to beginning of line
632 ^V quote
633 ^W refresh
634
635 ^Z exit
636 ^X^X exchange point and mark - useful for checking region boundaries
637
638 \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\f
639 Gold-<key> Functions
640
641 B Next Buffer - display the next buffer (all buffers)
642 C Recall - edit and possibly repeat previous commands
643 E Exit - save current buffer and ask about others
644
645 G Get - load a file into a new edit buffer
646 I Include - include a file in this buffer
647 K Kill Buffer - abandon edits and delete buffer
648
649 M Buffer Menu - display a list of all buffers
650 N Next File Buffer - display next buffer containing a file
651 O Occur - show following lines containing REGEXP
652
653 Q Quit - exit without saving anything
654 R Toggle rectangular mode for remove and insert
655 S Search and substitute - line mode REPLACE command
656
657 U Undo - undo the last edit
658 W Write - save current buffer
659 X Exit - save all modified buffers and exit
660
661 \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\f
662
663 *** No more help, use P to view previous screen")
664
665 (defvar tpu-help-enter (format "%s" "\eOM")) ; tpu-help enter key symbol
666 (defvar tpu-help-return (format "%s" "\r")) ; tpu-help enter key symbol
667 (defvar tpu-help-N "N") ; tpu-help "N" symbol
668 (defvar tpu-help-n "n") ; tpu-help "n" symbol
669 (defvar tpu-help-P "P") ; tpu-help "P" symbol
670 (defvar tpu-help-p "p") ; tpu-help "p" symbol
671
672 (defun tpu-help nil
673 "Display TPU-edt help."
674 (interactive)
675 ;; Save current window configuration
676 (save-window-excursion
677 ;; Create and fill help buffer if necessary
678 (if (not (get-buffer "*TPU-edt Help*"))
679 (progn (generate-new-buffer "*TPU-edt Help*")
680 (switch-to-buffer "*TPU-edt Help*")
681 (insert tpu-help-keypad-map)
682 (insert tpu-help-text)
683 (setq buffer-read-only t)))
684
685 ;; Display the help buffer
686 (switch-to-buffer "*TPU-edt Help*")
687 (delete-other-windows)
688 (tpu-move-to-beginning)
689 (forward-line 1)
690 (tpu-line-to-top-of-window)
691
692 ;; Prompt for keys to describe, based on screen state (split/not split)
693 (let ((key nil) (fkey nil) (split nil))
694 (while (not (equal tpu-help-return fkey))
695 (if split
696 (setq key
697 (read-key-sequence
698 "Press the key you want help on (RET=exit, ENTER=redisplay, N=next, P=prev): "))
699 (setq key
700 (read-key-sequence
701 "Press the key you want help on (RET to exit, N next screen, P prev screen): ")))
702
703 ;; Process the read key
704 ;;
705 ;; ENTER - Display just the help window
706 ;; N or n - Next help or describe-key screen
707 ;; P or p - Previous help or describe-key screen
708 ;; RETURN - Exit from TPU-help
709 ;; default - describe the key
710 ;;
711 (setq fkey (format "%s" key))
712 (cond ((equal tpu-help-enter fkey)
713 (setq split nil)
714 (delete-other-windows))
715 ((or (equal tpu-help-N fkey) (equal tpu-help-n fkey))
716 (cond (split
717 (condition-case nil
718 (scroll-other-window 8)
719 (error nil)))
720 (t
721 (forward-page)
722 (forward-line 1)
723 (tpu-line-to-top-of-window))))
724 ((or (equal tpu-help-P fkey) (equal tpu-help-p fkey))
725 (cond (split
726 (condition-case nil
727 (scroll-other-window -8)
728 (error nil)))
729 (t
730 (backward-page 2)
731 (forward-line 1)
732 (tpu-line-to-top-of-window))))
733 ((not (equal tpu-help-return fkey))
734 (setq split t)
735 (describe-key key)
736 ;; If the key is undefined, leave the
737 ;; message in the mini-buffer for 3 seconds
738 (if (not (key-binding key)) (sit-for 3))))))))
739
740
741 ;;;
742 ;;; Auto-insert
743 ;;;
744 (defun tpu-insert-escape nil
745 "Inserts an escape character, and so becomes the escape-key alias."
746 (interactive)
747 (insert "\e"))
748
749 (defun tpu-insert-formfeed nil
750 "Inserts a formfeed character."
751 (interactive)
752 (insert "\C-L"))
753
754
755 ;;;
756 ;;; Define key
757 ;;;
758 (defvar tpu-saved-control-r nil "Saved value of Control-r.")
759
760 (defun tpu-end-define-macro-key (key)
761 "Ends the current macro definition"
762 (interactive "kPress the key you want to use to do what was just learned: ")
763 (end-kbd-macro nil)
764 (global-set-key key last-kbd-macro)
765 (global-set-key "\C-r" tpu-saved-control-r))
766
767 (defun tpu-define-macro-key nil
768 "Bind a set of keystrokes to a single key, or key combination."
769 (interactive)
770 (setq tpu-saved-control-r (global-key-binding "\C-r"))
771 (global-set-key "\C-r" 'tpu-end-define-macro-key)
772 (start-kbd-macro nil))
773
774
775 ;;;
776 ;;; Buffers and Windows
777 ;;;
778 (defun tpu-kill-buffer nil
779 "Kills the current buffer. If tpu-kill-buffers-silently is non-nil,
780 kills modified buffers without asking."
781 (interactive)
782 (if tpu-kill-buffers-silently (set-buffer-modified-p nil))
783 (kill-buffer (current-buffer)))
784
785 (defun tpu-save-all-buffers-kill-emacs nil
786 "Save all buffers and exit emacs."
787 (interactive)
788 (setq trim-versions-without-asking t)
789 (save-buffers-kill-emacs t))
790
791 (defun tpu-write-current-buffers nil
792 "Save all modified buffers without exiting."
793 (interactive)
794 (save-some-buffers t))
795
796 (defun tpu-next-buffer nil
797 "Go to next buffer in ring."
798 (interactive)
799 (switch-to-buffer (car (reverse (buffer-list)))))
800
801 (defun tpu-next-file-buffer nil
802 "Go to next buffer in ring that is visiting a file."
803 (interactive)
804 (let ((starting-buffer (buffer-name)))
805 (switch-to-buffer (car (reverse (buffer-list))))
806 (while (and (not (equal (buffer-name) starting-buffer))
807 (not (buffer-file-name)))
808 (switch-to-buffer (car (reverse (buffer-list)))))
809 (if (equal (buffer-name) starting-buffer) (error "No other buffers."))))
810
811 (defun tpu-next-window nil
812 "Move to the next window."
813 (interactive)
814 (if (one-window-p) (message "There is only one window on screen.")
815 (other-window 1)))
816
817 (defun tpu-previous-window nil
818 "Move to the previous window."
819 (interactive)
820 (if (one-window-p) (message "There is only one window on screen.")
821 (select-window (previous-window))))
822
823
824 ;;;
825 ;;; Search
826 ;;;
827 (defun tpu-toggle-regexp nil
828 "Switches in and out of regular expression search and replace mode."
829 (interactive)
830 (setq tpu-regexp-p (not tpu-regexp-p))
831 (tpu-set-search)
832 (and (interactive-p)
833 (message "Regular expression search and substitute %sabled."
834 (if tpu-regexp-p "en" "dis"))))
835
836 (defun tpu-regexp-prompt (prompt)
837 "Read a string, adding 'RE' to the prompt if tpu-regexp-p is set."
838 (let ((re-prompt (concat (if tpu-regexp-p "RE ") prompt)))
839 (if tpu-emacs19-p
840 (read-from-minibuffer re-prompt nil nil nil 'tpu-regexp-prompt-hist)
841 (read-string re-prompt))))
842
843 (defun tpu-search nil
844 "Search for a string or regular expression.
845 The search is performed in the current direction."
846 (interactive)
847 (tpu-set-search)
848 (tpu-search-internal ""))
849
850 (defun tpu-search-forward nil
851 "Search for a string or regular expression.
852 The search is begins in the forward direction."
853 (interactive)
854 (setq tpu-searching-forward t)
855 (tpu-set-search t)
856 (tpu-search-internal ""))
857
858 (defun tpu-search-reverse nil
859 "Search for a string or regular expression.
860 The search is begins in the reverse direction."
861 (interactive)
862 (setq tpu-searching-forward nil)
863 (tpu-set-search t)
864 (tpu-search-internal ""))
865
866 (defun tpu-search-again nil
867 "Search for the same string or regular expression as last time.
868 The search is performed in the current direction."
869 (interactive)
870 (tpu-search-internal tpu-search-last-string))
871
872 ;; tpu-set-search defines the search functions used by the TPU-edt internal
873 ;; search function. It should be called whenever the direction changes, or
874 ;; the regular expression mode is turned on or off. It can also be called
875 ;; to ensure that the next search will be in the current direction. It is
876 ;; called from:
877
878 ;; tpu-advance tpu-backup
879 ;; tpu-toggle-regexp tpu-toggle-search-direction (t)
880 ;; tpu-search tpu-lm-replace
881 ;; tpu-search-forward (t) tpu-search-reverse (t)
882
883 (defun tpu-set-search (&optional arg)
884 "Set the search functions and set the search direction to the current
885 direction. If an argument is specified, don't set the search direction."
886 (if (not arg) (setq tpu-searching-forward (if tpu-advance t nil)))
887 (cond (tpu-searching-forward
888 (cond (tpu-regexp-p
889 (fset 'tpu-emacs-search 're-search-forward)
890 (fset 'tpu-emacs-rev-search 're-search-backward))
891 (t
892 (fset 'tpu-emacs-search 'search-forward)
893 (fset 'tpu-emacs-rev-search 'search-backward))))
894 (t
895 (cond (tpu-regexp-p
896 (fset 'tpu-emacs-search 're-search-backward)
897 (fset 'tpu-emacs-rev-search 're-search-forward))
898 (t
899 (fset 'tpu-emacs-search 'search-backward)
900 (fset 'tpu-emacs-rev-search 'search-forward))))))
901
902 (defun tpu-search-internal (pat &optional quiet)
903 "Search for a string or regular expression."
904 (setq tpu-search-last-string
905 (if (not (string= "" pat)) pat (tpu-regexp-prompt "Search: ")))
906
907 (tpu-unset-match)
908 (tpu-adjust-search)
909
910 (cond ((tpu-emacs-search tpu-search-last-string nil t)
911 (tpu-set-match) (goto-char (tpu-match-beginning)))
912
913 (t
914 (tpu-adjust-search t)
915 (let ((found nil) (pos nil))
916 (save-excursion
917 (let ((tpu-searching-forward (not tpu-searching-forward)))
918 (tpu-adjust-search)
919 (setq found (tpu-emacs-rev-search tpu-search-last-string nil t))
920 (setq pos (match-beginning 0))))
921
922 (cond (found
923 (cond ((tpu-y-or-n-p
924 (format "Found in %s direction. Go there? "
925 (if tpu-searching-forward "reverse" "forward")))
926 (goto-char pos) (tpu-set-match)
927 (tpu-toggle-search-direction))))
928
929 (t
930 (if (not quiet)
931 (message
932 "%sSearch failed: \"%s\""
933 (if tpu-regexp-p "RE " "") tpu-search-last-string))))))))
934
935 (fset 'tpu-search-internal-core (symbol-function 'tpu-search-internal))
936
937 (defun tpu-adjust-search (&optional arg)
938 "For forward searches, move forward a character before searching,
939 and backward a character after a failed search. Arg means end of search."
940 (if tpu-searching-forward
941 (cond (arg (if (not (bobp)) (forward-char -1)))
942 (t (if (not (eobp)) (forward-char 1))))))
943
944 (defun tpu-toggle-search-direction nil
945 "Toggle the TPU-edt search direction.
946 Used for reversing a search in progress."
947 (interactive)
948 (setq tpu-searching-forward (not tpu-searching-forward))
949 (tpu-set-search t)
950 (and (interactive-p)
951 (message "Searching %sward."
952 (if tpu-searching-forward "for" "back"))))
953
954
955 ;;;
956 ;;; Select / Unselect
957 ;;;
958 (defun tpu-select (&optional quiet)
959 "Sets the mark to define one end of a region."
960 (interactive "P")
961 (cond ((tpu-mark)
962 (tpu-unselect quiet))
963 (t
964 (tpu-set-mark (point))
965 (tpu-update-mode-line)
966 (if (not quiet) (message "Move the text cursor to select text.")))))
967
968 (defun tpu-unselect (&optional quiet)
969 "Removes the mark to unselect the current region."
970 (interactive "P")
971 (setq mark-ring nil)
972 (tpu-set-mark nil)
973 (tpu-update-mode-line)
974 (if (not quiet) (message "Selection canceled.")))
975
976
977 ;;;
978 ;;; Delete / Cut
979 ;;;
980 (defun tpu-toggle-rectangle nil
981 "Toggle rectangular mode for remove and insert."
982 (interactive)
983 (setq tpu-rectangular-p (not tpu-rectangular-p))
984 (setq tpu-rectangle-string (if tpu-rectangular-p " Rect" ""))
985 (tpu-update-mode-line)
986 (and (interactive-p)
987 (message "Rectangular cut and paste %sabled."
988 (if tpu-rectangular-p "en" "dis"))))
989
990 (defun tpu-arrange-rectangle nil
991 "Adjust point and mark to mark upper left and lower right
992 corners of a rectangle."
993 (let ((mc (current-column))
994 (pc (progn (exchange-point-and-mark) (current-column))))
995
996 (cond ((> (point) (tpu-mark)) ; point on lower line
997 (cond ((> pc mc) ; point @ lower-right
998 (exchange-point-and-mark)) ; point -> upper-left
999
1000 (t ; point @ lower-left
1001 (move-to-column-force mc) ; point -> lower-right
1002 (exchange-point-and-mark) ; point -> upper-right
1003 (move-to-column-force pc)))) ; point -> upper-left
1004
1005 (t ; point on upper line
1006 (cond ((> pc mc) ; point @ upper-right
1007 (move-to-column-force mc) ; point -> upper-left
1008 (exchange-point-and-mark) ; point -> lower-left
1009 (move-to-column-force pc) ; point -> lower-right
1010 (exchange-point-and-mark))))))) ; point -> upper-left
1011
1012 (defun tpu-cut-text nil
1013 "Delete the selected region.
1014 The text is saved for the tpu-paste command."
1015 (interactive)
1016 (cond ((tpu-mark)
1017 (cond (tpu-rectangular-p
1018 (tpu-arrange-rectangle)
1019 (picture-clear-rectangle (point) (tpu-mark) (not overwrite-mode))
1020 (tpu-unselect t))
1021 (t
1022 (setq tpu-last-deleted-region
1023 (buffer-substring (tpu-mark) (point)))
1024 (delete-region (tpu-mark) (point))
1025 (tpu-unselect t))))
1026 ((tpu-check-match)
1027 (let ((beg (tpu-match-beginning)) (end (tpu-match-end)))
1028 (setq tpu-last-deleted-region (buffer-substring beg end))
1029 (delete-region beg end)
1030 (tpu-unset-match)))
1031 (t
1032 (error "No selection active."))))
1033
1034 (defun tpu-store-text nil
1035 "Copy the selected region to the cut buffer without deleting it.
1036 The text is saved for the tpu-paste command."
1037 (interactive)
1038 (cond ((tpu-mark)
1039 (cond (tpu-rectangular-p
1040 (save-excursion
1041 (tpu-arrange-rectangle)
1042 (setq picture-killed-rectangle
1043 (extract-rectangle (point) (tpu-mark))))
1044 (tpu-unselect t))
1045 (t
1046 (setq tpu-last-deleted-region
1047 (buffer-substring (tpu-mark) (point)))
1048 (tpu-unselect t))))
1049 ((tpu-check-match)
1050 (setq tpu-last-deleted-region
1051 (buffer-substring (tpu-match-beginning) (tpu-match-end)))
1052 (tpu-unset-match))
1053 (t
1054 (error "No selection active."))))
1055
1056 (defun tpu-cut (arg)
1057 "Copy selected region to the cut buffer. In the absence of an
1058 argument, delete the selected region too."
1059 (interactive "P")
1060 (if arg (tpu-store-text) (tpu-cut-text)))
1061
1062 (defun tpu-append-region (arg)
1063 "Append selected region to the tpu-cut buffer. In the absence of an
1064 argument, delete the selected region too."
1065 (interactive "P")
1066 (cond ((tpu-mark)
1067 (let ((beg (region-beginning)) (end (region-end)))
1068 (setq tpu-last-deleted-region
1069 (concat tpu-last-deleted-region
1070 (buffer-substring beg end)))
1071 (if (not arg) (delete-region beg end))
1072 (tpu-unselect t)))
1073 ((tpu-check-match)
1074 (let ((beg (tpu-match-beginning)) (end (tpu-match-end)))
1075 (setq tpu-last-deleted-region
1076 (concat tpu-last-deleted-region
1077 (buffer-substring beg end)))
1078 (if (not arg) (delete-region beg end))
1079 (tpu-unset-match)))
1080 (t
1081 (error "No selection active."))))
1082
1083 (defun tpu-delete-current-line (num)
1084 "Delete one or specified number of lines after point.
1085 This includes the newline character at the end of each line.
1086 They are saved for the TPU-edt undelete-lines command."
1087 (interactive "p")
1088 (let ((beg (point)))
1089 (forward-line num)
1090 (if (not (eq (preceding-char) ?\n))
1091 (insert "\n"))
1092 (setq tpu-last-deleted-lines
1093 (buffer-substring beg (point)))
1094 (delete-region beg (point))))
1095
1096 (defun tpu-delete-to-eol (num)
1097 "Delete text up to end of line.
1098 With argument, delete up to to Nth line-end past point.
1099 They are saved for the TPU-edt undelete-lines command."
1100 (interactive "p")
1101 (let ((beg (point)))
1102 (forward-char 1)
1103 (end-of-line num)
1104 (setq tpu-last-deleted-lines
1105 (buffer-substring beg (point)))
1106 (delete-region beg (point))))
1107
1108 (defun tpu-delete-to-bol (num)
1109 "Delete text back to beginning of line.
1110 With argument, delete up to to Nth line-end past point.
1111 They are saved for the TPU-edt undelete-lines command."
1112 (interactive "p")
1113 (let ((beg (point)))
1114 (tpu-next-beginning-of-line num)
1115 (setq tpu-last-deleted-lines
1116 (buffer-substring (point) beg))
1117 (delete-region (point) beg)))
1118
1119 (defun tpu-delete-current-word (num)
1120 "Delete one or specified number of words after point.
1121 They are saved for the TPU-edt undelete-words command."
1122 (interactive "p")
1123 (let ((beg (point)))
1124 (tpu-forward-to-word num)
1125 (setq tpu-last-deleted-words
1126 (buffer-substring beg (point)))
1127 (delete-region beg (point))))
1128
1129 (defun tpu-delete-previous-word (num)
1130 "Delete one or specified number of words before point.
1131 They are saved for the TPU-edt undelete-words command."
1132 (interactive "p")
1133 (let ((beg (point)))
1134 (tpu-backward-to-word num)
1135 (setq tpu-last-deleted-words
1136 (buffer-substring (point) beg))
1137 (delete-region beg (point))))
1138
1139 (defun tpu-delete-current-char (num)
1140 "Delete one or specified number of characters after point. The last
1141 character deleted is saved for the TPU-edt undelete-char command."
1142 (interactive "p")
1143 (while (and (> num 0) (not (eobp)))
1144 (setq tpu-last-deleted-char (char-after (point)))
1145 (cond (overwrite-mode
1146 (picture-clear-column 1)
1147 (forward-char 1))
1148 (t
1149 (delete-char 1)))
1150 (setq num (1- num))))
1151
1152
1153 ;;;
1154 ;;; Undelete / Paste
1155 ;;;
1156 (defun tpu-paste (num)
1157 "Insert the last region or rectangle of killed text.
1158 With argument reinserts the text that many times."
1159 (interactive "p")
1160 (while (> num 0)
1161 (cond (tpu-rectangular-p
1162 (let ((beg (point)))
1163 (save-excursion
1164 (picture-yank-rectangle (not overwrite-mode))
1165 (message ""))
1166 (goto-char beg)))
1167 (t
1168 (insert tpu-last-deleted-region)))
1169 (setq num (1- num))))
1170
1171 (defun tpu-undelete-lines (num)
1172 "Insert lines deleted by last TPU-edt line-deletion command.
1173 With argument reinserts lines that many times."
1174 (interactive "p")
1175 (let ((beg (point)))
1176 (while (> num 0)
1177 (insert tpu-last-deleted-lines)
1178 (setq num (1- num)))
1179 (goto-char beg)))
1180
1181 (defun tpu-undelete-words (num)
1182 "Insert words deleted by last TPU-edt word-deletion command.
1183 With argument reinserts words that many times."
1184 (interactive "p")
1185 (let ((beg (point)))
1186 (while (> num 0)
1187 (insert tpu-last-deleted-words)
1188 (setq num (1- num)))
1189 (goto-char beg)))
1190
1191 (defun tpu-undelete-char (num)
1192 "Insert character deleted by last TPU-edt character-deletion command.
1193 With argument reinserts the character that many times."
1194 (interactive "p")
1195 (while (> num 0)
1196 (if overwrite-mode (prog1 (forward-char -1) (delete-char 1)))
1197 (insert tpu-last-deleted-char)
1198 (forward-char -1)
1199 (setq num (1- num))))
1200
1201
1202 ;;;
1203 ;;; Replace and Substitute
1204 ;;;
1205 (defun tpu-replace nil
1206 "Replace the selected region with the contents of the cut buffer."
1207 (interactive)
1208 (cond ((tpu-mark)
1209 (let ((beg (region-beginning)) (end (region-end)))
1210 (setq tpu-last-replaced-text (buffer-substring beg end))
1211 (delete-region beg end)
1212 (insert tpu-last-deleted-region)
1213 (tpu-unselect t)))
1214 ((tpu-check-match)
1215 (let ((beg (tpu-match-beginning)) (end (tpu-match-end)))
1216 (setq tpu-last-replaced-text (buffer-substring beg end))
1217 (replace-match tpu-last-deleted-region
1218 (not case-replace) (not tpu-regexp-p))
1219 (tpu-unset-match)))
1220 (t
1221 (error "No selection active."))))
1222
1223 (defun tpu-substitute (num)
1224 "Replace the selected region with the contents of the cut buffer, and
1225 repeat most recent search. A numeric argument serves as a repeat count.
1226 A negative argument means replace all occurrences of the search string."
1227 (interactive "p")
1228 (cond ((or (tpu-mark) (tpu-check-match))
1229 (while (and (not (= num 0)) (or (tpu-mark) (tpu-check-match)))
1230 (let ((beg (point)))
1231 (tpu-replace)
1232 (if tpu-searching-forward (forward-char -1) (goto-char beg))
1233 (if (= num 1) (tpu-search-internal tpu-search-last-string)
1234 (tpu-search-internal-core tpu-search-last-string)))
1235 (setq num (1- num))))
1236 (t
1237 (error "No selection active."))))
1238
1239 (defun tpu-lm-replace (from to)
1240 "Interactively search for OLD-string and substitute NEW-string."
1241 (interactive (list (tpu-regexp-prompt "Old String: ")
1242 (tpu-regexp-prompt "New String: ")))
1243
1244 (let ((doit t) (strings 0))
1245
1246 ;; Can't replace null strings
1247 (if (string= "" from) (error "No string to replace."))
1248
1249 ;; Find the first occurrence
1250 (tpu-set-search)
1251 (tpu-search-internal from t)
1252
1253 ;; Loop on replace question - yes, no, all, last, or quit.
1254 (while doit
1255 (if (not (tpu-check-match)) (setq doit nil)
1256 (progn (message "Replace? Type Yes, No, All, Last, or Quit: ")
1257 (let ((ans (read-char)))
1258
1259 (cond ((or (= ans ?y) (= ans ?Y) (= ans ?\r) (= ans ?\ ))
1260 (let ((beg (point)))
1261 (replace-match to (not case-replace) (not tpu-regexp-p))
1262 (setq strings (1+ strings))
1263 (if tpu-searching-forward (forward-char -1) (goto-char beg)))
1264 (tpu-search-internal from t))
1265
1266 ((or (= ans ?n) (= ans ?N) (= ans ?\C-?))
1267 (tpu-search-internal from t))
1268
1269 ((or (= ans ?a) (= ans ?A))
1270 (save-excursion
1271 (let ((beg (point)))
1272 (replace-match to (not case-replace) (not tpu-regexp-p))
1273 (setq strings (1+ strings))
1274 (if tpu-searching-forward (forward-char -1) (goto-char beg)))
1275 (tpu-search-internal-core from t)
1276 (while (tpu-check-match)
1277 (let ((beg (point)))
1278 (replace-match to (not case-replace) (not tpu-regexp-p))
1279 (setq strings (1+ strings))
1280 (if tpu-searching-forward (forward-char -1) (goto-char beg)))
1281 (tpu-search-internal-core from t)))
1282 (setq doit nil))
1283
1284 ((or (= ans ?l) (= ans ?L))
1285 (let ((beg (point)))
1286 (replace-match to (not case-replace) (not tpu-regexp-p))
1287 (setq strings (1+ strings))
1288 (if tpu-searching-forward (forward-char -1) (goto-char beg)))
1289 (setq doit nil))
1290
1291 ((or (= ans ?q) (= ans ?Q))
1292 (setq doit nil)))))))
1293
1294 (message "Replaced %s occurrence%s." strings
1295 (if (not (= 1 strings)) "s" ""))))
1296
1297 (defun tpu-emacs-replace (&optional dont-ask)
1298 "A TPU-edt interface to the emacs replace functions. If TPU-edt is
1299 currently in regular expression mode, the emacs regular expression
1300 replace functions are used. If an argument is supplied, replacements
1301 are performed without asking. Only works in forward direction."
1302 (interactive "P")
1303 (cond (dont-ask
1304 (setq current-prefix-arg nil)
1305 (call-interactively
1306 (if tpu-regexp-p 'replace-regexp 'replace-string)))
1307 (t
1308 (call-interactively
1309 (if tpu-regexp-p 'query-replace-regexp 'query-replace)))))
1310
1311 (defun tpu-add-at-bol (text)
1312 "Add text to the beginning of each line in a region,
1313 or each line in the entire buffer if no region is selected."
1314 (interactive
1315 (list (tpu-string-prompt "String to add: " 'tpu-add-at-bol-hist)))
1316 (if (string= "" text) (error "No string specified."))
1317 (cond ((tpu-mark)
1318 (save-excursion
1319 (if (> (point) (tpu-mark)) (exchange-point-and-mark))
1320 (while (and (< (point) (tpu-mark)) (re-search-forward "^" (tpu-mark) t))
1321 (if (< (point) (tpu-mark)) (replace-match text))))
1322 (tpu-unselect t))
1323 (t
1324 (save-excursion
1325 (goto-char (point-min))
1326 (while (and (re-search-forward "^" nil t) (not (eobp)))
1327 (replace-match text))))))
1328
1329 (defun tpu-add-at-eol (text)
1330 "Add text to the end of each line in a region,
1331 or each line of the entire buffer if no region is selected."
1332 (interactive
1333 (list (tpu-string-prompt "String to add: " 'tpu-add-at-eol-hist)))
1334 (if (string= "" text) (error "No string specified."))
1335 (cond ((tpu-mark)
1336 (save-excursion
1337 (if (> (point) (tpu-mark)) (exchange-point-and-mark))
1338 (while (< (point) (tpu-mark))
1339 (end-of-line)
1340 (if (<= (point) (tpu-mark)) (insert text))
1341 (forward-line)))
1342 (tpu-unselect t))
1343 (t
1344 (save-excursion
1345 (goto-char (point-min))
1346 (while (not (eobp))
1347 (end-of-line) (insert text) (forward-line))))))
1348
1349 (defun tpu-trim-line-ends nil
1350 "Removes trailing whitespace from every line in the buffer."
1351 (interactive)
1352 (picture-clean))
1353
1354
1355 ;;;
1356 ;;; Movement by character
1357 ;;;
1358 (defun tpu-char (num)
1359 "Move to the next character in the current direction.
1360 A repeat count means move that many characters."
1361 (interactive "p")
1362 (if tpu-advance (tpu-forward-char num) (tpu-backward-char num)))
1363
1364 (defun tpu-forward-char (num)
1365 "Move right ARG characters (left if ARG is negative)."
1366 (interactive "p")
1367 (forward-char num))
1368
1369 (defun tpu-backward-char (num)
1370 "Move left ARG characters (right if ARG is negative)."
1371 (interactive "p")
1372 (backward-char num))
1373
1374
1375 ;;;
1376 ;;; Movement by word
1377 ;;;
1378 (defconst tpu-word-separator-list '()
1379 "List of additional word separators.")
1380 (defconst tpu-skip-chars "^ \t"
1381 "Characters to skip when moving by word.
1382 Additional word separators are added to this string.")
1383
1384 (defun tpu-word (num)
1385 "Move to the beginning of the next word in the current direction.
1386 A repeat count means move that many words."
1387 (interactive "p")
1388 (if tpu-advance (tpu-forward-to-word num) (tpu-backward-to-word num)))
1389
1390 (defun tpu-forward-to-word (num)
1391 "Move forward until encountering the beginning of a word.
1392 With argument, do this that many times."
1393 (interactive "p")
1394 (while (and (> num 0) (not (eobp)))
1395 (let* ((beg (point))
1396 (end (prog2 (end-of-line) (point) (goto-char beg))))
1397 (cond ((eolp)
1398 (forward-char 1))
1399 ((memq (char-after (point)) tpu-word-separator-list)
1400 (forward-char 1)
1401 (skip-chars-forward " \t" end))
1402 (t
1403 (skip-chars-forward tpu-skip-chars end)
1404 (skip-chars-forward " \t" end))))
1405 (setq num (1- num))))
1406
1407 (defun tpu-backward-to-word (num)
1408 "Move backward until encountering the beginning of a word.
1409 With argument, do this that many times."
1410 (interactive "p")
1411 (while (and (> num 0) (not (bobp)))
1412 (let* ((beg (point))
1413 (end (prog2 (beginning-of-line) (point) (goto-char beg))))
1414 (cond ((bolp)
1415 ( forward-char -1))
1416 ((memq (char-after (1- (point))) tpu-word-separator-list)
1417 (forward-char -1))
1418 (t
1419 (skip-chars-backward " \t" end)
1420 (skip-chars-backward tpu-skip-chars end)
1421 (if (and (not (bolp)) (= ? (char-syntax (char-after (point)))))
1422 (forward-char -1)))))
1423 (setq num (1- num))))
1424
1425 (defun tpu-add-word-separators (separators)
1426 "Add new word separators for TPU-edt word commands."
1427 (interactive "sSeparators: ")
1428 (let* ((n 0) (length (length separators)))
1429 (while (< n length)
1430 (let ((char (aref separators n))
1431 (ss (substring separators n (1+ n))))
1432 (cond ((not (memq char tpu-word-separator-list))
1433 (setq tpu-word-separator-list
1434 (append ss tpu-word-separator-list))
1435 (cond ((= char ?-)
1436 (setq tpu-skip-chars (concat tpu-skip-chars "\\-")))
1437 ((= char ?\\)
1438 (setq tpu-skip-chars (concat tpu-skip-chars "\\\\")))
1439 ((= char ?^)
1440 (setq tpu-skip-chars (concat tpu-skip-chars "\\^")))
1441 (t
1442 (setq tpu-skip-chars (concat tpu-skip-chars ss))))))
1443 (setq n (1+ n))))))
1444
1445 (defun tpu-reset-word-separators nil
1446 "Reset word separators to default value."
1447 (interactive)
1448 (setq tpu-word-separator-list nil)
1449 (setq tpu-skip-chars "^ \t"))
1450
1451 (defun tpu-set-word-separators (separators)
1452 "Set new word separators for TPU-edt word commands."
1453 (interactive "sSeparators: ")
1454 (tpu-reset-word-separators)
1455 (tpu-add-word-separators separators))
1456
1457
1458 ;;;
1459 ;;; Movement by line
1460 ;;;
1461 (defun tpu-next-line (num)
1462 "Move to next line.
1463 Prefix argument serves as a repeat count."
1464 (interactive "p")
1465 (next-line-internal num)
1466 (setq this-command 'next-line))
1467
1468 (defun tpu-previous-line (num)
1469 "Move to previous line.
1470 Prefix argument serves as a repeat count."
1471 (interactive "p")
1472 (next-line-internal (- num))
1473 (setq this-command 'previous-line))
1474
1475 (defun tpu-next-beginning-of-line (num)
1476 "Move to beginning of line; if at beginning, move to beginning of next line.
1477 Accepts a prefix argument for the number of lines to move."
1478 (interactive "p")
1479 (backward-char 1)
1480 (forward-line (- 1 num)))
1481
1482 (defun tpu-end-of-line (num)
1483 "Move to the next end of line in the current direction.
1484 A repeat count means move that many lines."
1485 (interactive "p")
1486 (if tpu-advance (tpu-next-end-of-line num) (tpu-previous-end-of-line num)))
1487
1488 (defun tpu-next-end-of-line (num)
1489 "Move to end of line; if at end, move to end of next line.
1490 Accepts a prefix argument for the number of lines to move."
1491 (interactive "p")
1492 (forward-char 1)
1493 (end-of-line num))
1494
1495 (defun tpu-previous-end-of-line (num)
1496 "Move EOL upward.
1497 Accepts a prefix argument for the number of lines to move."
1498 (interactive "p")
1499 (end-of-line (- 1 num)))
1500
1501 (defun tpu-current-end-of-line nil
1502 "Move point to end of current line."
1503 (interactive)
1504 (let ((beg (point)))
1505 (end-of-line)
1506 (if (= beg (point)) (message "You are already at the end of a line."))))
1507
1508 (defun tpu-line (num)
1509 "Move to the beginning of the next line in the current direction.
1510 A repeat count means move that many lines."
1511 (interactive "p")
1512 (if tpu-advance (tpu-forward-line num) (tpu-backward-line num)))
1513
1514 (defun tpu-forward-line (num)
1515 "Move to beginning of next line.
1516 Prefix argument serves as a repeat count."
1517 (interactive "p")
1518 (forward-line num))
1519
1520 (defun tpu-backward-line (num)
1521 "Move to beginning of previous line.
1522 Prefix argument serves as repeat count."
1523 (interactive "p")
1524 (forward-line (- num)))
1525
1526
1527 ;;;
1528 ;;; Movement by paragraph
1529 ;;;
1530 (defun tpu-paragraph (num)
1531 "Move to the next paragraph in the current direction.
1532 A repeat count means move that many paragraphs."
1533 (interactive "p")
1534 (if tpu-advance
1535 (tpu-next-paragraph num) (tpu-previous-paragraph num)))
1536
1537 (defun tpu-next-paragraph (num)
1538 "Move to beginning of the next paragraph.
1539 Accepts a prefix argument for the number of paragraphs."
1540 (interactive "p")
1541 (beginning-of-line)
1542 (while (and (not (eobp)) (> num 0))
1543 (if (re-search-forward "^[ \t]*$" nil t)
1544 (if (re-search-forward "[^ \t\n]" nil t)
1545 (goto-char (match-beginning 0))
1546 (goto-char (point-max))))
1547 (setq num (1- num)))
1548 (beginning-of-line))
1549
1550
1551 (defun tpu-previous-paragraph (num)
1552 "Move to beginning of previous paragraph.
1553 Accepts a prefix argument for the number of paragraphs."
1554 (interactive "p")
1555 (end-of-line)
1556 (while (and (not (bobp)) (> num 0))
1557 (if (not (and (re-search-backward "^[ \t]*$" nil t)
1558 (re-search-backward "[^ \t\n]" nil t)
1559 (re-search-backward "^[ \t]*$" nil t)
1560 (progn (re-search-forward "[^ \t\n]" nil t)
1561 (goto-char (match-beginning 0)))))
1562 (goto-char (point-min)))
1563 (setq num (1- num)))
1564 (beginning-of-line))
1565
1566
1567 ;;;
1568 ;;; Movement by page
1569 ;;;
1570 (defun tpu-page (num)
1571 "Move to the next page in the current direction.
1572 A repeat count means move that many pages."
1573 (interactive "p")
1574 (if tpu-advance (forward-page num) (backward-page num))
1575 (if (eobp) (recenter -1)))
1576
1577
1578 ;;;
1579 ;;; Scrolling and movement within the buffer
1580 ;;;
1581 (defun tpu-scroll-window (num)
1582 "Scroll the display to the next section in the current direction.
1583 A repeat count means scroll that many sections."
1584 (interactive "p")
1585 (if tpu-advance (tpu-scroll-window-up num) (tpu-scroll-window-down num)))
1586
1587 (defun tpu-scroll-window-down (num)
1588 "Scroll the display down to the next section.
1589 A repeat count means scroll that many sections."
1590 (interactive "p")
1591 (let* ((beg (tpu-current-line))
1592 (height (1- (window-height)))
1593 (lines (* num (/ (* height tpu-percent-scroll) 100))))
1594 (next-line-internal (- lines))
1595 (if (> lines beg) (recenter 0))))
1596
1597 (defun tpu-scroll-window-up (num)
1598 "Scroll the display up to the next section.
1599 A repeat count means scroll that many sections."
1600 (interactive "p")
1601 (let* ((beg (tpu-current-line))
1602 (height (1- (window-height)))
1603 (lines (* num (/ (* height tpu-percent-scroll) 100))))
1604 (next-line-internal lines)
1605 (if (>= (+ lines beg) height) (recenter -1))))
1606
1607 (defun tpu-pan-right (num)
1608 "Pan right tpu-pan-columns (16 by default).
1609 Accepts a prefix argument for the number of tpu-pan-columns to scroll."
1610 (interactive "p")
1611 (scroll-left (* tpu-pan-columns num)))
1612
1613 (defun tpu-pan-left (num)
1614 "Pan left tpu-pan-columns (16 by default).
1615 Accepts a prefix argument for the number of tpu-pan-columns to scroll."
1616 (interactive "p")
1617 (scroll-right (* tpu-pan-columns num)))
1618
1619 (defun tpu-move-to-beginning nil
1620 "Move cursor to the beginning of buffer, but don't set the mark."
1621 (interactive)
1622 (goto-char (point-min)))
1623
1624 (defun tpu-move-to-end nil
1625 "Move cursor to the end of buffer, but don't set the mark."
1626 (interactive)
1627 (goto-char (point-max))
1628 (recenter -1))
1629
1630 (defun tpu-goto-percent (perc)
1631 "Move point to ARG percentage of the buffer."
1632 (interactive "NGoto-percentage: ")
1633 (if (or (> perc 100) (< perc 0))
1634 (error "Percentage %d out of range 0 < percent < 100" perc)
1635 (goto-char (/ (* (point-max) perc) 100))))
1636
1637 (defun tpu-beginning-of-window nil
1638 "Move cursor to top of window."
1639 (interactive)
1640 (move-to-window-line 0))
1641
1642 (defun tpu-end-of-window nil
1643 "Move cursor to bottom of window."
1644 (interactive)
1645 (move-to-window-line -1))
1646
1647 (defun tpu-line-to-bottom-of-window nil
1648 "Move the current line to the bottom of the window."
1649 (interactive)
1650 (recenter -1))
1651
1652 (defun tpu-line-to-top-of-window nil
1653 "Move the current line to the top of the window."
1654 (interactive)
1655 (recenter 0))
1656
1657
1658 ;;;
1659 ;;; Direction
1660 ;;;
1661 (defun tpu-advance-direction nil
1662 "Set TPU Advance mode so keypad commands move forward."
1663 (interactive)
1664 (setq tpu-direction-string " Advance")
1665 (setq tpu-advance t)
1666 (setq tpu-reverse nil)
1667 (tpu-set-search)
1668 (tpu-update-mode-line))
1669
1670 (defun tpu-backup-direction nil
1671 "Set TPU Backup mode so keypad commands move backward."
1672 (interactive)
1673 (setq tpu-direction-string " Reverse")
1674 (setq tpu-advance nil)
1675 (setq tpu-reverse t)
1676 (tpu-set-search)
1677 (tpu-update-mode-line))
1678
1679
1680 ;;;
1681 ;;; Define keymaps
1682 ;;;
1683 (define-key global-map "\e[" CSI-map) ; CSI map
1684 (define-key global-map "\eO" SS3-map) ; SS3 map
1685 (define-key SS3-map "P" GOLD-map) ; GOLD map
1686 (define-key GOLD-map "\e[" GOLD-CSI-map) ; GOLD-CSI map
1687 (define-key GOLD-map "\eO" GOLD-SS3-map) ; GOLD-SS3 map
1688
1689
1690 ;;;
1691 ;;; CSI-map key definitions
1692 ;;;
1693 (define-key CSI-map "A" 'tpu-previous-line) ; up
1694 (define-key CSI-map "B" 'tpu-next-line) ; down
1695 (define-key CSI-map "D" 'tpu-backward-char) ; left
1696 (define-key CSI-map "C" 'tpu-forward-char) ; right
1697
1698 (define-key CSI-map "1~" 'tpu-search) ; Find
1699 (define-key CSI-map "2~" 'tpu-paste) ; Insert Here
1700 (define-key CSI-map "3~" 'tpu-cut) ; Remove
1701 (define-key CSI-map "4~" 'tpu-select) ; Select
1702 (define-key CSI-map "5~" 'tpu-scroll-window-down) ; Prev Screen
1703 (define-key CSI-map "6~" 'tpu-scroll-window-up) ; Next Screen
1704
1705 (define-key CSI-map "11~" 'nil) ; F1
1706 (define-key CSI-map "12~" 'nil) ; F2
1707 (define-key CSI-map "13~" 'nil) ; F3
1708 (define-key CSI-map "14~" 'nil) ; F4
1709 (define-key CSI-map "15~" 'nil) ; F5
1710 (define-key CSI-map "17~" 'nil) ; F6
1711 (define-key CSI-map "18~" 'nil) ; F7
1712 (define-key CSI-map "19~" 'nil) ; F8
1713 (define-key CSI-map "20~" 'nil) ; F9
1714 (define-key CSI-map "21~" 'tpu-exit) ; F10
1715 (define-key CSI-map "23~" 'tpu-insert-escape) ; F11 (ESC)
1716 (define-key CSI-map "24~" 'tpu-next-beginning-of-line) ; F12 (BS)
1717 (define-key CSI-map "25~" 'tpu-delete-previous-word) ; F13 (LF)
1718 (define-key CSI-map "26~" 'tpu-toggle-overwrite-mode) ; F14
1719 (define-key CSI-map "28~" 'tpu-help) ; HELP
1720 (define-key CSI-map "29~" 'execute-extended-command) ; DO
1721 (define-key CSI-map "31~" 'tpu-goto-breadcrumb) ; F17
1722 (define-key CSI-map "32~" 'nil) ; F18
1723 (define-key CSI-map "33~" 'nil) ; F19
1724 (define-key CSI-map "34~" 'nil) ; F20
1725
1726
1727 ;;;
1728 ;;; SS3-map key definitions
1729 ;;;
1730 (define-key SS3-map "A" 'tpu-previous-line) ; up
1731 (define-key SS3-map "B" 'tpu-next-line) ; down
1732 (define-key SS3-map "C" 'tpu-forward-char) ; right
1733 (define-key SS3-map "D" 'tpu-backward-char) ; left
1734
1735 (define-key SS3-map "Q" 'tpu-help) ; PF2
1736 (define-key SS3-map "R" 'tpu-search-again) ; PF3
1737 (define-key SS3-map "S" 'tpu-delete-current-line) ; PF4
1738 (define-key SS3-map "p" 'tpu-line) ; KP0
1739 (define-key SS3-map "q" 'tpu-word) ; KP1
1740 (define-key SS3-map "r" 'tpu-end-of-line) ; KP2
1741 (define-key SS3-map "s" 'tpu-char) ; KP3
1742 (define-key SS3-map "t" 'tpu-advance-direction) ; KP4
1743 (define-key SS3-map "u" 'tpu-backup-direction) ; KP5
1744 (define-key SS3-map "v" 'tpu-cut) ; KP6
1745 (define-key SS3-map "w" 'tpu-page) ; KP7
1746 (define-key SS3-map "x" 'tpu-scroll-window) ; KP8
1747 (define-key SS3-map "y" 'tpu-append-region) ; KP9
1748 (define-key SS3-map "m" 'tpu-delete-current-word) ; KP-
1749 (define-key SS3-map "l" 'tpu-delete-current-char) ; KP,
1750 (define-key SS3-map "n" 'tpu-select) ; KP.
1751 (define-key SS3-map "M" 'newline) ; KPenter
1752
1753
1754 ;;;
1755 ;;; GOLD-map key definitions
1756 ;;;
1757 (define-key GOLD-map "\C-A" 'tpu-toggle-overwrite-mode) ; ^A
1758 (define-key GOLD-map "\C-B" 'nil) ; ^B
1759 (define-key GOLD-map "\C-C" 'nil) ; ^C
1760 (define-key GOLD-map "\C-D" 'nil) ; ^D
1761 (define-key GOLD-map "\C-E" 'nil) ; ^E
1762 (define-key GOLD-map "\C-F" 'set-visited-file-name) ; ^F
1763 (define-key GOLD-map "\C-g" 'keyboard-quit) ; safety first
1764 (define-key GOLD-map "\C-h" 'delete-other-windows) ; BS
1765 (define-key GOLD-map "\C-i" 'other-window) ; TAB
1766 (define-key GOLD-map "\C-J" 'nil) ; ^J
1767 (define-key GOLD-map "\C-K" 'tpu-define-macro-key) ; ^K
1768 (define-key GOLD-map "\C-l" 'downcase-region) ; ^L
1769 (define-key GOLD-map "\C-M" 'nil) ; ^M
1770 (define-key GOLD-map "\C-N" 'nil) ; ^N
1771 (define-key GOLD-map "\C-O" 'nil) ; ^O
1772 (define-key GOLD-map "\C-P" 'nil) ; ^P
1773 (define-key GOLD-map "\C-Q" 'nil) ; ^Q
1774 (define-key GOLD-map "\C-R" 'nil) ; ^R
1775 (define-key GOLD-map "\C-S" 'nil) ; ^S
1776 (define-key GOLD-map "\C-T" 'tpu-toggle-control-keys) ; ^T
1777 (define-key GOLD-map "\C-u" 'upcase-region) ; ^U
1778 (define-key GOLD-map "\C-V" 'nil) ; ^V
1779 (define-key GOLD-map "\C-w" 'tpu-write-current-buffers) ; ^W
1780 (define-key GOLD-map "\C-X" 'nil) ; ^X
1781 (define-key GOLD-map "\C-Y" 'nil) ; ^Y
1782 (define-key GOLD-map "\C-Z" 'nil) ; ^Z
1783 (define-key GOLD-map " " 'undo) ; SPC
1784 (define-key GOLD-map "!" 'nil) ; !
1785 (define-key GOLD-map "#" 'nil) ; #
1786 (define-key GOLD-map "$" 'tpu-add-at-eol) ; $
1787 (define-key GOLD-map "%" 'tpu-goto-percent) ; %
1788 (define-key GOLD-map "&" 'nil) ; &
1789 (define-key GOLD-map "(" 'nil) ; (
1790 (define-key GOLD-map ")" 'nil) ; )
1791 (define-key GOLD-map "*" 'tpu-toggle-regexp) ; *
1792 (define-key GOLD-map "+" 'nil) ; +
1793 (define-key GOLD-map "," 'tpu-goto-breadcrumb) ; ,
1794 (define-key GOLD-map "-" 'negative-argument) ; -
1795 (define-key GOLD-map "." 'tpu-drop-breadcrumb) ; .
1796 (define-key GOLD-map "/" 'tpu-emacs-replace) ; /
1797 (define-key GOLD-map "0" 'digit-argument) ; 0
1798 (define-key GOLD-map "1" 'digit-argument) ; 1
1799 (define-key GOLD-map "2" 'digit-argument) ; 2
1800 (define-key GOLD-map "3" 'digit-argument) ; 3
1801 (define-key GOLD-map "4" 'digit-argument) ; 4
1802 (define-key GOLD-map "5" 'digit-argument) ; 5
1803 (define-key GOLD-map "6" 'digit-argument) ; 6
1804 (define-key GOLD-map "7" 'digit-argument) ; 7
1805 (define-key GOLD-map "8" 'digit-argument) ; 8
1806 (define-key GOLD-map "9" 'digit-argument) ; 9
1807 (define-key GOLD-map ":" 'nil) ; :
1808 (define-key GOLD-map ";" 'tpu-trim-line-ends) ; ;
1809 (define-key GOLD-map "<" 'nil) ; <
1810 (define-key GOLD-map "=" 'nil) ; =
1811 (define-key GOLD-map ">" 'nil) ; >
1812 (define-key GOLD-map "?" 'tpu-spell-check) ; ?
1813 (define-key GOLD-map "A" 'tpu-toggle-newline-and-indent) ; A
1814 (define-key GOLD-map "B" 'tpu-next-buffer) ; B
1815 (define-key GOLD-map "C" 'repeat-complex-command) ; C
1816 (define-key GOLD-map "D" 'shell-command) ; D
1817 (define-key GOLD-map "E" 'tpu-exit) ; E
1818 (define-key GOLD-map "F" 'tpu-set-cursor-free) ; F
1819 (define-key GOLD-map "G" 'tpu-get) ; G
1820 (define-key GOLD-map "H" 'nil) ; H
1821 (define-key GOLD-map "I" 'tpu-include) ; I
1822 (define-key GOLD-map "K" 'tpu-kill-buffer) ; K
1823 (define-key GOLD-map "L" 'tpu-what-line) ; L
1824 (define-key GOLD-map "M" 'buffer-menu) ; M
1825 (define-key GOLD-map "N" 'tpu-next-file-buffer) ; N
1826 (define-key GOLD-map "O" 'occur) ; O
1827 (define-key GOLD-map "P" 'lpr-buffer) ; P
1828 (define-key GOLD-map "Q" 'tpu-quit) ; Q
1829 (define-key GOLD-map "R" 'tpu-toggle-rectangle) ; R
1830 (define-key GOLD-map "S" 'replace) ; S
1831 (define-key GOLD-map "T" 'tpu-line-to-top-of-window) ; T
1832 (define-key GOLD-map "U" 'undo) ; U
1833 (define-key GOLD-map "V" 'tpu-version) ; V
1834 (define-key GOLD-map "W" 'save-buffer) ; W
1835 (define-key GOLD-map "X" 'tpu-save-all-buffers-kill-emacs) ; X
1836 (define-key GOLD-map "Y" 'copy-region-as-kill) ; Y
1837 (define-key GOLD-map "Z" 'suspend-emacs) ; Z
1838 (define-key GOLD-map "[" 'blink-matching-open) ; [
1839 (define-key GOLD-map "\\" 'nil) ; \
1840 (define-key GOLD-map "]" 'blink-matching-open) ; ]
1841 (define-key GOLD-map "^" 'tpu-add-at-bol) ; ^
1842 (define-key GOLD-map "_" 'split-window-vertically) ; -
1843 (define-key GOLD-map "`" 'what-line) ; `
1844 (define-key GOLD-map "a" 'tpu-toggle-newline-and-indent) ; a
1845 (define-key GOLD-map "b" 'tpu-next-buffer) ; b
1846 (define-key GOLD-map "c" 'repeat-complex-command) ; c
1847 (define-key GOLD-map "d" 'shell-command) ; d
1848 (define-key GOLD-map "e" 'tpu-exit) ; e
1849 (define-key GOLD-map "f" 'tpu-set-cursor-free) ; f
1850 (define-key GOLD-map "g" 'tpu-get) ; g
1851 (define-key GOLD-map "h" 'nil) ; h
1852 (define-key GOLD-map "i" 'tpu-include) ; i
1853 (define-key GOLD-map "k" 'tpu-kill-buffer) ; k
1854 (define-key GOLD-map "l" 'goto-line) ; l
1855 (define-key GOLD-map "m" 'buffer-menu) ; m
1856 (define-key GOLD-map "n" 'tpu-next-file-buffer) ; n
1857 (define-key GOLD-map "o" 'occur) ; o
1858 (define-key GOLD-map "p" 'lpr-region) ; p
1859 (define-key GOLD-map "q" 'tpu-quit) ; q
1860 (define-key GOLD-map "r" 'tpu-toggle-rectangle) ; r
1861 (define-key GOLD-map "s" 'replace) ; s
1862 (define-key GOLD-map "t" 'tpu-line-to-top-of-window) ; t
1863 (define-key GOLD-map "u" 'undo) ; u
1864 (define-key GOLD-map "v" 'tpu-version) ; v
1865 (define-key GOLD-map "w" 'save-buffer) ; w
1866 (define-key GOLD-map "x" 'tpu-save-all-buffers-kill-emacs) ; x
1867 (define-key GOLD-map "y" 'copy-region-as-kill) ; y
1868 (define-key GOLD-map "z" 'suspend-emacs) ; z
1869 (define-key GOLD-map "{" 'nil) ; {
1870 (define-key GOLD-map "|" 'split-window-horizontally) ; |
1871 (define-key GOLD-map "}" 'nil) ; }
1872 (define-key GOLD-map "~" 'exchange-point-and-mark) ; ~
1873 (define-key GOLD-map "\177" 'delete-window) ; <X]
1874
1875
1876 ;;;
1877 ;;; GOLD-CSI-map key definitions
1878 ;;;
1879 (define-key GOLD-CSI-map "A" 'tpu-move-to-beginning) ; up-arrow
1880 (define-key GOLD-CSI-map "B" 'tpu-move-to-end) ; down-arrow
1881 (define-key GOLD-CSI-map "C" 'end-of-line) ; right-arrow
1882 (define-key GOLD-CSI-map "D" 'beginning-of-line) ; left-arrow
1883
1884 (define-key GOLD-CSI-map "1~" 'nil) ; Find
1885 (define-key GOLD-CSI-map "2~" 'nil) ; Insert Here
1886 (define-key GOLD-CSI-map "3~" 'tpu-store-text) ; Remove
1887 (define-key GOLD-CSI-map "4~" 'tpu-unselect) ; Select
1888 (define-key GOLD-CSI-map "5~" 'tpu-previous-window) ; Prev Screen
1889 (define-key GOLD-CSI-map "6~" 'tpu-next-window) ; Next Screen
1890
1891 (define-key GOLD-CSI-map "11~" 'nil) ; F1
1892 (define-key GOLD-CSI-map "12~" 'nil) ; F2
1893 (define-key GOLD-CSI-map "13~" 'nil) ; F3
1894 (define-key GOLD-CSI-map "14~" 'nil) ; F4
1895 (define-key GOLD-CSI-map "16~" 'nil) ; F5
1896 (define-key GOLD-CSI-map "17~" 'nil) ; F6
1897 (define-key GOLD-CSI-map "18~" 'nil) ; F7
1898 (define-key GOLD-CSI-map "19~" 'nil) ; F8
1899 (define-key GOLD-CSI-map "20~" 'nil) ; F9
1900 (define-key GOLD-CSI-map "21~" 'nil) ; F10
1901 (define-key GOLD-CSI-map "23~" 'nil) ; F11
1902 (define-key GOLD-CSI-map "24~" 'nil) ; F12
1903 (define-key GOLD-CSI-map "25~" 'nil) ; F13
1904 (define-key GOLD-CSI-map "26~" 'nil) ; F14
1905 (define-key GOLD-CSI-map "28~" 'describe-bindings) ; HELP
1906 (define-key GOLD-CSI-map "29~" 'nil) ; DO
1907 (define-key GOLD-CSI-map "31~" 'tpu-drop-breadcrumb) ; F17
1908 (define-key GOLD-CSI-map "32~" 'nil) ; F18
1909 (define-key GOLD-CSI-map "33~" 'nil) ; F19
1910 (define-key GOLD-CSI-map "34~" 'nil) ; F20
1911
1912
1913 ;;;
1914 ;;; GOLD-SS3-map key definitions
1915 ;;;
1916 (define-key GOLD-SS3-map "A" 'tpu-move-to-beginning) ; up-arrow
1917 (define-key GOLD-SS3-map "B" 'tpu-move-to-end) ; down-arrow
1918 (define-key GOLD-SS3-map "C" 'end-of-line) ; right-arrow
1919 (define-key GOLD-SS3-map "D" 'beginning-of-line) ; left-arrow
1920
1921 (define-key GOLD-SS3-map "P" 'keyboard-quit) ; PF1
1922 (define-key GOLD-SS3-map "Q" 'help-for-help) ; PF2
1923 (define-key GOLD-SS3-map "R" 'tpu-search) ; PF3
1924 (define-key GOLD-SS3-map "S" 'tpu-undelete-lines) ; PF4
1925 (define-key GOLD-SS3-map "p" 'open-line) ; KP0
1926 (define-key GOLD-SS3-map "q" 'tpu-change-case) ; KP1
1927 (define-key GOLD-SS3-map "r" 'tpu-delete-to-eol) ; KP2
1928 (define-key GOLD-SS3-map "s" 'tpu-special-insert) ; KP3
1929 (define-key GOLD-SS3-map "t" 'tpu-move-to-end) ; KP4
1930 (define-key GOLD-SS3-map "u" 'tpu-move-to-beginning) ; KP5
1931 (define-key GOLD-SS3-map "v" 'tpu-paste) ; KP6
1932 (define-key GOLD-SS3-map "w" 'execute-extended-command) ; KP7
1933 (define-key GOLD-SS3-map "x" 'tpu-fill) ; KP8
1934 (define-key GOLD-SS3-map "y" 'tpu-replace) ; KP9
1935 (define-key GOLD-SS3-map "m" 'tpu-undelete-words) ; KP-
1936 (define-key GOLD-SS3-map "l" 'tpu-undelete-char) ; KP,
1937 (define-key GOLD-SS3-map "n" 'tpu-unselect) ; KP.
1938 (define-key GOLD-SS3-map "M" 'tpu-substitute) ; KPenter
1939
1940
1941 ;;;
1942 ;;; Repeat complex command map additions to make arrows work
1943 ;;;
1944 (cond ((boundp 'repeat-complex-command-map)
1945 (define-key repeat-complex-command-map "\e[A" 'previous-complex-command)
1946 (define-key repeat-complex-command-map "\e[B" 'next-complex-command)
1947 (define-key repeat-complex-command-map "\eOA" 'previous-complex-command)
1948 (define-key repeat-complex-command-map "\eOB" 'next-complex-command)))
1949
1950
1951 ;;;
1952 ;;; Minibuffer map additions to make KP_enter = RET
1953 ;;;
1954 (define-key minibuffer-local-map "\eOM" 'exit-minibuffer)
1955 (define-key minibuffer-local-ns-map "\eOM" 'exit-minibuffer)
1956 (define-key minibuffer-local-completion-map "\eOM" 'exit-minibuffer)
1957 (define-key minibuffer-local-must-match-map "\eOM" 'minibuffer-complete-and-exit)
1958 (and (boundp 'repeat-complex-command-map)
1959 (define-key repeat-complex-command-map "\eOM" 'exit-minibuffer))
1960
1961
1962 ;;;
1963 ;;; Map control keys
1964 ;;;
1965 (define-key global-map "\C-\\" 'quoted-insert) ; ^\
1966 (define-key global-map "\C-a" 'tpu-toggle-overwrite-mode) ; ^A
1967 (define-key global-map "\C-b" 'repeat-complex-command) ; ^B
1968 (define-key global-map "\C-e" 'tpu-current-end-of-line) ; ^E
1969 (define-key global-map "\C-h" 'tpu-next-beginning-of-line) ; ^H (BS)
1970 (define-key global-map "\C-j" 'tpu-delete-previous-word) ; ^J (LF)
1971 (define-key global-map "\C-k" 'tpu-define-macro-key) ; ^K
1972 (define-key global-map "\C-l" 'tpu-insert-formfeed) ; ^L (FF)
1973 (define-key global-map "\C-r" 'recenter) ; ^R
1974 (define-key global-map "\C-u" 'tpu-delete-to-bol) ; ^U
1975 (define-key global-map "\C-v" 'tpu-quoted-insert) ; ^V
1976 (define-key global-map "\C-w" 'redraw-display) ; ^W
1977 (define-key global-map "\C-z" 'tpu-exit) ; ^Z
1978
1979
1980 ;;;
1981 ;;; Functions to reset and toggle the control key bindings
1982 ;;;
1983 (defun tpu-reset-control-keys (tpu-style)
1984 "Set control keys to TPU or emacs style functions."
1985 (let* ((tpu (and tpu-style (not tpu-control-keys)))
1986 (emacs (and (not tpu-style) tpu-control-keys))
1987 (doit (or tpu emacs)))
1988 (cond (doit
1989 (if emacs (setq tpu-global-map (copy-keymap global-map)))
1990 (let ((map (if tpu
1991 (copy-keymap tpu-global-map)
1992 (copy-keymap tpu-original-global-map))))
1993
1994 (define-key global-map "\C-\\" (lookup-key map "\C-\\")) ; ^\
1995 (define-key global-map "\C-a" (lookup-key map "\C-a")) ; ^A
1996 (define-key global-map "\C-b" (lookup-key map "\C-b")) ; ^B
1997 (define-key global-map "\C-e" (lookup-key map "\C-e")) ; ^E
1998 (define-key global-map "\C-h" (lookup-key map "\C-h")) ; ^H (BS)
1999 (define-key global-map "\C-j" (lookup-key map "\C-j")) ; ^J (LF)
2000 (define-key global-map "\C-k" (lookup-key map "\C-k")) ; ^K
2001 (define-key global-map "\C-l" (lookup-key map "\C-l")) ; ^L (FF)
2002 (define-key global-map "\C-r" (lookup-key map "\C-r")) ; ^R
2003 (define-key global-map "\C-u" (lookup-key map "\C-u")) ; ^U
2004 (define-key global-map "\C-v" (lookup-key map "\C-v")) ; ^V
2005 (define-key global-map "\C-w" (lookup-key map "\C-w")) ; ^W
2006 (define-key global-map "\C-z" (lookup-key map "\C-z")) ; ^Z
2007 (setq tpu-control-keys tpu-style))))))
2008
2009 (defun tpu-toggle-control-keys nil
2010 "Toggles control key bindings between TPU-edt and Emacs."
2011 (interactive)
2012 (tpu-reset-control-keys (not tpu-control-keys))
2013 (and (interactive-p)
2014 (message "Control keys function with %s bindings."
2015 (if tpu-control-keys "TPU-edt" "Emacs"))))
2016
2017
2018 ;;;
2019 ;;; Emacs version 19 minibuffer history support
2020 ;;;
2021 (defun tpu-next-history-element (n)
2022 "Insert the next element of the minibuffer history into the minibuffer."
2023 (interactive "p")
2024 (next-history-element n)
2025 (goto-char (point-max)))
2026
2027 (defun tpu-previous-history-element (n)
2028 "Insert the previous element of the minibuffer history into the minibuffer."
2029 (interactive "p")
2030 (previous-history-element n)
2031 (goto-char (point-max)))
2032
2033 (defun tpu-arrow-history nil
2034 "Modify minibuffer maps to use arrows for history recall."
2035 (interactive)
2036 (let ((loc (where-is-internal 'tpu-previous-line)) (cur nil))
2037 (while (setq cur (car loc))
2038 (define-key read-expression-map cur 'tpu-previous-history-element)
2039 (define-key minibuffer-local-map cur 'tpu-previous-history-element)
2040 (define-key minibuffer-local-ns-map cur 'tpu-previous-history-element)
2041 (define-key minibuffer-local-completion-map cur 'tpu-previous-history-element)
2042 (define-key minibuffer-local-must-match-map cur 'tpu-previous-history-element)
2043 (setq loc (cdr loc)))
2044
2045 (setq loc (where-is-internal 'tpu-next-line))
2046 (while (setq cur (car loc))
2047 (define-key read-expression-map cur 'tpu-next-history-element)
2048 (define-key minibuffer-local-map cur 'tpu-next-history-element)
2049 (define-key minibuffer-local-ns-map cur 'tpu-next-history-element)
2050 (define-key minibuffer-local-completion-map cur 'tpu-next-history-element)
2051 (define-key minibuffer-local-must-match-map cur 'tpu-next-history-element)
2052 (setq loc (cdr loc)))))
2053
2054
2055 ;;;
2056 ;;; Emacs version 19 X-windows key definition support
2057 ;;;
2058 (defun tpu-load-xkeys (file)
2059 "Load the TPU-edt X-windows key definitions FILE.
2060 If FILE is nil, try to load a default file. The default file names are
2061 ~/.tpu-lucid-keys for Lucid emacs, and ~/.tpu-gnu-keys for GNU emacs."
2062 (interactive "fX key definition file: ")
2063 (cond (file
2064 (setq file (expand-file-name file)))
2065 (tpu-xkeys-file
2066 (setq file (expand-file-name tpu-xkeys-file)))
2067 (tpu-gnu-emacs19-p
2068 (setq file (expand-file-name "~/.tpu-gnu-keys")))
2069 (tpu-lucid-emacs19-p
2070 (setq file (expand-file-name "~/.tpu-lucid-keys"))))
2071 (cond ((file-readable-p file)
2072 (load-file file))
2073 (t
2074 (switch-to-buffer "*scratch*")
2075 (erase-buffer)
2076 (insert "
2077
2078 Ack!! You're running TPU-edt under X-windows without loading an
2079 X key definition file. To create a TPU-edt X key definition
2080 file, run the tpu-mapper.el program. It came with TPU-edt. It
2081 even includes directions on how to use it! Perhaps it's laying
2082 around here someplace. ")
2083 (let ((file "tpu-mapper.el")
2084 (found nil)
2085 (path nil)
2086 (search-list (append (list (expand-file-name ".")) load-path)))
2087 (while (and (not found) search-list)
2088 (setq path (concat (car search-list)
2089 (if (string-match "/$" (car search-list)) "" "/")
2090 file))
2091 (if (and (file-exists-p path) (not (file-directory-p path)))
2092 (setq found t))
2093 (setq search-list (cdr search-list)))
2094 (cond (found
2095 (insert (format
2096 "Ah yes, there it is, in \n\n %s \n\n" path))
2097 (if (tpu-y-or-n-p "Do you want to run it now? ")
2098 (load-file path)))
2099 (t
2100 (insert "Nope, I can't seem to find it. :-(\n\n")
2101 (sit-for 120)))))))
2102
2103
2104 ;;;
2105 ;;; Start and Stop TPU-edt
2106 ;;;
2107 ;;;###autoload
2108 (defun tpu-edt-on nil
2109 "Turn on TPU/edt emulation."
2110 (interactive)
2111 (cond
2112 ((not tpu-edt-mode)
2113 ;; we use picture-mode functions
2114 (require 'picture)
2115 (tpu-reset-control-keys t)
2116 (cond (tpu-emacs19-p
2117 (and window-system (tpu-load-xkeys nil))
2118 (tpu-arrow-history))
2119 (t
2120 ;; define ispell functions
2121 (autoload 'ispell-word "ispell" "Check spelling of word at or before point" t)
2122 (autoload 'ispell-complete-word "ispell" "Complete word at or before point" t)
2123 (autoload 'ispell-buffer "ispell" "Check spelling of entire buffer" t)
2124 (autoload 'ispell-region "ispell" "Check spelling of region" t)))
2125 (tpu-set-mode-line t)
2126 (tpu-advance-direction)
2127 ;; set page delimiter, display line truncation, and scrolling like TPU
2128 (setq-default page-delimiter "\f")
2129 (setq-default truncate-lines t)
2130 (setq scroll-step 1)
2131 (setq tpu-edt-mode t))))
2132
2133 (defun tpu-edt-off nil
2134 "Turn off TPU/edt emulation. Note that the keypad is left on."
2135 (interactive)
2136 (cond
2137 (tpu-edt-mode
2138 (tpu-reset-control-keys nil)
2139 (tpu-set-mode-line nil)
2140 (setq-default page-delimiter "^\f")
2141 (setq-default truncate-lines nil)
2142 (setq scroll-step 0)
2143 (use-global-map global-map)
2144 (setq tpu-edt-mode nil))))
2145
2146
2147 ;;;
2148 ;;; Turn on TPU-edt and announce it as a feature
2149 ;;;
2150 (tpu-edt-mode)
2151
2152 (provide 'tpu-edt)
2153
2154 ;;; tpu-edt.el ends here