# HG changeset patch # User Richard M. Stallman # Date 768431497 0 # Node ID 4eca60cb3c4da98f4808b31faea80c0abdf59506 # Parent fe56a02838bac56558ab25f2af12acc5457d8768 (tempo-insert-region, tempo-show-completion-buffer, tempo-leave-completion-buffer): New variables. (tempo-complete-tag): Added a completion buffer mechanism. (tempo-display-completions): New function. (tempo-insert-template): An extension to the (p ...) tag enables named insertion for later insertion using a (s ...) tag. diff -r fe56a02838ba -r 4eca60cb3c4d lisp/tempo.el --- a/lisp/tempo.el Sun May 08 21:06:13 1994 +0000 +++ b/lisp/tempo.el Sun May 08 21:11:37 1994 +0000 @@ -3,7 +3,7 @@ ;; Author: David K}gedal ;; Created: 16 Feb 1994 -;; Version: 1.0 +;; Version: 1.1.1 ;; Keywords: extensions, languages, tools ;; This file is part of GNU Emacs. @@ -89,6 +89,20 @@ If this variable is non-nil, `tempo-insert' prompts the user for text to insert in the templates") +(defvar tempo-insert-region nil + "*Automatically insert current region when there is a `r' in the template +If this variable is NIL, `r' elements will be treated just like `p' +elements, unless the template function is given a prefix (or a non-nil +argument). If this variable is non-NIL, the behaviour is reversed.") + +(defvar tempo-show-completion-buffer t + "*If non-NIL, show a buffer with possible completions, when only +a partial completion can be found") + +(defvar tempo-leave-completion-buffer nil + "*If NIL, a completion buffer generated by \\[tempo-complete-tag] +disappears at the next keypress; otherwise, it remains forever.") + (defvar tempo-insert-string-functions nil "List of functions to run when inserting a string. Each function is called with a single arg, STRING." ) @@ -112,6 +126,9 @@ (defvar tempo-default-match-finder "\\b\\([^\\b]*\\)\\=" "The default regexp used to find the string to match against the tags.") +(defvar tempo-named-insertions nil + "Temporary storage for named insertions") + ;; Make some variables local to every buffer (make-variable-buffer-local 'tempo-marks) @@ -142,12 +159,17 @@ - The symbol 'p. This position is saved in `tempo-marks'. - The symbol 'r. If `tempo-insert' is called with ON-REGION non-nil the current region is placed here. Otherwise it works like 'p. - - (p . PROMPT) If `tempo-interactive' is non-nil, the user is + - (p PROMPT ) If `tempo-interactive' is non-nil, the user is prompted in the minbuffer with PROMPT for a string to be inserted. + If the optional parameter NAME is non-nil, the text is saved for + later insertion with the `s' tag. If `tempo-interactive is nil, it works like 'p. - - (r . PROMPT) like the previou, but if `tempo-interactive' is nil + - (r PROMPT) like the previous, but if `tempo-interactive' is nil and `tempo-insert' is called with ON-REGION non-nil, the current region is placed here. + - (s NAME) Inserts text previously read with the (p ..) construct. + Finds the insertion saved under NAME and inserts it. Acts like 'p + if tempo-interactive is nil. - '& If there is only whitespace between the line start and point, nothing happens. Otherwise a newline is inserted. - '% If there is only whitespace between point and end-of-line @@ -169,8 +191,9 @@ (concat "Insert a " name ".")) (list 'interactive "*P") (list 'tempo-insert-template (list 'quote - template-name) - 'arg))) + template-name) + (list 'if 'tempo-insert-region + (list 'not 'arg) 'arg)))) (and tag (tempo-add-tag tag template-name taglist)) command-name)) @@ -190,7 +213,8 @@ (mapcar 'tempo-insert (symbol-value template)) (tempo-insert-mark (point-marker))) - (tempo-forward-mark)) + (tempo-forward-mark) + (tempo-forget-insertions)) ;;; ;;; tempo-insert @@ -206,6 +230,10 @@ (if on-region (exchange-point-and-mark) (tempo-insert-prompt (cdr element)))) + ((and (consp element) (eq (car element) 's)) + (if tempo-interactive + (tempo-insert-named (cdr element)) + (tempo-insert-mark (point-marker)))) ((eq element 'p) (tempo-insert-mark (point-marker))) ((eq element 'r) (if on-region (exchange-point-and-mark) @@ -234,12 +262,50 @@ If the variable `tempo-interactive' is non-nil the user is prompted for a string in the minibuffer, which is then inserted in the current buffer. If `tempo-interactive' is nil, the current point is placed on -`tempo-forward-mark-list'. +`tempo-mark'. + +PROMPT is the prompt string or a list containing the prompt string and +a name to save the inserted text under." + (if tempo-interactive + (let ((prompt-string (if (listp prompt) + (car prompt) + prompt)) + (save-name (and (listp prompt) (nth 1 prompt))) + inserted-text) + + (progn + (setq inserted-text (read-string prompt-string)) + (insert inserted-text) + (if save-name + (tempo-remember-insertion save-name inserted-text)))) + (tempo-insert-mark (point-marker)))) + +;;; +;;; tempo-remember-insertion -PROMPT is the prompt string." - (if tempo-interactive - (insert (read-string prompt)) - (tempo-insert-mark (point-marker)))) +(defun tempo-remember-insertion (save-name string) + "Save the text in STRING under the name SAVE-NAME for later retrieval." + (setq tempo-named-insertions (cons (cons save-name string) + tempo-named-insertions))) + +;;; +;;; tempo-forget-insertions + +(defun tempo-forget-insertions () + "Forget all the saved named insertions." + (setq tempo-named-insertions nil)) + +;;; +;;; tempo-insert-named + +(defun tempo-insert-named (elt) + "Insert the previous insertion saved under a named specified in ELT. +The name is in the car of ELT." + (let* ((name (car elt)) + (insertion (cdr (assq name tempo-named-insertions)))) + (if insertion + (insert insertion) + (error "Named insertion not found")))) ;;; ;;; tempo-process-and-insert-string @@ -248,7 +314,6 @@ "Insert a string from a template. Run a string through the preprocessors in `tempo-insert-string-functions' and insert the results." - (cond ((null tempo-insert-string-functions) nil) ((symbolp tempo-insert-string-functions) @@ -381,7 +446,7 @@ ;;; tempo-complete-tag (defun tempo-complete-tag (&optional silent) - "Look for a tag and expand it.. + "Look for a tag and expand it. It goes through the tag lists in `tempo-local-tags' (this includes `tempo-tags') and for each list it uses the corresponding match-finder @@ -397,8 +462,12 @@ in `tempo-local-tags', the result may not be desirable. If no match is found or a partial match is found, and SILENT is -non-nil, the function will give a signal." +non-nil, the function will give a signal. +If tempo-show-completion-buffer is non-NIL, a buffer containing +possible completions is displayed when a partial completion is found." + + ;; This function is really messy. Some cleaning up is necessary. (interactive) (if (catch 'completed (mapcar @@ -411,30 +480,33 @@ (match-string (car match-info)) (match-start (cdr match-info)) (compl (or (cdr (assoc match-string tag-list)) - (try-completion (car match-info) + (try-completion match-string tag-list)))) (if compl ;any match (delete-region match-start (point))) (cond - ((null compl) + ((null compl) ; No match nil) - ((symbolp compl) + ((symbolp compl) ; ?? (tempo-insert-template compl nil) (throw 'completed t)) - ((eq compl t) + ((eq compl t) ; Exact, sole match (tempo-insert-template (cdr (assoc match-string tag-list)) nil) (throw 'completed t)) - ((stringp compl) + ((stringp compl) ; (partial) completion found (let ((compl2 (assoc compl tag-list))) (if compl2 (tempo-insert-template (cdr compl2) nil) (insert compl) - (if (string= match-string compl) - (if (not silent) - (ding))))) + (if t ;(string= match-string compl) + (if tempo-show-completion-buffer + (tempo-display-completions match-string + tag-list) + (if (not silent) + (ding)))))) (throw 'completed t)))))) tempo-local-tags) ;; No completion found. Return nil @@ -446,4 +518,19 @@ (ding)) nil)) +;;; +;;; tempo-display-completions + +(defun tempo-display-completions (string tag-list) + "Show a buffer containing possible completions for STRING." + (if tempo-leave-completion-buffer + (with-output-to-temp-buffer "*Completions*" + (display-completion-list + (all-completions string tag-list))) + (save-window-excursion + (with-output-to-temp-buffer "*Completions*" + (display-completion-list + (all-completions string tag-list))) + (sit-for 32767)))) + ;;; tempo.el ends here