[climacs-cvs] CVS update: climacs/gui.lisp
Robert Strandh
rstrandh at common-lisp.net
Wed Jan 19 14:38:50 UTC 2005
Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv27404
Modified Files:
gui.lisp
Log Message:
Implemented keyboard macros, except that there is a bug that
do not have time to track down right now, leaving an extra 'e'
in the buffer.
Date: Wed Jan 19 06:38:48 2005
Author: rstrandh
Index: climacs/gui.lisp
diff -u climacs/gui.lisp:1.84 climacs/gui.lisp:1.85
--- climacs/gui.lisp:1.84 Tue Jan 18 21:28:38 2005
+++ climacs/gui.lisp Wed Jan 19 06:38:47 2005
@@ -50,7 +50,11 @@
(define-application-frame climacs ()
((windows :accessor windows)
- (buffers :initform '() :accessor buffers))
+ (buffers :initform '() :accessor buffers)
+ (recordingp :initform nil :accessor recordingp)
+ (executingp :initform nil :accessor executingp)
+ (recorded-keys :initform '() :accessor recorded-keys)
+ (remaining-keys :initform '() :accessor remaining-keys))
(:panes
(win (let* ((extended-pane
(make-pane 'extended-pane
@@ -105,12 +109,15 @@
(declare (ignore frame))
(with-slots (climacs-pane) pane
(let* ((buf (buffer climacs-pane))
- (name-info (format nil " ~a ~a Syntax: ~a ~a"
+ (name-info (format nil " ~a ~a Syntax: ~a ~a ~a"
(if (needs-saving buf) "**" "--")
(name buf)
(name (syntax buf))
(if (slot-value climacs-pane 'overwrite-mode)
"Ovwrt"
+ "")
+ (if (recordingp *application-frame*)
+ "Def"
""))))
(princ name-info pane))))
@@ -139,8 +146,11 @@
:test #'event-matches-gesture-name-p))
(defun climacs-read-gesture ()
+ (unless (null (remaining-keys *application-frame*))
+ (return-from climacs-read-gesture
+ (pop (remaining-keys *application-frame*))))
(loop for gesture = (read-gesture :stream *standard-input*)
- when (event-matches-gesture-name-p gesture '(#\g :control))
+ when (event-matches-gesture-name-p gesture '(:keyboard #\g 512)) ; FIXME
do (throw 'outer-loop nil)
until (or (characterp gesture)
(and (typep gesture 'keyboard-event)
@@ -154,7 +164,16 @@
:hyper-left :hyper-right
:shift-lock :caps-lock
:alt-left :alt-right))))))
- finally (return gesture)))
+ finally (progn (when (recordingp *application-frame*)
+ (push gesture (recorded-keys *application-frame*)))
+ (return gesture))))
+
+(defun climacs-unread-gesture (gesture stream)
+ (cond ((recordingp *application-frame*)
+ (pop (recorded-keys *application-frame*)))
+ ((executingp *application-frame*)
+ (push gesture (remaining-keys *application-frame*))))
+ (unread-gesture gesture :stream stream))
(defun read-numeric-argument (&key (stream *standard-input*))
(let ((gesture (climacs-read-gesture)))
@@ -163,7 +182,7 @@
(loop for gesture = (climacs-read-gesture)
while (event-matches-gesture-name-p gesture '(:keyboard #\u 512)) ; FIXME
do (setf numarg (* 4 numarg))
- finally (unread-gesture gesture :stream stream))
+ finally (climacs-unread-gesture gesture stream))
(let ((gesture (climacs-read-gesture)))
(cond ((and (characterp gesture)
(digit-char-p gesture 10))
@@ -173,19 +192,19 @@
(digit-char-p gesture 10))
do (setf numarg (+ (* 10 numarg)
(- (char-code gesture) (char-code #\0))))
- finally (unread-gesture gesture :stream stream)
+ finally (climacs-unread-gesture gesture stream)
(return (values numarg t))))
(t
- (unread-gesture gesture :stream stream)
+ (climacs-unread-gesture gesture stream)
(values numarg t))))))
((meta-digit gesture)
(let ((numarg (meta-digit gesture)))
(loop for gesture = (climacs-read-gesture)
while (meta-digit gesture)
do (setf numarg (+ (* 10 numarg) (meta-digit gesture)))
- finally (unread-gesture gesture :stream stream)
+ finally (climacs-unread-gesture gesture stream)
(return (values numarg t)))))
- (t (unread-gesture gesture :stream stream)
+ (t (climacs-unread-gesture gesture stream)
(values 1 nil)))))
;;; we know the vbox pane has a scroller pane and an info
@@ -237,12 +256,16 @@
(let ((buffer (buffer (current-window))))
(when (modified-p buffer)
(setf (needs-saving buffer) t)))
- (redisplay-frame-panes frame)))
+ (when (null (remaining-keys *application-frame*))
+ (setf (executingp *application-frame*) nil)
+ (redisplay-frame-panes frame))))
(beep)
(let ((buffer (buffer (current-window))))
(when (modified-p buffer)
(setf (needs-saving buffer) t)))
- (redisplay-frame-panes frame)))))
+ (when (null (remaining-keys *application-frame*))
+ (setf (executingp *application-frame*) nil)
+ (redisplay-frame-panes frame))))))
(defun region-limits (pane)
(if (mark< (mark pane) (point pane))
@@ -675,6 +698,25 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
+;;; Keyboard macros
+
+(define-named-command com-start-kbd-macro ()
+ (setf (recordingp *application-frame*) t)
+ (setf (recorded-keys *application-frame*) '()))
+
+(define-named-command com-end-kbd-macro ()
+ (setf (recordingp *application-frame*) nil)
+ (setf (recorded-keys *application-frame*)
+ ;; this won't work if the command was invoked in any old way
+ (reverse (cddr (recorded-keys *application-frame*)))))
+
+(define-named-command com-call-last-kbd-macro ()
+ (setf (remaining-keys *application-frame*)
+ (recorded-keys *application-frame*))
+ (setf (executingp *application-frame*) t))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
;;; Commands for splitting windows
(defun replace-constellation (constellation additional-constellation vertical-p)
@@ -971,7 +1013,10 @@
(c-x-set-key '(#\0) 'com-delete-window)
(c-x-set-key '(#\2) 'com-split-window-vertically)
(c-x-set-key '(#\3) 'com-split-window-horizontally)
+(c-x-set-key '(#\() 'com-start-kbd-macro)
+(c-x-set-key '(#\)) 'com-end-kbd-macro)
(c-x-set-key '(#\b) 'com-switch-to-buffer)
+(c-x-set-key '(#\e) 'com-call-last-kbd-macro)
(c-x-set-key '(#\c :control) 'com-quit)
(c-x-set-key '(#\f :control) 'com-find-file)
(c-x-set-key '(#\l :control) 'com-load-file)
More information about the Climacs-cvs
mailing list