Mercurial > hg > xemacs
comparison shared/hist.el @ 0:107d592c5f4a
DICE versions, used by pers/common, recursive, I think/hope
author | Henry S. Thompson <ht@inf.ed.ac.uk> |
---|---|
date | Mon, 08 Feb 2021 11:44:37 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:107d592c5f4a |
---|---|
1 ;;; a tcsh-type history key facility for sub-shells | |
2 ;; Last edited: Wed Nov 14 09:52:12 1990 | |
3 | |
4 (provide 'hist) | |
5 (require 'prompt-for-word) | |
6 | |
7 (defvar hk-last-mb nil "*begin of last hk match") | |
8 | |
9 (defvar hk-last-mark nil "*beginning of last hk insertion") | |
10 | |
11 (defvar hk-search-pat nil "*regexp for hk search") | |
12 | |
13 (defvar hk-last-point 0 "*end of last hk insertion") | |
14 | |
15 (defvar hkr-last-point 0 "*end of last hk pattern search insertion") | |
16 | |
17 (defvar hkr-search-pat nil "*regexp for hk user pattern search") | |
18 | |
19 (defvar hk-last-user-pat nil "*user part of last pattern search") | |
20 | |
21 (make-local-variable 'hk-last-mb) | |
22 (make-local-variable 'hk-last-mark) | |
23 (make-local-variable 'hk-last-point) | |
24 (make-local-variable 'hk-search-pat) | |
25 (make-local-variable 'hkr-search-pat) | |
26 (make-local-variable 'hkr-last-point) | |
27 (make-local-variable 'hk-last-user-pat) | |
28 | |
29 (defvar hk-pat-table '(("*shell*" . ".*: ") | |
30 ("*prolog*" . "| \\?- ") | |
31 ("*lisp*" . ">") | |
32 ("*inferior-lisp*" . ">")) | |
33 "default crux of prompt pattern, by buffer name") | |
34 | |
35 (defun hist-key (&optional rpt) | |
36 "offer a previous input, a la tcsh ^P" | |
37 (interactive "p") | |
38 (if (not rpt) (setq rpt 1)) | |
39 (let ((here (point)) | |
40 (pat (or hk-search-pat | |
41 (setq hk-search-pat | |
42 (concat "^" (or (cdr (assoc (buffer-name | |
43 (current-buffer)) | |
44 hk-pat-table)) | |
45 "") | |
46 "\\(.+\\)$"))))) | |
47 (hk-find-b rpt here pat))) | |
48 | |
49 (defun hk-find-b (rpt here pat) | |
50 "search backwards for pat, no dups, rpt times" | |
51 (while (> rpt 0) | |
52 (goto-char (if (= (point) hk-last-point) | |
53 hk-last-mb | |
54 (if (eobp) | |
55 (progn (beginning-of-line) | |
56 (setq hk-last-mark nil) | |
57 (point)) | |
58 (error "nowhere??")))) | |
59 (let ((keep-trying t)) | |
60 (while keep-trying | |
61 (if (re-search-backward pat nil t) | |
62 (let ((entry (buffer-substring (match-beginning 1) | |
63 (match-end 1)))) | |
64 (setq hk-last-mb (match-beginning 0)) | |
65 (goto-char (or hk-last-mark here)) | |
66 (if (looking-at (regexp-quote entry)) | |
67 (goto-char hk-last-mb) | |
68 (setq keep-trying nil) | |
69 (if hk-last-mark (delete-region hk-last-mark hk-last-point)) | |
70 (setq hk-last-mark (point)) | |
71 (push-mark (point) t) | |
72 (insert entry) | |
73 (setq hk-last-point (point)))) | |
74 (unwind-protect (error "no more??") | |
75 (goto-char (if hk-last-mark | |
76 hk-last-point | |
77 here)))))) | |
78 (setq rpt (1- rpt)))) | |
79 | |
80 (defun hist-key-back (&optional rpt) | |
81 "offer a previous input, a la tcsh ^N" | |
82 (interactive "p") | |
83 (if (not rpt) (setq rpt 1)) | |
84 (let ((here (point)) | |
85 (pat (or hk-search-pat | |
86 (error "no pattern")))) | |
87 (while (> rpt 0) | |
88 (goto-char (if (= (point) hk-last-point) | |
89 hk-last-mb | |
90 (error "lost context"))) | |
91 (let ((keep-trying t)) | |
92 (while keep-trying | |
93 (end-of-line) | |
94 (if (re-search-forward pat nil t) | |
95 (let ((entry (buffer-substring (match-beginning 1) | |
96 (match-end 1)))) | |
97 (setq hk-last-mb (match-beginning 0)) | |
98 (goto-char (or hk-last-mark here)) | |
99 (if (looking-at (regexp-quote entry)) | |
100 ;; allow for back to square one | |
101 (if (progn (end-of-line) | |
102 (eobp)) | |
103 (progn (setq keep-trying nil) | |
104 (if hk-last-mark | |
105 (delete-region hk-last-mark hk-last-point) | |
106 (error "shouldnt")) | |
107 (goto-char hk-last-mark)) | |
108 (goto-char hk-last-mb)) | |
109 (setq keep-trying nil) | |
110 (if hk-last-mark (delete-region hk-last-mark hk-last-point)) | |
111 (setq hk-last-mark (point)) | |
112 (push-mark (point) t) | |
113 (insert entry) | |
114 (setq hk-last-point (point)))) | |
115 (unwind-protect (error "no more??") | |
116 (goto-char (if hk-last-mark | |
117 hk-last-point | |
118 here)))))) | |
119 (setq rpt (1- rpt))))) | |
120 | |
121 (defun hist-key-search (&optional rpt pat) | |
122 "offer a previous input, searching backwards for a pattern" | |
123 (interactive "p") | |
124 (if (not rpt) (setq rpt 1)) | |
125 (let ((here (point)) | |
126 (full-pat | |
127 (if (= (point) hkr-last-point) | |
128 hkr-search-pat | |
129 (setq hkr-search-pat | |
130 (if (eobp) | |
131 (concat "^" | |
132 (or (cdr (assoc (buffer-name | |
133 (current-buffer)) | |
134 hk-pat-table)) | |
135 "") | |
136 "\\(.*" | |
137 (setq hk-last-user-pat | |
138 (or pat | |
139 (regexp-quote | |
140 (prompt-for-word | |
141 "Pattern: " | |
142 (or hk-last-user-pat "") | |
143 nil nil)))) | |
144 ".*\\)$") | |
145 (error "nowhere??")))))) | |
146 (hk-find-b rpt here full-pat) | |
147 (setq hkr-last-point hk-last-point))) | |
148 | |
149 (require 'shell) | |
150 | |
151 (define-key shell-mode-map "\ep" 'hist-key) | |
152 (define-key shell-mode-map "\en" 'hist-key-back) | |
153 (define-key shell-mode-map "\es" 'hist-key-search) | |
154 (define-key shell-mode-map "\e\C-i" 'shell-expand-file-name) | |
155 | |
156 ;;; hack in case we've been given com-int | |
157 (if (not (boundp 'inferior-lisp-mode-map)) | |
158 (require 'inf-lisp)) | |
159 (define-key inferior-lisp-mode-map "\ep" 'hist-key) | |
160 (define-key inferior-lisp-mode-map "\en" 'hist-key-back) | |
161 ;; note that prolog copies shell-mode-map, so no need to fix that |