Mercurial > emacs
changeset 11196:a74358cc05c6
(tempo-insert): Added the P tag and modified the s tag accordingly
(tempo-insert-named): Checks for valid name, insert mark otherwise.
(tempo-dolist): Changed (cadr ...) to (car (cdr ...))
(tempo-expand-if-complete): New function
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 03 Apr 1995 22:23:51 +0000 |
parents | 0833fb6a29bb |
children | 1bdc265aab86 |
files | lisp/tempo.el |
diffstat | 1 files changed, 93 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/tempo.el Mon Apr 03 22:16:16 1995 +0000 +++ b/lisp/tempo.el Mon Apr 03 22:23:51 1995 +0000 @@ -3,8 +3,9 @@ ;; Author: David K}gedal <davidk@lysator.liu.se > ;; Created: 16 Feb 1994 -;; Version: 1.2 +;; Version: 1.2.1 ;; Keywords: extensions, languages, tools +;; $Revision: 1.29 $ ;; This file is part of GNU Emacs. @@ -28,9 +29,9 @@ ;; macros, if you wish. It is mainly intended for, but not limited to, ;; other programmers to be used for creating shortcuts for editing ;; certain kind of documents. It was originally written to be used by -;; a HTML editing mode written by Nelson Minar <nelson@reed.edu>, and -;; his html-helper-mode.el is probably the best example of how to use -;; this program. +;; a HTML editing mode written by Nelson Minar <nelson@santafe.edu>, +;; and his html-helper-mode.el is probably the best example of how to +;; use this program. ;; A template is defined as a list of items to be inserted in the ;; current buffer at point. Some of the items can be simple strings, @@ -90,6 +91,16 @@ ;; working. If it doesn't work for you, send me a note indicating your ;; emacs version and your problems. +;;; Contributors: + +;; These people have given me importand feedback and new ideas for +;; tempo.el. Thanks. + +;; Nelson Minar <nelson@santafe.edu> +;; Richard Stallman <rms@gnu.ai.mit.edu> +;; Lars Lindberg <Lars.Lindberg@sypro.cap.se> +;; Glen Whitney <Glen.Whitney@math.lsa.umich.edu> + ;;; Code: ;; (provide 'tempo) @@ -188,6 +199,23 @@ ;;; Functions +;;; First some useful functions and macros + +(defun tempo-mapc (fun lst) + (if (null lst) nil + (funcall fun (car lst)) + (tempo-mapc fun (cdr lst)))) + +(defmacro tempo-dolist (il &rest forms) + (let ((i (car il)) + (l (car (cdr il)))) + (list 'tempo-mapc + (list 'function (append (list 'lambda + (list (car il))) + forms)) + (cadr il)))) +(put 'tempo-dolist 'lisp-indent-function 1) + ;; ;; tempo-define-template @@ -294,14 +322,15 @@ (cond ((stringp element) (tempo-process-and-insert-string element)) ((and (consp element) (eq (car element) 'p)) (tempo-insert-prompt (cdr element))) + ((and (consp element) (eq (car element) 'P)) + (let ((tempo-interactive t)) + (tempo-insert-prompt (cdr element)))) ((and (consp element) (eq (car element) 'r)) (if on-region (goto-char tempo-region-stop) (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)))) + (tempo-insert-named (car (cdr element)))) ((and (consp element) (eq (car element) 'l)) (mapcar (function (lambda (elt) (tempo-insert elt on-region))) (cdr element))) @@ -399,14 +428,13 @@ ;;; ;;; 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)))) +(defun tempo-insert-named (name) + "Insert the previous insertion saved under a named specified in NAME. +If there is no such name saved, a tempo mark is inserted." + (let* ((insertion (cdr (assq name tempo-named-insertions)))) (if insertion (insert insertion) - (error "Named insertion not found")))) + (tempo-insert-mark (point-marker))))) ;;; ;;; tempo-process-and-insert-string @@ -419,11 +447,10 @@ nil) ((symbolp tempo-insert-string-functions) (setq string - (apply tempo-insert-string-functions (list string)))) + (funcall tempo-insert-string-functions string))) ((listp tempo-insert-string-functions) - (mapcar (function (lambda (fn) - (setq string (apply fn string)))) - tempo-insert-string-functions)) + (tempo-dolist (fn tempo-insert-string-functions) + (setq string (funcall fn string)))) (t (error "Bogus value in tempo-insert-string-functions: %s" tempo-insert-string-functions))) @@ -548,15 +575,19 @@ (defun tempo-find-match-string (finder) "Find a string to be matched against a tag list. -FINDER is a function or a string. Returns (STRING . POS)." +FINDER is a function or a string. Returns (STRING . POS), or nil +if no reasonable string is found." (cond ((stringp finder) - (save-excursion - (or (re-search-backward finder nil t) - 0)) - (cons (buffer-substring (match-beginning 1) - (match-end 1)) ; This seems to be a - ; bug in emacs - (match-beginning 1))) + (let (successful) + (save-excursion + (or (setq successful (re-search-backward finder nil t)) + 0)) + (if successful + (cons (buffer-substring (match-beginning 1) + (match-end 1)) ; This seems to be a + ; bug in emacs + (match-beginning 1)) + nil))) (t (funcall finder)))) @@ -565,10 +596,12 @@ (defun tempo-complete-tag (&optional silent) "Look for a tag and expand it. -All the tags in the tag lists in `tempo-local-tags' (this includes -`tempo-tags') are searched for a match for the text before the point. -The way the string to match for is determined can be altered with the -variable `tempo-match-finder' +All the tags in the tag lists in `tempo-local-tags' +(this includes `tempo-tags') are searched for a match for the text +before the point. The way the string to match for is determined can +be altered with the variable `tempo-match-finder'. If +`tempo-match-finder' returns nil, then the results are the same as +no match at all. If a single match is found, the corresponding template is expanded in place of the matching string. @@ -588,9 +621,10 @@ (match-start (cdr match-info)) (exact (assoc match-string collection)) (compl (or (car exact) - (try-completion match-string collection)))) + (and match-info (try-completion match-string collection))))) (if compl (delete-region match-start (point))) - (cond ((null compl) (or silent (ding))) + (cond ((null match-info) (or silent (ding))) + ((null compl) (or silent (ding))) ((eq compl t) (tempo-insert-template (cdr (assoc match-string collection)) @@ -619,6 +653,34 @@ (all-completions string tag-list))) (sit-for 32767)))) +;;; +;;; tempo-expand-if-complete + +(defun tempo-expand-if-complete () + "Expand the tag before point if it is complete. +Returns non-nil if an expansion was made and nil otherwise. + +This could as an example be used in a command that is bound to the +space bar, and looks something like this: + +(defun tempo-space () + (interactive \"*\") + (or (tempo-expand-if-complete) + (insert \" \")))" + + (interactive "*") + (let* ((collection (tempo-build-collection)) + (match-info (tempo-find-match-string tempo-match-finder)) + (match-string (car match-info)) + (match-start (cdr match-info)) + (exact (assoc match-string collection))) + (if exact + (progn + (delete-region match-start (point)) + (tempo-insert-template (cdr exact) nil) + t) + nil))) + (provide 'tempo) ;;; tempo.el ends here