diff emacs/prompt-for-word.el @ 0:509549c55989

from elsewhere
author Henry S. Thompson <ht@inf.ed.ac.uk>
date Tue, 25 May 2021 13:57:42 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emacs/prompt-for-word.el	Tue May 25 13:57:42 2021 -0400
@@ -0,0 +1,47 @@
+;; Last edited: Wed Nov 14 14:20:08 1990
+;;; define an interlisp-style prompt-for-word
+(provide 'prompt-for-word)
+
+(defun prompt-for-word (prompt candidate completion-table keymap)
+  "prompt for a word using PROMPT, and CANDIDATE as first choice.
+If any inserting characters are typed, they replace the candidate.
+Uses KEYMAP if non-nil, otherwise
+if completion-table is non-nil,
+  uses minibuffer-local-must-match-map plus ^N to exit as is,
+  thereby allowing New answers,
+otherwise uses minibuffer-local-map."
+  (let ((current-window (selected-window))
+	(echo-keystrokes 0)
+	char)
+    (select-window (minibuffer-window))
+    (erase-buffer)
+    (insert prompt candidate)
+    (setq char (read-char))
+    (let ((str (make-string 1 char)))
+      (if (eq (or (local-key-binding str)
+		  (global-key-binding str))
+	      'self-insert-command)
+	  (setq candidate nil)))
+    (select-window current-window)
+    (if (boundp 'unread-command-event)
+	;; lemacs
+	(setq unread-command-event
+	      (character-to-event char))
+      (setq unread-command-char char))
+    (let ((minibuffer-completion-table completion-table)
+	  (minibuffer-completion-confirm nil))
+      ;; not quite the same as completing-read, because you can't
+      ;; get m-c-c nil and m-m-map simultaneously
+      (read-from-minibuffer prompt candidate
+			    (or keymap
+				(if completion-table
+				    ;; allow ^N to exit with non-match for
+				    ;; new names
+				    pfw-map
+				  minibuffer-local-map))))))
+
+(defvar pfw-map (let ((new (copy-keymap minibuffer-local-must-match-map)))
+		  (define-key new "\C-n" 'exit-minibuffer)
+		  new)
+  "special completion map for prompt-for-word (q.v.)")
+