[gsharp-cvs] CVS update: gsharp/esa.lisp
Robert Strandh
rstrandh at common-lisp.net
Mon Aug 8 00:22:09 UTC 2005
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv10388
Modified Files:
esa.lisp
Log Message:
Copy improvements to esa.lisp made by Dave Murray for Climacs.
Date: Mon Aug 8 02:22:08 2005
Author: rstrandh
Index: gsharp/esa.lisp
diff -u gsharp/esa.lisp:1.3 gsharp/esa.lisp:1.4
--- gsharp/esa.lisp:1.3 Tue Aug 2 04:15:57 2005
+++ gsharp/esa.lisp Mon Aug 8 02:22:07 2005
@@ -143,39 +143,65 @@
(t
(unread-gesture gesture :stream stream))))
+(define-gesture-name universal-argument :keyboard (#\u :control))
+
+(define-gesture-name meta-minus :keyboard (#\- :meta))
+
(defun read-numeric-argument (&key (stream *standard-input*))
+ "Reads gestures returning two values: prefix-arg and whether prefix given.
+Accepts: EITHER C-u, optionally followed by other C-u's, optionally followed
+by a minus sign, optionally followed by decimal digits;
+OR An optional M-minus, optionally followed by M-decimal-digits.
+You cannot mix C-u and M-digits.
+C-u gives a numarg of 4. Additional C-u's multiply by 4 (e.g. C-u C-u C-u = 64).
+After C-u you can enter decimal digits, possibly preceded by a minus (but not
+a plus) sign. C-u 3 4 = 34, C-u - 3 4 = -34. Note that C-u 3 - prints 3 '-'s.
+M-1 M-2 = 12. M-- M-1 M-2 = -12. As a special case, C-u - and M-- = -1.
+In the absence of a prefix arg returns 1 (and nil)."
(let ((gesture (esa-read-gesture)))
(cond ((event-matches-gesture-name-p
- gesture
- `(:keyboard #\u ,(make-modifier-state :control)))
+ gesture 'universal-argument)
(let ((numarg 4))
(loop for gesture = (esa-read-gesture)
while (event-matches-gesture-name-p
- gesture
- `(:keyboard #\u ,(make-modifier-state :control)))
+ gesture 'universal-argument)
do (setf numarg (* 4 numarg))
finally (esa-unread-gesture gesture stream))
- (let ((gesture (esa-read-gesture)))
+ (let ((gesture (esa-read-gesture))
+ (sign +1))
+ (when (and (characterp gesture)
+ (char= gesture #\-))
+ (setf gesture (esa-read-gesture)
+ sign -1))
(cond ((and (characterp gesture)
(digit-char-p gesture 10))
- (setf numarg (- (char-code gesture) (char-code #\0)))
+ (setf numarg (digit-char-p gesture 10))
(loop for gesture = (esa-read-gesture)
while (and (characterp gesture)
(digit-char-p gesture 10))
do (setf numarg (+ (* 10 numarg)
- (- (char-code gesture) (char-code #\0))))
+ (digit-char-p gesture 10)))
finally (esa-unread-gesture gesture stream)
- (return (values numarg t))))
+ (return (values (* numarg sign) t))))
(t
(esa-unread-gesture gesture stream)
- (values numarg t))))))
- ((meta-digit gesture)
- (let ((numarg (meta-digit gesture)))
+ (values (if (minusp sign) -1 numarg) t))))))
+ ((or (meta-digit gesture)
+ (event-matches-gesture-name-p
+ gesture 'meta-minus))
+ (let ((numarg 0)
+ (sign +1))
+ (cond ((meta-digit gesture)
+ (setf numarg (meta-digit gesture)))
+ (t (setf sign -1)))
(loop for gesture = (esa-read-gesture)
while (meta-digit gesture)
do (setf numarg (+ (* 10 numarg) (meta-digit gesture)))
finally (esa-unread-gesture gesture stream)
- (return (values numarg t)))))
+ (return (values (if (and (= sign -1) (= numarg 0))
+ -1
+ (* sign numarg))
+ t)))))
(t (esa-unread-gesture gesture stream)
(values 1 nil)))))
More information about the Gsharp-cvs
mailing list