[climacs-cvs] CVS update: climacs/syntax.lisp climacs/slidemacs-gui.lisp climacs/pane.lisp climacs/packages.lisp climacs/lisp-syntax.lisp climacs/gui.lisp climacs/esa.lisp

Dave Murray dmurray at common-lisp.net
Tue Sep 13 19:24:03 UTC 2005


Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv7426

Modified Files:
	syntax.lisp slidemacs-gui.lisp pane.lisp packages.lisp 
	lisp-syntax.lisp gui.lisp esa.lisp 
Log Message:
Two major groups of changes, as steps towards supporting
the multi-pane paradigm: (a) changes to support non-buffer-
containing panes (a typeout pane is the first example - try
C-h b); (b) distributed commands among a plethora of little
command tables, as threatened on the mailing list.
Also: changed info-pane (again) - now includes call to
name-for-info-pane (specialised on syntax) - try a lisp file
where climacs can work out the package name; got rid of
'Toggle' names (didn't add anything); mouse-clicks now change
window and position the cursor; now command Insert Parentheses
(M-() that almost works.
Slidemacs temporarily broken...

Date: Tue Sep 13 21:24:00 2005
Author: dmurray

Index: climacs/syntax.lisp
diff -u climacs/syntax.lisp:1.57 climacs/syntax.lisp:1.58
--- climacs/syntax.lisp:1.57	Wed Aug 17 01:10:29 2005
+++ climacs/syntax.lisp	Tue Sep 13 21:23:59 2005
@@ -148,6 +148,12 @@
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
+;;; Name for info-pane
+
+(defgeneric name-for-info-pane (syntax))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
 ;;; Syntax completion
 
 (defparameter *syntaxes* '())
@@ -240,6 +246,9 @@
 (defmethod update-syntax-for-display (buffer (syntax basic-syntax) from to)
   (declare (ignore buffer from to))
   nil)
+
+(defmethod name-for-info-pane ((syntax basic-syntax))
+  (name syntax))
 
 (defmethod syntax-line-indentation (mark tab-width (syntax basic-syntax))
   (declare (ignore mark tab-width))


Index: climacs/slidemacs-gui.lisp
diff -u climacs/slidemacs-gui.lisp:1.18 climacs/slidemacs-gui.lisp:1.19
--- climacs/slidemacs-gui.lisp:1.18	Thu Sep  1 02:21:08 2005
+++ climacs/slidemacs-gui.lisp	Tue Sep 13 21:23:59 2005
@@ -35,6 +35,8 @@
 (defvar *current-slideset*)
 (defvar *did-display-a-slide*)
 
+(make-command-table 'slidemacs-table)
+
 (defun slidemacs-entity-string (entity)
   (coerce (buffer-sequence (buffer entity)
                            (1+ (start-offset entity))
@@ -357,7 +359,7 @@
                                             (- y2 y1)))))))
 
 (define-command (com-reveal-text :name "Reveal Text In Window"
-                                   :command-table global-command-table
+                                   :command-table slidemacs-table
                                    :menu t
                                    :provide-output-destination-keyword t)
     ((text 'string :prompt "text"))
@@ -366,7 +368,7 @@
       (write-string text stream))))
 
 (define-presentation-to-command-translator reveal-text-translator
-    (reveal-button com-reveal-text global-command-table
+    (reveal-button com-reveal-text slidemacs-table
                    :gesture :select
                    :documentation "Reveal Text In Window"
                    :pointer-documentation "Reveal Text In Window")
@@ -478,7 +480,7 @@
            (or (word-is lexeme "info")
                (word-is lexeme "graph")))))
 
-(climacs-gui::define-named-command com-next-talking-point ()
+(define-command (com-next-talking-point :name t :command-table slidemacs-table) ()
   (let* ((pane (climacs-gui::current-window))
          (buffer (buffer pane))
          (syntax (syntax buffer)))
@@ -493,7 +495,7 @@
                (return (setf (offset point) (start-offset lexeme)))))
           (full-redisplay pane))))))
 
-(climacs-gui::define-named-command com-previous-talking-point ()
+(define-command (com-previous-talking-point :name t :command-table slidemacs-table) ()
   (let* ((pane (climacs-gui::current-window))
          (buffer (buffer pane))
          (syntax (syntax buffer)))
@@ -516,23 +518,23 @@
               collect thing
               else collect (if decrease-p (- thing 8) (+ thing 8)))))
 
-(climacs-gui::define-named-command com-decrease-presentation-font-sizes ()
+(define-command (com-decrease-presentation-font-sizes :name t :command-table slidemacs-table) ()
   (adjust-font-sizes t)
   (full-redisplay (climacs-gui::current-window)))
 
-(climacs-gui::define-named-command com-increase-presentation-font-sizes ()
+(define-command (com-increase-presentation-font-sizes :name t :command-table slidemacs-table) ()
   (adjust-font-sizes nil)
   (full-redisplay (climacs-gui::current-window)))
 
-(climacs-gui::define-named-command com-first-talking-point ()
+(define-command (com-first-talking-point :name t :command-table slidemacs-table) ()
   (climacs-gui::com-beginning-of-buffer)
   (com-next-talking-point))
 
-(climacs-gui::define-named-command com-last-talking-point ()
+(define-command (com-last-talking-point :name t :command-table slidemacs-table) ()
   (climacs-gui::com-end-of-buffer)
   (com-previous-talking-point))
 
-(climacs-gui::define-named-command com-flip-slidemacs-syntax ()
+(define-command (com-flip-slidemacs-syntax :name t :command-table slidemacs-table) ()
   (let* ((buffer (buffer (climacs-gui::current-window)))
          (syntax (syntax buffer)))
     (typecase syntax
@@ -544,28 +546,28 @@
                                             :buffer buffer))))))
 
 (esa:set-key  'com-next-talking-point
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\= :control)))
 (esa:set-key  'com-previous-talking-point
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\- :control)))
 (esa:set-key  'com-increase-presentation-font-sizes
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\= :meta)))
 (esa:set-key  'com-decrease-presentation-font-sizes
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\- :meta)))
 (esa:set-key  'com-last-talking-point
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\= :control :meta)))
 (esa:set-key  'com-first-talking-point
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\- :control :meta)))
 (esa:set-key  'com-flip-slidemacs-syntax
-	      'climacs-gui::global-climacs-table
+	      'slidemacs-table
 	      '((#\s :control :meta)))
 
-(climacs-gui::define-named-command com-postscript-print-presentation ()
+(define-command (com-postscript-print-presentation :name t :command-table slidemacs-table) ()
   (let ((pane (climacs-gui::current-window)))
     (if (not (and (typep pane 'climacs-pane)
                   (typep (syntax (buffer pane)) 'slidemacs-gui-syntax)))


Index: climacs/pane.lisp
diff -u climacs/pane.lisp:1.32 climacs/pane.lisp:1.33
--- climacs/pane.lisp:1.32	Thu Sep  1 02:21:08 2005
+++ climacs/pane.lisp	Tue Sep 13 21:23:59 2005
@@ -267,7 +267,7 @@
    (cursor-y :initform 2)
    (space-width :initform nil)
    (tab-width :initform nil)
-   (auto-fill-mode :initform t :accessor auto-fill-mode)
+   (auto-fill-mode :initform nil :accessor auto-fill-mode)
    (auto-fill-column :initform 70 :accessor auto-fill-column)
    (isearch-mode :initform nil :accessor isearch-mode)
    (isearch-states :initform '() :accessor isearch-states)


Index: climacs/packages.lisp
diff -u climacs/packages.lisp:1.81 climacs/packages.lisp:1.82
--- climacs/packages.lisp:1.81	Tue Sep  6 23:30:33 2005
+++ climacs/packages.lisp	Tue Sep 13 21:23:59 2005
@@ -107,6 +107,7 @@
 	   #:parse-stack-next #:parse-stack-symbol
 	   #:parse-stack-parse-trees #:map-over-parse-trees
 	   #:no-such-operation #:no-expression
+	   #:name-for-info-pane
            #:syntax-line-indentation
 	   #:forward-expression #:backward-expression
 	   #:eval-defun


Index: climacs/lisp-syntax.lisp
diff -u climacs/lisp-syntax.lisp:1.34 climacs/lisp-syntax.lisp:1.35
--- climacs/lisp-syntax.lisp:1.34	Mon Sep  5 09:07:28 2005
+++ climacs/lisp-syntax.lisp	Tue Sep 13 21:23:59 2005
@@ -43,6 +43,11 @@
   (with-slots (buffer scan) syntax
      (setf scan (clone-mark (low-mark buffer) :left))))
 
+(defmethod name-for-info-pane ((syntax lisp-syntax))
+  (format nil "Lisp~@[:~(~A~)~]"
+	  (when (slot-value syntax 'package)
+	    (package-name (slot-value syntax 'package)))))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; lexer
@@ -1571,6 +1576,31 @@
 		    (mark< mark (end-offset form)))
 	  do (setf (offset mark) (end-offset form))
 	     (loop-finish))))
+
+(defun in-type-p-in-children (children offset type)
+  (loop for child in children
+	do (cond ((< (start-offset child) offset (end-offset child))
+		  (return (if (typep child type)
+			      child
+			      (in-type-p-in-children (children child) offset type))))
+		 ((<= offset (start-offset child))
+		  (return nil))
+		 (t nil))))
+
+(defun in-type-p (mark syntax type)
+  (let ((offset (offset mark)))
+    (with-slots (stack-top) syntax
+       (if (or (null (start-offset stack-top))
+	       (>= offset (end-offset stack-top))
+	       (<= offset (start-offset stack-top)))
+	   nil)
+       (in-type-p-in-children (children stack-top) offset type))))
+
+(defun in-string-p (mark syntax)
+  (in-type-p mark syntax 'string-form))
+
+(defun in-comment-p (mark syntax)
+  (in-type-p mark syntax 'comment))
 
 ;;; shamelessly replacing SWANK code
 ;; We first work through the string removing the characters and noting


Index: climacs/gui.lisp
diff -u climacs/gui.lisp:1.187 climacs/gui.lisp:1.188
--- climacs/gui.lisp:1.187	Tue Sep  6 23:30:33 2005
+++ climacs/gui.lisp	Tue Sep 13 21:23:59 2005
@@ -53,38 +53,93 @@
 (defparameter *with-scrollbars* t
   "If T, classic look and feel. If NIL, stripped-down look (:")
 
+;;; Basic functionality
+(make-command-table 'base-table)
+;;; buffers
+(make-command-table 'buffer-table)
+;;; case
+(make-command-table 'case-table)
+;;; comments
+(make-command-table 'comment-table)
+;;; deleting
+(make-command-table 'deletion-table)
+;;; commands used for climacs development
+(make-command-table 'development-table)
+;;; editing - making changes to a buffer
+(make-command-table 'editing-table)
+;;; filling
+(make-command-table 'fill-table)
+;;; indentation
+(make-command-table 'indent-table)
+;;; information about the buffer
+(make-command-table 'info-table)
+;;; lisp-related commands
+(make-command-table 'lisp-table)
+;;; marking things
+(make-command-table 'marking-table)
+;;; moving around
+(make-command-table 'movement-table)
+;;; panes
+(make-command-table 'pane-table)
+;;; searching
+(make-command-table 'search-table)
+;;; self-insertion
+(make-command-table 'self-insert-table)
+;;; windows
+(make-command-table 'window-table)
+
 (define-application-frame climacs (standard-application-frame
 				   esa-frame-mixin)
   ((buffers :initform '() :accessor buffers))
-  (:command-table (global-climacs-table :inherit-from (global-esa-table keyboard-macro-table
-									help-table)))
+  (:command-table (global-climacs-table
+		   :inherit-from (global-esa-table
+				  keyboard-macro-table
+				  help-table
+				  base-table
+				  buffer-table
+				  case-table
+				  comment-table
+				  deletion-table
+				  development-table
+				  editing-table
+				  fill-table
+				  indent-table
+				  info-table
+				  lisp-table
+				  marking-table
+				  movement-table
+				  pane-table
+				  search-table
+				  self-insert-table
+				  window-table)))
   (:menu-bar nil)
   (:panes
-   (window (let* ((extended-pane 
-		(make-pane 'extended-pane
-			   :width 900 :height 400
-			   :end-of-line-action :scroll
-			   :incremental-redisplay t
-			   :display-function 'display-window
-			   :command-table 'global-climacs-table))
-	       (info-pane
-		(make-pane 'climacs-info-pane
-			   :master-pane extended-pane
-			   :width 900)))
-	  (setf (windows *application-frame*) (list extended-pane)
-		(buffers *application-frame*) (list (buffer extended-pane)))
+   (climacs-window
+    (let* ((extended-pane 
+	    (make-pane 'extended-pane
+		       :width 900 :height 400
+		       :end-of-line-action :scroll
+		       :incremental-redisplay t
+		       :display-function 'display-window
+		       :command-table 'global-climacs-table))
+	   (info-pane
+	    (make-pane 'climacs-info-pane
+		       :master-pane extended-pane
+		       :width 900)))
+      (setf (windows *application-frame*) (list extended-pane)
+	    (buffers *application-frame*) (list (buffer extended-pane)))
 	  
-	  (vertically ()
-	    (if *with-scrollbars*
-		(scrolling ()
-		  extended-pane)
-		extended-pane)
-	    info-pane)))
+      (vertically ()
+	(if *with-scrollbars*
+	    (scrolling ()
+	      extended-pane)
+	    extended-pane)
+	info-pane)))
    (minibuffer (make-pane 'climacs-minibuffer-pane :width 900)))
   (:layouts
    (default
        (vertically (:scroll-bars nil)
-	 window
+	 climacs-window
 	 minibuffer)))
   (:top-level (esa-top-level)))
 
@@ -93,7 +148,9 @@
 
 (defmethod redisplay-frame-panes :around ((frame climacs) &rest args)
   (declare (ignore args))
-  (let ((buffers (remove-duplicates (mapcar #'buffer (windows frame)))))
+  (let ((buffers (remove-duplicates (loop for pane in (windows frame)
+					  when (typep pane 'extended-pane)
+					    collect (buffer pane)))))
     (loop for buffer in buffers
 	  do (update-syntax buffer (syntax buffer)))
     (call-next-method)
@@ -116,52 +173,56 @@
 	 (buffer (buffer master-pane))
 	 (size (size buffer))
 	 (top (top master-pane))
-	 (bot (bot master-pane))
-	 (name-info (format nil "~3T~A~
-                                 ~3 at T~A~
-                                 ~:[~30T~A~;~*~]~
-                                 ~3 at T~:[(~;Syntax: ~]~
-                                 ~A~
-                                 ~{~:[~*~; ~A~]~}~
-                                 ~:[)~;~]~
-                                 ~3 at T~A"
-			    (cond ((and (needs-saving buffer)
-					(read-only-p buffer)
-					"%*"))
-				  ((needs-saving buffer) "**")
-				  ((read-only-p buffer) "%%")
-				  (t "--"))
-			    (name buffer)
-			    *with-scrollbars*
-			    (cond ((and (mark= size bot)
-					(mark= 0 top))
-				   "")
-				  ((mark= size bot)
-				   "Bot")
-				  ((mark= 0 top)
-				   "Top")
-				  (t (format nil "~a%"
-					     (round (* 100 (/ (offset top)
-							      size))))))
-			    *with-scrollbars*
-			    (name (syntax buffer))
-			    (list
-			     (slot-value master-pane 'overwrite-mode)
-			     "Ovwrt"
-			     (auto-fill-mode master-pane)
-			     "Fill"
-			     (isearch-mode master-pane)
-			     "Isearch")
-			    *with-scrollbars*
-			    (if (recordingp *application-frame*)
-				"Def"
-				""))))
-    (princ name-info pane)))
-
-(defun display-window (frame pane)
-  "The display function used by the climacs application frame."
-  (declare (ignore frame))
-  (redisplay-pane pane (eq pane (current-window))))
+	 (bot (bot master-pane)))
+    (formatting-table (pane)
+      (formatting-row (pane)
+	(formatting-cell (pane :align-x :right :min-width '(5 :character))
+	  (princ (cond ((and (needs-saving buffer)
+			     (read-only-p buffer)
+			     "%*"))
+		       ((needs-saving buffer) "**")
+		       ((read-only-p buffer) "%%")
+		       (t "--"))
+		 pane))
+	(formatting-cell (pane :min-width '(25 :character))
+	  (princ "  " pane)
+	  (with-text-face (pane :bold)
+	    (princ (name buffer) pane)))
+	(formatting-cell (pane :min-width '(5 :character))
+	  (princ (cond ((and (mark= size bot)
+			     (mark= 0 top))
+			"")
+		       ((mark= size bot)
+			"Bot")
+		       ((mark= 0 top)
+			"Top")
+		       (t (format nil "~a%"
+				  (round (* 100 (/ (offset top)
+						   size))))))
+		 pane))
+	(formatting-cell (pane)
+	  (with-text-family (pane :sans-serif)
+	    (princ #\( pane)
+	    (princ (name-for-info-pane (syntax buffer)) pane)
+	    (format pane "~{~:[~*~; ~A~]~}" (list
+					 (slot-value master-pane 'overwrite-mode)
+					 "Ovwrt"
+					 (auto-fill-mode master-pane)
+					 "Fill"
+					 (isearch-mode master-pane)
+					 "Isearch"))
+	    (princ #\) pane)))
+	(formatting-cell (pane)
+	  (with-text-family (pane :sans-serif)
+	    (princ (if (recordingp *application-frame*)
+		       "Def"
+		       "")
+		   pane))))))
+
+  (defun display-window (frame pane)
+    "The display function used by the climacs application frame."
+    (declare (ignore frame))
+    (redisplay-pane pane (eq pane (current-window)))))
 
 (defmethod handle-repaint :before ((pane extended-pane) region)
   (declare (ignore region))
@@ -171,8 +232,10 @@
 
 (defmethod execute-frame-command :around ((frame climacs) command)
   (handler-case
-      (with-undo ((buffer (current-window)))
-	(call-next-method))
+      (if (typep (current-window) 'extended-pane)
+	  (with-undo ((buffer (current-window)))
+	    (call-next-method))
+	  (call-next-method))
     (offset-before-beginning ()
       (beep) (display-message "Beginning of buffer"))
     (offset-after-end ()
@@ -193,29 +256,27 @@
 	do (when (modified-p buffer)
 	     (setf (needs-saving buffer) t))))	
 
-(defmacro define-named-command (command-name args &body body)
-  `(define-command ,(if (listp command-name)
-			`(, at command-name :name t :command-table global-climacs-table)
-			`(,command-name :name t :command-table global-climacs-table))
-       ,args , at body))
-
-(define-named-command com-toggle-overwrite-mode ()
+(define-command (com-overwrite-mode :name t :command-table editing-table) ()
   (with-slots (overwrite-mode) (current-window)
     (setf overwrite-mode (not overwrite-mode))))
 
-(set-key 'com-toggle-overwrite-mode 'global-climacs-table
+(set-key 'com-overwrite-mode
+	 'editing-table
 	 '((:insert)))
 
-(define-named-command com-not-modified ()
+(define-command (com-not-modified :name t :command-table buffer-table) ()
   (setf (needs-saving (buffer (current-window))) nil))
 
-(set-key 'com-not-modified 'global-climacs-table
+(set-key 'com-not-modified
+	 'buffer-table
 	 '((#\~ :meta :shift)))
 
-(define-named-command com-set-fill-column ((column 'integer :prompt "Column Number:"))
+(define-command (com-set-fill-column :name t :command-table fill-table)
+    ((column 'integer :prompt "Column Number:"))
   (set-fill-column column))
 
-(set-key `(com-set-fill-column ,*numeric-argument-marker*) 'global-climacs-table
+(set-key `(com-set-fill-column ,*numeric-argument-marker*)
+	 'fill-table
 	 '((#\x :control) (#\f)))
 
 (defun set-fill-column (column)
@@ -256,26 +317,31 @@
 (define-command com-self-insert ((count 'integer))
   (loop repeat count do (insert-character *current-gesture*)))
 
-(define-named-command com-beginning-of-line ()
+(define-command (com-beginning-of-line :name t :command-table movement-table) ()
   (beginning-of-line (point (current-window))))
 
-(set-key 'com-beginning-of-line 'global-climacs-table
+(set-key 'com-beginning-of-line
+	 'movement-table
 	 '((:home)))
 
-(set-key 'com-beginning-of-line 'global-climacs-table
+(set-key 'com-beginning-of-line
+	 'movement-table
 	 '((#\a :control)))
 
-(define-named-command com-end-of-line ()
+(define-command (com-end-of-line :name t :command-table movement-table) ()
   (end-of-line (point (current-window))))
 
-(set-key 'com-end-of-line 'global-climacs-table
+(set-key 'com-end-of-line
+	 'movement-table
 	 '((#\e :control)))
 
-(set-key 'com-end-of-line 'global-climacs-table
+(set-key 'com-end-of-line
+	 'movement-table
 	 '((:end)))
 
-(define-named-command com-delete-object ((count 'integer :prompt "Number of Objects")
-					 (killp 'boolean :prompt "Kill?"))
+(define-command (com-delete-object :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of Objects")
+     (killp 'boolean :prompt "Kill?"))
   (let* ((point (point (current-window)))
 	 (mark (clone-mark point)))
     (forward-object mark count)
@@ -286,16 +352,17 @@
 
 (set-key `(com-delete-object ,*numeric-argument-marker*
 			     ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'deletion-table
 	 '(#\Rubout))
 
 (set-key `(com-delete-object ,*numeric-argument-marker*
 			     ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\d :control)))
 
-(define-named-command com-backward-delete-object ((count 'integer :prompt "Number of Objects")
-						  (killp 'boolean :prompt "Kill?"))
+(define-command (com-backward-delete-object :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of Objects")
+     (killp 'boolean :prompt "Kill?"))
   (let* ((point (point (current-window)))
 	 (mark (clone-mark point)))
     (backward-object mark count)
@@ -306,10 +373,10 @@
 
 (set-key `(com-backward-delete-object ,*numeric-argument-marker*
 				      ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'deletion-table
 	 '(#\Backspace))
 
-(define-named-command com-zap-to-object ()
+(define-command (com-zap-to-object :name t :command-table deletion-table) ()
   (let* ((item (handler-case (accept 't :prompt "Zap to Object")
 		(error () (progn (beep)
 				 (display-message "Not a valid object")
@@ -320,7 +387,7 @@
     (search-forward item-mark (vector item))
     (delete-range current-point (- (offset item-mark) current-offset))))
 
-(define-named-command com-zap-to-character ()
+(define-command (com-zap-to-character :name t :command-table deletion-table) ()
   (let* ((item-string (handler-case (accept 'string :prompt "Zap to Character") ; Figure out how to get #\d and d.  (or 'string 'character)?
 		(error () (progn (beep)
 				 (display-message "Not a valid string. ")
@@ -335,7 +402,8 @@
   (search-forward item-mark item)
   (delete-range current-point (- (offset item-mark) current-offset))))
 
-(set-key 'com-zap-to-character 'global-climacs-table
+(set-key 'com-zap-to-character
+	 'deletion-table
 	 '((#\z :meta)))
 
 (defun transpose-objects (mark)
@@ -348,32 +416,35 @@
       (insert-object mark object)
       (forward-object mark))))
 
-(define-named-command com-transpose-objects ()
+(define-command (com-transpose-objects :name t :command-table editing-table) ()
   (transpose-objects (point (current-window))))
 
-(set-key 'com-transpose-objects 'global-climacs-table
+(set-key 'com-transpose-objects
+	 'editing-table
 	 '((#\t :control)))
 
-(define-named-command com-backward-object ((count 'integer :prompt "Number of Objects"))
+(define-command (com-backward-object :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of Objects"))
   (backward-object (point (current-window)) count))
 
 (set-key `(com-backward-object ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\b :control)))
 
 (set-key `(com-backward-object ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((:left)))
 
-(define-named-command com-forward-object ((count 'integer :prompt "Number of Objects"))
+(define-command (com-forward-object :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of Objects"))
   (forward-object (point (current-window)) count))
 
 (set-key `(com-forward-object ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\f :control)))
 
 (set-key `(com-forward-object ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((:right)))
 
 (defun transpose-words (mark)
@@ -399,10 +470,11 @@
       (insert-sequence mark w2)
       (forward-word mark))))
 
-(define-named-command com-transpose-words ()
+(define-command (com-transpose-words :name t :command-table editing-table) ()
   (transpose-words (point (current-window))))
 
-(set-key 'com-transpose-words 'global-climacs-table
+(set-key 'com-transpose-words
+	 'editing-table
 	 '((#\t :meta)))
 
 (defun transpose-lines (mark)
@@ -427,13 +499,15 @@
     (insert-sequence mark line)
     (insert-object mark #\Newline)))
 
-(define-named-command com-transpose-lines ()
+(define-command (com-transpose-lines :name t :command-table editing-table) ()
   (transpose-lines (point (current-window))))
 
-(set-key 'com-transpose-lines 'global-climacs-table
+(set-key 'com-transpose-lines
+	 'editing-table
 	 '((#\x :control) (#\t :control)))
 
-(define-named-command com-previous-line ((numarg 'integer :prompt "How many lines?"))
+(define-command (com-previous-line :name t :command-table movement-table)
+    ((numarg 'integer :prompt "How many lines?"))
   (let* ((window (current-window))
 	 (point (point window)))
     (unless (or (eq (previous-command window) 'com-previous-line)
@@ -444,14 +518,15 @@
 	(next-line point (slot-value window 'goal-column) (- numarg)))))
 
 (set-key `(com-previous-line ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\p :control)))
 
 (set-key `(com-previous-line ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((:up)))
 
-(define-named-command com-next-line ((numarg 'integer :prompt "How many lines?"))
+(define-command (com-next-line :name t :command-table movement-table)
+    ((numarg 'integer :prompt "How many lines?"))
   (let* ((window (current-window))
 	 (point (point window)))
     (unless (or (eq (previous-command window) 'com-previous-line)
@@ -462,18 +537,19 @@
 	(previous-line point (slot-value window 'goal-column) (- numarg)))))
 
 (set-key `(com-next-line ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\n :control)))
 
 (set-key `(com-next-line ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((:down)))
 
-(define-named-command com-open-line ((numarg 'integer :prompt "How many lines?"))
+(define-command (com-open-line :name t :command-table editing-table)
+    ((numarg 'integer :prompt "How many lines?"))
   (open-line (point (current-window)) numarg))
 
 (set-key `(com-open-line ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'editing-table
 	 '((#\o :control)))
 
 (defun kill-line (mark &optional (count 1) (whole-lines-p nil) (concatenate-p nil))
@@ -504,42 +580,45 @@
 				   (region-to-sequence start mark)))
       (delete-region start mark))))
 
-(define-named-command com-kill-line ((numarg 'integer :prompt "Kill how many lines?")
-				     (numargp 'boolean :prompt "Kill entire lines?"))
+(define-command (com-kill-line :name t :command-table deletion-table)
+    ((numarg 'integer :prompt "Kill how many lines?")
+     (numargp 'boolean :prompt "Kill entire lines?"))
   (let* ((pane (current-window))
 	 (point (point pane))
          (concatenate-p (eq (previous-command pane) 'com-kill-line)))
     (kill-line point numarg numargp concatenate-p)))	   
 
 (set-key `(com-kill-line ,*numeric-argument-marker* ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\k :control)))
 
-(define-named-command com-forward-word ((count 'integer :prompt "Number of words"))
+(define-command (com-forward-word :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of words"))
   (if (plusp count)
       (forward-word (point (current-window)) count)
       (backward-word (point (current-window)) (- count))))
 
 (set-key `(com-forward-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\f :meta)))
 
 (set-key `(com-forward-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((:right :control)))
 
-(define-named-command com-backward-word ((count 'integer :prompt "Number of words"))
+(define-command (com-backward-word :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of words"))
   (backward-word (point (current-window)) count))
 
 (set-key `(com-backward-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\b :meta)))
 
 (set-key `(com-backward-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((:left :control)))
 
-(define-named-command com-delete-word ((count 'integer :prompt "Number of words"))
+(define-command (com-delete-word :name t :command-table deletion-table) ((count 'integer :prompt "Number of words"))
   (delete-word (point (current-window)) count))
 
 (defun kill-word (mark &optional (count 1) (concatenate-p nil))
@@ -562,27 +641,30 @@
 				   (region-to-sequence start mark)))
       (delete-region start mark))))
 
-(define-named-command com-kill-word ((count 'integer :prompt "Number of words"))
+(define-command (com-kill-word :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of words"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (concatenate-p (eq (previous-command pane) 'com-kill-word)))
     (kill-word point count concatenate-p)))
 
 (set-key `(com-kill-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\d :meta)))
 
-(define-named-command com-backward-kill-word ((count 'integer :prompt "Number of words"))
+(define-command (com-backward-kill-word :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of words"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (concatenate-p (eq (previous-command pane) 'com-backward-kill-word)))
     (kill-word point (- count) concatenate-p)))
 
 (set-key `(com-backward-kill-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\Backspace :meta)))
 
-(define-named-command com-mark-word ((count 'integer :prompt "Number of words"))
+(define-command (com-mark-word :name t :command-table marking-table)
+    ((count 'integer :prompt "Number of words"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (mark pane)))
@@ -593,48 +675,52 @@
 	(backward-word mark (- count)))))
 
 (set-key `(com-mark-word ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'marking-table
 	 '((#\@ :meta :shift)))
 
-(define-named-command com-backward-delete-word ((count 'integer :prompt "Number of words"))
+(define-command (com-backward-delete-word :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of words"))
   (backward-delete-word (point (current-window)) count))
 
-(define-named-command com-upcase-region ()
+(define-command (com-upcase-region :name t :command-table case-table) ()
   (let ((cw (current-window)))
     (upcase-region (mark cw) (point cw))))
 
-(define-named-command com-downcase-region ()
+(define-command (com-downcase-region :name t :command-table case-table) ()
   (let ((cw (current-window)))
     (downcase-region (mark cw) (point cw))))
 
-(define-named-command com-capitalize-region ()
+(define-command (com-capitalize-region :name t :command-table case-table) ()
   (let ((cw (current-window)))
     (capitalize-region (mark cw) (point cw))))
 
-(define-named-command com-upcase-word ()
+(define-command (com-upcase-word :name t :command-table case-table) ()
   (upcase-word (point (current-window))))
 
-(set-key 'com-upcase-word 'global-climacs-table
+(set-key 'com-upcase-word
+	 'case-table
 	 '((#\u :meta)))
 
-(define-named-command com-downcase-word ()
+(define-command (com-downcase-word :name t :command-table case-table) ()
   (downcase-word (point (current-window))))
 
-(set-key 'com-downcase-word 'global-climacs-table
+(set-key 'com-downcase-word
+	 'case-table
 	 '((#\l :meta)))
 
-(define-named-command com-capitalize-word ()
+(define-command (com-capitalize-word :name t :command-table case-table) ()
   (capitalize-word (point (current-window))))
 
-(set-key 'com-capitalize-word 'global-climacs-table
+(set-key 'com-capitalize-word
+	 'case-table
 	 '((#\c :meta)))
 
-(define-named-command com-tabify-region ()
+(define-command (com-tabify-region :name t :command-table editing-table) ()
   (let ((pane (current-window)))
     (tabify-region
      (mark pane) (point pane) (tab-space-count (stream-default-view pane)))))
 
-(define-named-command com-untabify-region ()
+(define-command (com-untabify-region :name t :command-table editing-table) ()
   (let ((pane (current-window)))
     (untabify-region
      (mark pane) (point pane) (tab-space-count (stream-default-view pane)))))
@@ -649,37 +735,41 @@
     (indent-line point indentation (and (indent-tabs-mode buffer)
                                         tab-space-count))))
 
-(define-named-command com-indent-line ()
+(define-command (com-indent-line :name t :command-table indent-table) ()
   (let* ((pane (current-window))
          (point (point pane)))
     (indent-current-line pane point)))
 
-(set-key 'com-indent-line 'global-climacs-table
+(set-key 'com-indent-line
+	 'indent-table
 	 '((#\Tab)))
 
-(set-key 'com-indent-line 'global-climacs-table
+(set-key 'com-indent-line
+	 'indent-table
 	 '((#\i :control)))
 
-(define-named-command com-newline-and-indent ()
+(define-command (com-newline-and-indent :name t :command-table indent-table) ()
   (let* ((pane (current-window))
 	 (point (point pane)))
     (insert-object point #\Newline)
     (indent-current-line pane point)))
 
-(set-key 'com-newline-and-indent 'global-climacs-table
+(set-key 'com-newline-and-indent
+	 'indent-table
 	 '((#\j :control)))
 
-(define-named-command com-delete-indentation ()
+(define-command (com-delete-indentation :name t :command-table indent-table) ()
   (delete-indentation (point (current-window))))
 
-(set-key 'com-delete-indentation 'global-climacs-table
+(set-key 'com-delete-indentation
+	 'indent-table
 	 '((#\^ :shift :meta)))
 
-(define-named-command com-auto-fill-mode ()
+(define-command (com-auto-fill-mode :name t :command-table fill-table) ()
   (let ((pane (current-window)))
     (setf (auto-fill-mode pane) (not (auto-fill-mode pane)))))
 
-(define-named-command com-fill-paragraph ()
+(define-command (com-fill-paragraph :name t :command-table fill-table) ()
   (let* ((pane (current-window))
          (buffer (buffer pane))
          (syntax (syntax buffer))
@@ -699,7 +789,8 @@
       (possibly-fill-line)
       (setf (offset point) (offset point-backup)))))
 
-(set-key 'com-fill-paragraph 'global-climacs-table
+(set-key 'com-fill-paragraph
+	 'fill-table
 	 '((#\q :meta)))
 
 (defun filename-completer (so-far mode)
@@ -849,11 +940,12 @@
 		 (redisplay-frame-panes *application-frame*)
 		 buffer))))))
 
-(define-named-command com-find-file ()
+(define-command (com-find-file :name t :command-table buffer-table) ()
   (let* ((filepath (accept 'pathname :prompt "Find File")))
     (find-file filepath)))
 
-(set-key 'com-find-file 'global-climacs-table
+(set-key 'com-find-file
+	 'buffer-table
 	 '((#\x :control) (#\f :control)))
 
 (defun find-file-read-only (filepath)
@@ -892,18 +984,20 @@
 		     (beep)
 		     nil)))))))
 
-(define-named-command com-find-file-read-only ()
+(define-command (com-find-file-read-only :name t :command-table buffer-table) ()
   (let ((filepath (accept 'pathname :Prompt "Find file read only")))
     (find-file-read-only filepath)))
 
-(set-key 'com-find-file-read-only 'global-climacs-table
+(set-key 'com-find-file-read-only
+	 'buffer-table
 	 '((#\x :control) (#\r :control)))
 
-(define-named-command com-toggle-read-only ()
+(define-command (com-read-only :name t :command-table buffer-table) ()
   (let ((buffer (buffer (current-window))))
     (setf (read-only-p buffer) (not (read-only-p buffer)))))
 
-(set-key 'com-toggle-read-only 'global-climacs-table
+(set-key 'com-read-only
+	 'buffer-table
 	 '((#\x :control) (#\q :control)))
 
 (defun set-visited-file-name (filename buffer)
@@ -911,11 +1005,11 @@
 	(name buffer) (filepath-filename filename)
 	(needs-saving buffer) t))
 
-(define-named-command com-set-visited-file-name ()
+(define-command (com-set-visited-file-name :name t :command-table buffer-table) ()
   (let ((filename (accept 'pathname :prompt "New file name")))
     (set-visited-file-name filename (buffer (current-window)))))
 
-(define-named-command com-insert-file ()
+(define-command (com-insert-file :name t :command-table buffer-table) ()
   (let ((filename (accept 'pathname :prompt "Insert File"))
 	(pane (current-window)))
     (when (probe-file filename)
@@ -928,7 +1022,8 @@
 	     (offset (point pane)) (offset (mark pane))))
     (redisplay-frame-panes *application-frame*)))
 
-(set-key 'com-insert-file 'global-climacs-table
+(set-key 'com-insert-file
+	 'buffer-table
 	 '((#\x :control) (#\i :control)))
 
 (defgeneric erase-buffer (buffer))
@@ -945,7 +1040,7 @@
     (end-of-buffer point)
     (delete-region mark point)))
 
-(define-named-command com-revert-buffer ()
+(define-command (com-revert-buffer :name t :command-table buffer-table) ()
   (let* ((pane (current-window))
 	 (buffer (buffer pane))
 	 (filepath (filepath buffer))
@@ -985,14 +1080,15 @@
        (display-message "Wrote: ~a" (filepath buffer))
        (setf (needs-saving buffer) nil)))))
 
-(define-named-command com-save-buffer ()
+(define-command (com-save-buffer :name t :command-table buffer-table) ()
   (let ((buffer (buffer (current-window))))
     (if (or (null (filepath buffer))
 	    (needs-saving buffer))
 	(save-buffer buffer)
 	(display-message "No changes need to be saved from ~a" (name buffer)))))
 
-(set-key 'com-save-buffer 'global-climacs-table
+(set-key 'com-save-buffer
+	 'buffer-table
 	 '((#\x :control) (#\s :control)))
 
 (defmethod frame-exit :around ((frame climacs))
@@ -1013,7 +1109,7 @@
 			       (return-from frame-exit nil)))))
     (call-next-method)))
 
-(define-named-command com-write-buffer ()
+(define-command (com-write-buffer :name t :command-table buffer-table) ()
   (let ((filepath (accept 'pathname :prompt "Write Buffer to File"))
 	(buffer (buffer (current-window))))
     (cond
@@ -1027,7 +1123,8 @@
 	     (needs-saving buffer) nil)
        (display-message "Wrote: ~a" (filepath buffer))))))
 
-(set-key 'com-write-buffer 'global-climacs-table
+(set-key 'com-write-buffer
+	 'buffer-table
 	 '((#\x :control) (#\w :control)))
 
 (define-presentation-method present (object (type buffer)
@@ -1079,14 +1176,15 @@
 (defmethod switch-to-buffer ((symbol (eql 'nil)))
   (switch-to-buffer (second (buffers *application-frame*))))
 
-(define-named-command com-switch-to-buffer ()
+(define-command (com-switch-to-buffer :name t :command-table pane-table) ()
   (let ((buffer (accept 'buffer
 			:prompt "Switch to buffer"
 			:default (second (buffers *application-frame*))
 			:default-type 'buffer)))
     (switch-to-buffer buffer)))
 
-(set-key 'com-switch-to-buffer 'global-climacs-table
+(set-key 'com-switch-to-buffer
+	 'pane-table
 	 '((#\x :control) (#\b)))
 
 (defgeneric kill-buffer (buffer))
@@ -1113,20 +1211,22 @@
 (defmethod kill-buffer ((symbol (eql 'nil)))
   (kill-buffer (buffer (current-window))))
 
-(define-named-command com-kill-buffer ()
+(define-command (com-kill-buffer :name t :command-table pane-table) ()
   (let ((buffer (accept 'buffer
 			:prompt "Kill buffer"
 			:default (buffer (current-window))
 			:default-type 'buffer)))
     (kill-buffer buffer)))
 
-(set-key 'com-kill-buffer 'global-climacs-table
+(set-key 'com-kill-buffer
+	 'pane-table
 	 '((#\x :control) (#\k)))
 
-(define-named-command com-full-redisplay ()
+(define-command (com-full-redisplay :name t :command-table base-table) ()
   (full-redisplay (current-window)))
 
-(set-key 'com-full-redisplay 'global-climacs-table
+(set-key 'com-full-redisplay
+	 'base-table
 	 '((#\l :control)))
 
 (defun load-file (file-name)
@@ -1140,56 +1240,66 @@
 		(display-message "No such file: ~A" file-name)
 		(beep))))))
 
-(define-named-command com-load-file ()
+(define-command (com-load-file :name t :command-table base-table) ()
   (let ((filepath (accept 'pathname :prompt "Load File")))
     (load-file filepath)))
 
-(set-key 'com-load-file 'global-climacs-table
+(set-key 'com-load-file
+	 'base-table
 	 '((#\c :control) (#\l :control)))
 
-(define-named-command com-beginning-of-buffer ()
+(define-command (com-beginning-of-buffer :name t :command-table movement-table) ()
   (beginning-of-buffer (point (current-window))))
 
-(set-key 'com-beginning-of-buffer 'global-climacs-table
+(set-key 'com-beginning-of-buffer
+	 'movement-table
 	 '((#\< :shift :meta)))
 
-(set-key 'com-beginning-of-buffer 'global-climacs-table
+(set-key 'com-beginning-of-buffer
+	 'movement-table
 	 '((:home :control)))
 
-(define-named-command com-page-down ()
+(define-command (com-page-down :name t :command-table movement-table) ()
   (let ((pane (current-window)))
     (page-down pane)))
 
-(set-key 'com-page-down 'global-climacs-table
+(set-key 'com-page-down
+	 'movement-table
 	 '((#\v :control)))
 
-(set-key 'com-page-down 'global-climacs-table
+(set-key 'com-page-down
+	 'movement-table
 	 '((:next)))
 
-(define-named-command com-page-up ()
+(define-command (com-page-up :name t :command-table movement-table) ()
   (let ((pane (current-window)))
     (page-up pane)))
 
-(set-key 'com-page-up 'global-climacs-table
+(set-key 'com-page-up
+	 'movement-table
 	 '((#\v :meta)))
 
-(set-key 'com-page-up 'global-climacs-table
+(set-key 'com-page-up
+	 'movement-table
 	 '((:prior)))
 
-(define-named-command com-end-of-buffer ()
+(define-command (com-end-of-buffer :name t :command-table movement-table) ()
   (end-of-buffer (point (current-window))))
 
-(set-key 'com-end-of-buffer 'global-climacs-table
+(set-key 'com-end-of-buffer
+	 'movement-table
 	 '((#\> :shift :meta)))
 
-(set-key 'com-end-of-buffer 'global-climacs-table
+(set-key 'com-end-of-buffer
+	 'movement-table
 	 '((:end :control)))
 
-(define-named-command com-mark-whole-buffer ()
+(define-command (com-mark-whole-buffer :name t :command-table marking-table) ()
   (beginning-of-buffer (point (current-window)))
   (end-of-buffer (mark (current-window))))
 
-(set-key 'com-mark-whole-buffer 'global-climacs-table
+(set-key 'com-mark-whole-buffer
+	 'marking-table
 	 '((#\x :control) (#\h)))
 
 (defun back-to-indentation (mark)
@@ -1198,10 +1308,11 @@
 	while (whitespacep (object-after mark))
 	do (forward-object mark)))
 
-(define-named-command com-back-to-indentation ()
+(define-command (com-back-to-indentation :name t :command-table movement-table) ()
   (back-to-indentation (point (current-window))))
 
-(set-key 'com-back-to-indentation 'global-climacs-table
+(set-key 'com-back-to-indentation
+	 'movement-table
 	 '((#\m :meta)))
 
 (defun delete-horizontal-space (mark &optional (backward-only-p nil))
@@ -1215,12 +1326,13 @@
 	    do (forward-object mark2)))
     (delete-region mark mark2)))
 
-(define-named-command com-delete-horizontal-space ((backward-only-p
-						    'boolean :prompt "Delete backwards only?"))
+(define-command (com-delete-horizontal-space :name t :command-table deletion-table)
+    ((backward-only-p
+      'boolean :prompt "Delete backwards only?"))
   (delete-horizontal-space (point (current-window)) backward-only-p))
 
 (set-key `(com-delete-horizontal-space ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\\ :meta)))
 
 (defun just-one-space (mark count)
@@ -1237,17 +1349,18 @@
 	  do (forward-object mark))
     (delete-region offset mark)))
 
-(define-named-command com-just-one-space ((count 'integer :prompt "Number of spaces"))
+(define-command (com-just-one-space :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of spaces"))
   (just-one-space (point (current-window)) count))
 
 (set-key `(com-just-one-space ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\Space :meta)))
 
 (defun goto-position (mark pos)
   (setf (offset mark) pos))
 
-(define-named-command com-goto-position ()
+(define-command (com-goto-position :name t :command-table movement-table) ()
   (goto-position
    (point (current-window))
    (handler-case (accept 'integer :prompt "Goto Position")
@@ -1267,33 +1380,35 @@
 	finally (beginning-of-line m)
 		(setf (offset mark) (offset m))))
 
-(define-named-command com-goto-line ()
+(define-command (com-goto-line :name t :command-table movement-table) ()
   (goto-line (point (current-window))
 	     (handler-case (accept 'integer :prompt "Goto Line")
 		 (error () (progn (beep)
 				  (display-message "Not a valid line number")
 				  (return-from com-goto-line nil))))))
 
-(define-named-command com-browse-url ()
+(define-command (com-browse-url :name t :command-table base-table) ()
   (let ((url (accept 'url :prompt "Browse URL")))
     #+ (and sbcl darwin)
     (sb-ext:run-program "/usr/bin/open" `(,url) :wait nil)
     #+ (and openmcl darwin)
     (ccl:run-program "/usr/bin/open" `(,url) :wait nil)))
 
-(define-named-command com-set-mark ()
+(define-command (com-set-mark :name t :command-table marking-table) ()
   (let ((pane (current-window)))
     (setf (mark pane) (clone-mark (point pane)))))
 
-(set-key 'com-set-mark 'global-climacs-table
+(set-key 'com-set-mark
+	 'marking-table
 	 '((#\Space :control)))
 
-(define-named-command com-exchange-point-and-mark ()
+(define-command (com-exchange-point-and-mark :name t :command-table marking-table) ()
   (let ((pane (current-window)))
     (psetf (offset (mark pane)) (offset (point pane))
 	   (offset (point pane)) (offset (mark pane)))))
 
-(set-key 'com-exchange-point-and-mark 'global-climacs-table
+(set-key 'com-exchange-point-and-mark
+	 'marking-table
 	 '((#\x :control) (#\x :control)))
 
 (defgeneric set-syntax (buffer syntax))
@@ -1314,7 +1429,7 @@
 	   (beep)
 	   (display-message "No such syntax: ~A." syntax)))))
 
-(define-named-command com-set-syntax ()
+(define-command (com-set-syntax :name t :command-table buffer-table) ()
   (let* ((pane (current-window))
 	 (buffer (buffer pane)))
     (set-syntax buffer (accept 'syntax :prompt "Set Syntax"))))		
@@ -1334,9 +1449,9 @@
     (sheet-disown-child parent constellation)
     (let ((new (if vertical-p
 		   (vertically ()
-		     (1/2 constellation) adjust (1/2 additional-constellation))
+		     constellation adjust additional-constellation)
 		   (horizontally ()
-		     (1/2 constellation) adjust (1/2 additional-constellation)))))
+		     constellation adjust additional-constellation))))
       (sheet-adopt-child parent new)
       (reorder-sheets parent 
 		      (if (eq constellation first)
@@ -1347,16 +1462,56 @@
 			      (list first second new)
 			      (list first new)))))))
 
-(defun parent3 (sheet)
-  (sheet-parent (sheet-parent (sheet-parent sheet))))
+(defun find-parent (sheet)
+  (loop for parent = (sheet-parent sheet)
+	  then (sheet-parent parent)
+	until (typep parent 'vrack-pane)
+	finally (return parent)))
+
+(defclass typeout-pane (application-pane esa-pane-mixin) ())
+
+(defun make-typeout-constellation (&optional label)
+  (let* ((typeout-pane
+	  (make-pane 'typeout-pane :width 900 :height 400 :display-time nil))
+	 (label
+	  (make-pane 'label-pane :label label))
+	 (vbox
+	  (vertically ()
+	    (scrolling (:scroll-bar :vertical) typeout-pane) label)))
+    (values vbox typeout-pane)))
+
+(defun typeout-window (&optional (label "Typeout") (pane (current-window)))
+  (with-look-and-feel-realization
+      ((frame-manager *application-frame*) *application-frame*)
+    (multiple-value-bind (vbox new-pane) (make-typeout-constellation label)
+      (let* ((current-window pane)
+	     (constellation-root (find-parent current-window)))
+	(push new-pane (windows *application-frame*))
+	(other-window)
+	(replace-constellation constellation-root vbox t)
+	(full-redisplay current-window)
+	new-pane))))
 
-(defun make-pane-constellation ()
+(define-command (com-describe-bindings :name t :command-table help-table)
+    ((sort-by-keystrokes 'boolean :prompt "Sort by keystrokes?"))
+  (let* ((window (current-window))
+	 (buffer (buffer (current-window)))
+	 (stream (typeout-window
+		   (format nil "~10THelp: Describe Bindings for ~A" (name buffer))))
+	 (command-table (command-table window)))
+    (esa::describe-bindings stream command-table
+		       (if sort-by-keystrokes
+			   #'esa::sort-by-keystrokes
+			   #'esa::sort-by-name))))
+
+(set-key `(com-describe-bindings ,*numeric-argument-p*) 'help-table '((#\h :control) (#\b)))
+
+(defun make-pane-constellation (&optional (with-scrollbars *with-scrollbars*))
   "make a vbox containing a scroller pane as its first child and an
 info pane as its second child.  The scroller pane contains a viewport
 which contains an extended pane.  Return the vbox and the extended pane
 as two values.
-If *with-scrollbars* nil, omit the scroller."
-
+If with-scrollbars nil, omit the scroller."
   (let* ((extended-pane
 	  (make-pane 'extended-pane
 		     :width 900 :height 400
@@ -1367,7 +1522,7 @@
 		     :command-table 'global-climacs-table))
 	 (vbox
 	  (vertically ()
-	    (if *with-scrollbars*
+	    (if with-scrollbars
 		(scrolling ()
 		  extended-pane)
 		extended-pane)
@@ -1376,68 +1531,79 @@
 		       :width 900))))
     (values vbox extended-pane)))
 
-(defun split-window-vertically (&optional (pane (current-window)))
+(defun split-window (&optional (vertically-p nil) (pane (current-window)))
   (with-look-and-feel-realization
       ((frame-manager *application-frame*) *application-frame*)
     (multiple-value-bind (vbox new-pane) (make-pane-constellation)
       (let* ((current-window pane)
-	     (constellation-root (if *with-scrollbars*
-				     (parent3 current-window)
-				     (sheet-parent current-window))))
+	     (constellation-root (find-parent current-window)))
         (setf (offset (point (buffer current-window))) (offset (point current-window))
 	      (buffer new-pane) (buffer current-window)
               (auto-fill-mode new-pane) (auto-fill-mode current-window)
               (auto-fill-column new-pane) (auto-fill-column current-window))
 	(push new-pane (windows *application-frame*))
 	(setf *standard-output* new-pane)
-	(replace-constellation constellation-root vbox t)
+	(replace-constellation constellation-root vbox vertically-p)
 	(full-redisplay current-window)
 	(full-redisplay new-pane)
 	new-pane))))
 
-(define-named-command com-split-window-vertically ()
-  (split-window-vertically))
+(define-command (com-split-window-vertically :name t :command-table window-table) ()
+  (split-window t))
 
-(set-key 'com-split-window-vertically 'global-climacs-table
+(set-key 'com-split-window-vertically
+	 'window-table
 	 '((#\x :control) (#\2)))
 
-(defun split-window-horizontally (&optional (pane (current-window)))
-  (with-look-and-feel-realization
-      ((frame-manager *application-frame*) *application-frame*)
-    (multiple-value-bind (vbox new-pane) (make-pane-constellation)
-      (let* ((current-window pane)
-	     (constellation-root (if *with-scrollbars*
-				     (parent3 current-window)
-				     (sheet-parent current-window))))
-        (setf (offset (point (buffer current-window))) (offset (point current-window))
-	      (buffer new-pane) (buffer current-window)
-              (auto-fill-mode new-pane) (auto-fill-mode current-window)
-              (auto-fill-column new-pane) (auto-fill-column current-window))
-	(push new-pane (windows *application-frame*))
-	(setf *standard-output* new-pane)
-	(replace-constellation constellation-root vbox nil)
-	(full-redisplay current-window)
-	(full-redisplay new-pane)
-	new-pane))))
-
-(define-named-command com-split-window-horizontally ()
-  (split-window-horizontally))
+(define-command (com-split-window-horizontally :name t :command-table window-table) ()
+  (split-window))
 
-(set-key 'com-split-window-horizontally 'global-climacs-table
+(set-key 'com-split-window-horizontally
+	 'window-table
 	 '((#\x :control) (#\3)))
 
-(defun other-window ()
-  (setf (windows *application-frame*)
-	(append (cdr (windows *application-frame*))
-		(list (car (windows *application-frame*)))))
+(defun other-window (&optional pane)
+  (if (and pane (find pane (windows *application-frame*)))
+      (setf (windows *application-frame*)
+	    (append (list pane)
+		    (remove pane (windows *application-frame*))))
+      (setf (windows *application-frame*)
+	    (append (cdr (windows *application-frame*))
+		    (list (car (windows *application-frame*))))))
   (setf *standard-output* (car (windows *application-frame*))))
-
-(define-named-command com-other-window ()
+  
+(define-command (com-other-window :name t :command-table window-table) ()
   (other-window))
 
-(set-key 'com-other-window 'global-climacs-table
+(set-key 'com-other-window
+	 'window-table
 	 '((#\x :control) (#\o)))
 
+(define-command (com-switch-to-this-window :name nil :command-table window-table)
+    ((window 'pane) (x 'integer) (y 'integer))
+  (other-window window)
+  (with-slots (top bot) window
+     (let ((new-x (floor x (stream-character-width window #\m)))
+	   (new-y (floor y (stream-line-height window)))
+	   (buffer (buffer window)))
+       (loop for scan from (offset top)
+	     with lines = 0
+	     until (= scan (offset bot))
+	     until (= lines new-y)
+	     when (eql (buffer-object buffer scan) #\Newline)
+	       do (incf lines)
+	     finally (loop for columns from 0
+			   until (= scan (offset bot))
+			   until (eql (buffer-object buffer scan) #\Newline)
+			   until (= columns new-x)
+			   do (incf scan))
+		     (setf (offset (point window)) scan)))))
+
+(define-presentation-to-command-translator blank-area-to-switch-to-this-window
+    (blank-area com-switch-to-this-window window-table :echo nil)
+    (object window x y)
+  (list window x y))
+
 (defun single-window ()
   (loop until (null (cdr (windows *application-frame*)))
 	do (rotatef (car (windows *application-frame*))
@@ -1445,33 +1611,34 @@
 	   (com-delete-window))
   (setf *standard-output* (car (windows *application-frame*))))
 
-(define-named-command com-single-window ()
+(define-command (com-single-window :name t :command-table window-table) ()
   (single-window))
 
-(set-key 'com-single-window 'global-climacs-table
+(set-key 'com-single-window
+	 'window-table
 	 '((#\x :control) (#\1)))
 
-(define-named-command com-scroll-other-window ()
+(define-command (com-scroll-other-window :name t :command-table window-table) ()
   (let ((other-window (second (windows *application-frame*))))
     (when other-window
       (page-down other-window))))
 
-(set-key 'com-scroll-other-window 'global-climacs-table
+(set-key 'com-scroll-other-window
+	 'window-table
 	 '((#\v :control :meta)))
 
-(define-named-command com-scroll-other-window-up ()
+(define-command (com-scroll-other-window-up :name t :command-table window-table) ()
   (let ((other-window (second (windows *application-frame*))))
     (when other-window
       (page-up other-window))))
 
-(set-key 'com-scroll-other-window-up 'global-climacs-table
+(set-key 'com-scroll-other-window-up
+	 'window-table
 	 '((#\V :control :meta :shift)))
 
 (defun delete-window (&optional (window (current-window)))
   (unless (null (cdr (windows *application-frame*)))
-    (let* ((constellation (if *with-scrollbars*
-			      (parent3 window)
-			      (sheet-parent window)))
+    (let* ((constellation (find-parent window))
 	   (box (sheet-parent constellation))
 	   (box-children (sheet-children box))
 	   (other (if (eq constellation (first box-children))
@@ -1496,41 +1663,45 @@
 				     (list first second other)
 				     (list first other)))))))
 
-(define-named-command com-delete-window ()
+(define-command (com-delete-window :name t :command-table window-table) ()
   (delete-window))
 
-(set-key 'com-delete-window 'global-climacs-table
+(set-key 'com-delete-window
+	 'window-table
 	 '((#\x :control) (#\0)))
 
 ;;;;;;;;;;;;;;;;;;;;
 ;; Kill ring commands
 
 ;; Copies an element from a kill-ring to a buffer at the given offset
-(define-named-command com-yank ()
+(define-command (com-yank :name t :command-table editing-table) ()
   (insert-sequence (point (current-window)) (kill-ring-yank *kill-ring*)))
 
-(set-key 'com-yank 'global-climacs-table
+(set-key 'com-yank
+	 'editing-table
 	 '((#\y :control)))
 
 ;; Destructively cut a given buffer region into the kill-ring
-(define-named-command com-kill-region ()
+(define-command (com-kill-region :name t :command-table editing-table) ()
   (let ((pane (current-window)))
     (kill-ring-standard-push
      *kill-ring* (region-to-sequence (mark pane) (point pane)))
     (delete-region (mark pane) (point pane))))
 
-(set-key 'com-kill-region 'global-climacs-table
+(set-key 'com-kill-region
+	 'editing-table
 	 '((#\w :control)))
 
 ;; Non destructively copies buffer region to the kill ring
-(define-named-command com-copy-region ()
+(define-command (com-copy-region :name t :command-table marking-table) ()
   (let ((pane (current-window)))
     (kill-ring-standard-push *kill-ring* (region-to-sequence (point pane) (mark pane)))))
 
-(set-key 'com-copy-region 'global-climacs-table
+(set-key 'com-copy-region
+	 'marking-table
 	 '((#\w :meta)))
 
-(define-named-command com-rotate-yank ()
+(define-command (com-rotate-yank :name t :command-table editing-table) ()
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (last-yank (kill-ring-yank *kill-ring*)))
@@ -1541,20 +1712,22 @@
 	  (rotate-yank-position *kill-ring*)))
     (insert-sequence point (kill-ring-yank *kill-ring*))))
 
-(set-key 'com-rotate-yank 'global-climacs-table
+(set-key 'com-rotate-yank
+	 'editing-table
 	 '((#\y :meta)))
 
-(define-named-command com-resize-kill-ring ()
+(define-command (com-resize-kill-ring :name t :command-table editing-table) ()
   (let ((size (handler-case (accept 'integer :prompt "New kill ring size")
 		(error () (progn (beep)
 				 (display-message "Not a valid kill ring size")
 				 (return-from com-resize-kill-ring nil))))))
     (setf (kill-ring-max-size *kill-ring*) size)))
 
-(define-named-command com-append-next-kill ()
+(define-command (com-append-next-kill :name t :command-table editing-table) ()
   (setf (append-next-p *kill-ring*) t))
 
-(set-key 'com-append-next-kill 'global-climacs-table
+(set-key 'com-append-next-kill
+	 'editing-table
 	 '((#\w :control :meta)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1606,18 +1779,20 @@
       (unless success
         (beep)))))
 
-(define-named-command com-isearch-forward ()
+(define-command (com-isearch-forward :name t :command-table search-table) ()
   (display-message "Isearch: ")
   (isearch-command-loop (current-window) t))
 
-(set-key 'com-isearch-forward 'global-climacs-table
+(set-key 'com-isearch-forward
+	 'search-table
 	 '((#\s :control)))
 
-(define-named-command com-isearch-backward ()
+(define-command (com-isearch-backward :name t :command-table search-table) ()
   (display-message "Isearch backward: ")
   (isearch-command-loop (current-window) nil))
 
-(set-key 'com-isearch-backward 'global-climacs-table
+(set-key 'com-isearch-backward
+	 'search-table
 	 '((#\r :control)))
 
 (define-command (com-isearch-append-char :name t :command-table isearch-climacs-table) ()
@@ -1703,7 +1878,7 @@
       (search-forward mark string :test #'object-equal)
       (/= (offset mark) offset-before))))
 
-(define-named-command com-query-replace ()
+(define-command (com-query-replace :name t :command-table search-table) ()
   (let* ((pane (current-window))
 	 (old-state (query-replace-state pane))
 	 (old-string1 (when old-state (string1 old-state)))
@@ -1745,7 +1920,8 @@
 			   ((setf (query-replace-mode pane) nil))))
     (display-message "Replaced ~A occurrence~:P" occurrences)))
 
-(set-key 'com-query-replace 'global-climacs-table
+(set-key 'com-query-replace
+	 'search-table
 	 '((#\% :shift :meta)))
 
 (define-command (com-query-replace-replace :name t :command-table query-replace-climacs-table) ()
@@ -1800,33 +1976,37 @@
 ;;; 
 ;;; Undo/redo
 
-(define-named-command com-undo ()
+(define-command (com-undo :name t :command-table editing-table) ()
   (handler-case (undo (undo-tree (buffer (current-window))))
     (no-more-undo () (beep) (display-message "No more undo")))
   (full-redisplay (current-window)))
 
-(set-key 'com-undo 'global-climacs-table
+(set-key 'com-undo
+	 'editing-table
 	 '((#\_ :shift :control)))
 
-(set-key 'com-undo 'global-climacs-table
+(set-key 'com-undo
+	 'editing-table
 	 '((#\x :control) (#\u)))
 
-(define-named-command com-redo ()
+(define-command (com-redo :name t :command-table editing-table) ()
   (handler-case (redo (undo-tree (buffer (current-window))))
     (no-more-undo () (beep) (display-message "No more redo")))
   (full-redisplay (current-window)))
 
-(set-key 'com-redo 'global-climacs-table
+(set-key 'com-redo
+	 'editing-table
 	 '((#\_ :shift :meta)))
 
-(set-key 'com-redo 'global-climacs-table
+(set-key 'com-redo
+	 'editing-table
 	 '((#\x :control) (#\r :control)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; 
 ;;; Dynamic abbrevs
 
-(define-named-command com-dabbrev-expand ()
+(define-command (com-dabbrev-expand :name t :command-table editing-table) ()
   (let* ((window (current-window))
 	 (point (point window)))
     (with-slots (original-prefix prefix-start-offset dabbrev-expansion-mark) window
@@ -1863,10 +2043,12 @@
 						(setf (offset dabbrev-expansion-mark) offset))))
 		      (move))))))))
 
-(set-key 'com-dabbrev-expand 'global-climacs-table
+(set-key 'com-dabbrev-expand
+	 'editing-table
 	 '((#\/ :meta)))
 
-(define-named-command com-backward-paragraph ((count 'integer :prompt "Number of paragraphs"))
+(define-command (com-backward-paragraph :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of paragraphs"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -1875,10 +2057,11 @@
 	(loop repeat (- count) do (forward-paragraph point syntax)))))
 
 (set-key `(com-backward-paragraph ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\{ :shift :meta)))
 
-(define-named-command com-forward-paragraph ((count 'integer :prompt "Number of paragraphs"))
+(define-command (com-forward-paragraph :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of paragraphs"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -1887,10 +2070,11 @@
 	(loop repeat (- count) do (backward-paragraph point syntax)))))
 
 (set-key `(com-forward-paragraph ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\} :shift :meta)))
 
-(define-named-command com-mark-paragraph ((count 'integer :prompt "Number of paragraphs"))
+(define-command (com-mark-paragraph :name t :command-table marking-table)
+    ((count 'integer :prompt "Number of paragraphs"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (mark pane))
@@ -1905,10 +2089,11 @@
 	(loop repeat (- count) do (backward-paragraph mark syntax)))))
 
 (set-key `(com-mark-paragraph ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'marking-table
 	 '((#\h :meta)))
 
-(define-named-command com-backward-sentence ((count 'integer :prompt "Number of sentences"))
+(define-command (com-backward-sentence :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of sentences"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -1917,10 +2102,11 @@
 	(loop repeat (- count) do (forward-sentence point syntax)))))
 
 (set-key `(com-backward-sentence ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\a :meta)))
 
-(define-named-command com-forward-sentence ((count 'integer :prompt "Number of sentences"))
+(define-command (com-forward-sentence :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of sentences"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -1929,10 +2115,11 @@
 	(loop repeat (- count) do (backward-sentence point syntax)))))
 
 (set-key `(com-forward-sentence ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\e :meta)))
 
-(define-named-command com-kill-sentence ((count 'integer :prompt "Number of sentences"))
+(define-command (com-kill-sentence :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of sentences"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (clone-mark point))
@@ -1944,10 +2131,11 @@
     (delete-region point mark)))
 
 (set-key `(com-kill-sentence ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\k :meta)))
 
-(define-named-command com-backward-kill-sentence ((count 'integer :prompt "Number of sentences"))
+(define-command (com-backward-kill-sentence :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of sentences"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (clone-mark point))
@@ -1959,7 +2147,7 @@
     (delete-region point mark)))
 
 (set-key `(com-backward-kill-sentence ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\x :control) (#\Backspace)))
 
 (defun forward-page (mark &optional (count 1))
@@ -1968,7 +2156,8 @@
 	  do (end-of-buffer mark)
 	     (loop-finish)))
 
-(define-named-command com-forward-page ((count 'integer :prompt "Number of pages"))
+(define-command (com-forward-page :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of pages"))
   (let* ((pane (current-window))
 	 (point (point pane)))
     (if (plusp count)
@@ -1976,7 +2165,7 @@
 	(backward-page point count))))
 
 (set-key `(com-forward-page ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\x :control) (#\])))
 
 (defun backward-page (mark &optional (count 1))
@@ -1986,18 +2175,21 @@
 	  else do (beginning-of-buffer mark)
 		  (loop-finish)))
 
-(define-named-command com-backward-page ((count 'integer :prompt "Number of pages"))
+(define-command (com-backward-page :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of pages"))
   (let* ((pane (current-window))
 	 (point (point pane)))
     (if (plusp count)
 	(backward-page point count)
 	(forward-page point count))))
 
-(set-key `(com-backward-page ,*numeric-argument-marker*) 'global-climacs-table
+(set-key `(com-backward-page ,*numeric-argument-marker*)
+	 'movement-table
 	 '((#\x :control) (#\[)))
 
-(define-named-command com-mark-page ((count 'integer :prompt "Move how many pages")
-				     (numargp 'boolean :prompt "Move to another page?"))
+(define-command (com-mark-page :name t :command-table marking-table)
+    ((count 'integer :prompt "Move how many pages")
+     (numargp 'boolean :prompt "Move to another page?"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (mark pane)))
@@ -2010,10 +2202,10 @@
 	   (forward-page mark 1)))
 
 (set-key `(com-mark-page ,*numeric-argument-marker* ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'marking-table
 	 '((#\x :control) (#\p :control)))
 
-(define-named-command com-count-lines-page ()
+(define-command (com-count-lines-page :name t :command-table info-table) ()
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (start (clone-mark point))
@@ -2025,10 +2217,11 @@
 	  (after (number-of-lines-in-region point end)))
       (display-message "Page has ~A lines (~A + ~A)" total before after))))
 
-(set-key 'com-count-lines-page 'global-climacs-table
+(set-key 'com-count-lines-page
+	 'info-table
 	 '((#\x :control) (#\l)))
 
-(define-named-command com-count-lines-region ()
+(define-command (com-count-lines-region :name t :command-table info-table) ()
   (let*  ((pane (current-window))
 	  (point (point pane))
 	  (mark (mark pane))
@@ -2036,10 +2229,11 @@
 	  (chars (abs (- (offset point) (offset mark)))))
     (display-message "Region has ~D line~:P, ~D character~:P." lines chars)))
 
-(set-key 'com-count-lines-region 'global-climacs-table
+(set-key 'com-count-lines-region
+	 'info-table
 	 '((#\= :meta)))
 
-(define-named-command com-what-cursor-position ()
+(define-command (com-what-cursor-position :name t :command-table info-table) ()
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (buffer (buffer pane))
@@ -2051,10 +2245,12 @@
 		     char (char-code char) offset size
 		     (round (* 100 (/ offset size))) column)))
 
-(set-key 'com-what-cursor-position 'global-climacs-table
+(set-key 'com-what-cursor-position
+	 'info-table
 	 '((#\x :control) (#\=)))
 
-(define-named-command com-eval-expression ((insertp 'boolean :prompt "Insert?"))
+(define-command (com-eval-expression :name t :command-table base-table)
+    ((insertp 'boolean :prompt "Insert?"))
   (let* ((*package* (find-package :climacs-gui))
 	 (string (handler-case (accept 'string :prompt "Eval")
 		   (error () (progn (beep)
@@ -2071,7 +2267,7 @@
 	(display-message result))))
 
 (set-key `(com-eval-expression ,*numeric-argument-p*)
-	 'global-climacs-table
+	 'base-table
 	 '((#\: :shift :meta)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2079,14 +2275,15 @@
 ;;; Commenting
 
 ;;; figure out how to make commands without key bindings accept numeric arguments. 
-(define-named-command com-comment-region ()
+(define-command (com-comment-region :name t :command-table comment-table) ()
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (mark pane))
 	 (syntax (syntax (buffer pane))))
     (comment-region syntax point mark)))
 
-(define-named-command com-backward-expression ((count 'integer :prompt "Number of expressions"))
+(define-command (com-backward-expression :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of expressions"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2095,10 +2292,11 @@
 	(loop repeat (- count) do (forward-expression point syntax)))))
 
 (set-key `(com-backward-expression ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\b :control :meta)))
 
-(define-named-command com-forward-expression ((count 'integer :prompt "Number of expresssions"))
+(define-command (com-forward-expression :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of expresssions"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2107,10 +2305,11 @@
 	(loop repeat (- count) do (backward-expression point syntax)))))
 
 (set-key `(com-forward-expression ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\f :control :meta)))
 
-(define-named-command com-mark-expression ((count 'integer :prompt "Number of expressions"))
+(define-command (com-mark-expression :name t :command-table marking-table)
+    ((count 'integer :prompt "Number of expressions"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (mark pane))
@@ -2122,10 +2321,11 @@
 	(loop repeat (- count) do (backward-expression mark syntax)))))
 
 (set-key `(com-mark-expression ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'marking-table
 	 '((#\@ :shift :control :meta)))
 
-(define-named-command com-kill-expression ((count 'integer :prompt "Number of expressions"))
+(define-command (com-kill-expression :name t :command-table deletion-table)
+    ((count 'integer :prompt "Number of expressions"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (clone-mark point))
@@ -2137,10 +2337,10 @@
     (delete-region mark point)))
 
 (set-key `(com-kill-expression ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\k :control :meta)))
 
-(define-named-command com-backward-kill-expression
+(define-command (com-backward-kill-expression :name t :command-table deletion-table)
     ((count 'integer :prompt "Number of expressions"))
   (let* ((pane (current-window))
 	 (point (point pane))
@@ -2153,10 +2353,50 @@
     (delete-region mark point)))
 
 (set-key `(com-backward-kill-expression ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'deletion-table
 	 '((#\Backspace :control :meta)))
 
-(define-named-command com-forward-list ((count 'integer :prompt "Number of lists"))
+;; (defparameter *insert-pair-alist*
+;; 	      '((#\( #\)) (#\[ #\]) (#\{ #\}) (#\< #\>) (#\" #\") (#\' #\') (#\` #\')))
+
+(defun insert-pair (mark syntax &optional (count 0) (open #\() (close #\)))
+  (cond ((> count 0)
+	 (loop while (and (not (end-of-buffer-p mark))
+			  (whitespacep (object-after mark)))
+	       do (forward-object mark)))
+	((< count 0)
+	 (setf count (- count))
+	 (loop repeat count do (backward-expression mark syntax))))
+  (unless (or (beginning-of-buffer-p mark)
+	      (whitespacep (object-before mark)))
+    (insert-object mark #\Space))
+  (insert-object mark open)
+  (let ((here (clone-mark mark)))
+    (loop repeat count
+	  do (forward-expression here syntax))
+    (insert-object here close)
+    (unless (or (end-of-buffer-p here)
+		(whitespacep (object-after here)))
+      (insert-object here #\Space))))
+
+(defun insert-parentheses (mark syntax count)
+  (insert-pair mark syntax count #\( #\)))
+
+(define-command (com-insert-parentheses :name t :command-table editing-table)
+    ((count 'integer :prompt "Number of expressions")
+     (wrap-p 'boolean :prompt "Wrap expressions?"))
+  (let* ((pane (current-window))
+	 (point (point pane))
+	 (syntax (syntax (buffer pane))))
+    (unless wrap-p (setf count 0))
+    (insert-parentheses point syntax count)))
+
+(set-key `(com-insert-parentheses ,*numeric-argument-marker* ,*numeric-argument-p*)
+	 'editing-table
+	 '((#\( :meta)))
+
+(define-command (com-forward-list :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of lists"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2165,10 +2405,11 @@
 	 (loop repeat (- count) do (backward-list point syntax)))))
 
 (set-key `(com-forward-list ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\n :control :meta)))
 
-(define-named-command com-backward-list ((count 'integer :prompt "Number of lists"))
+(define-command (com-backward-list :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of lists"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2177,10 +2418,11 @@
 	(loop repeat (- count) do (forward-list point syntax)))))
 
 (set-key `(com-backward-list ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\p :control :meta)))
 
-(define-named-command com-down-list ((count 'integer :prompt "Number of lists"))
+(define-command (com-down-list :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of lists"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2189,10 +2431,11 @@
 	(loop repeat (- count) do (backward-down-list point syntax)))))
 
 (set-key `(com-down-list ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\d :control :meta)))
 
-(define-named-command com-backward-down-list ((count 'integer :prompt "Number of lists"))
+(define-command (com-backward-down-list :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of lists"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2200,7 +2443,8 @@
 	(loop repeat count do (backward-down-list point syntax))
 	(loop repeat (- count) do (down-list point syntax)))))
 
-(define-named-command com-backward-up-list ((count 'integer :prompt "Number of lists"))
+(define-command (com-backward-up-list :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of lists"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2209,10 +2453,10 @@
 	(loop repeat (- count) do (up-list point syntax)))))
 
 (set-key `(com-backward-up-list ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\u :control :meta)))
 
-(define-named-command com-up-list ((count 'integer :prompt "Number of lists"))
+(define-command (com-up-list :name t :command-table movement-table) ((count 'integer :prompt "Number of lists"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2220,16 +2464,18 @@
 	(loop repeat count do (up-list point syntax))
 	(loop repeat (- count) do (backward-up-list point syntax)))))
 
-(define-named-command com-eval-defun ()
+(define-command (com-eval-defun :name t :command-table lisp-table) ()
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
     (eval-defun point syntax)))
 
-(set-key 'com-eval-defun 'global-climacs-table
+(set-key 'com-eval-defun
+	 'lisp-table
 	 '((#\x :control :meta)))
 
-(define-named-command com-beginning-of-definition ((count 'integer :prompt "Number of definitions"))
+(define-command (com-beginning-of-definition :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of definitions"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2238,10 +2484,11 @@
 	(loop repeat (- count) do (end-of-definition point syntax)))))
 
 (set-key `(com-beginning-of-definition ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\a :control :meta)))
 
-(define-named-command com-end-of-definition ((count 'integer :prompt "Number of definitions"))
+(define-command (com-end-of-definition :name t :command-table movement-table)
+    ((count 'integer :prompt "Number of definitions"))
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (syntax (syntax (buffer pane))))
@@ -2250,10 +2497,10 @@
 	(loop repeat (- count) do (beginning-of-definition point syntax)))))
 
 (set-key `(com-end-of-definition ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'movement-table
 	 '((#\e :control :meta)))
 
-(define-named-command com-mark-definition ()
+(define-command (com-mark-definition :name t :command-table marking-table) ()
   (let* ((pane (current-window))
 	 (point (point pane))
 	 (mark (mark pane))
@@ -2263,10 +2510,11 @@
       (setf (offset mark) (offset point)))
     (end-of-definition mark syntax)))
 
-(set-key 'com-mark-definition 'global-climacs-table
+(set-key 'com-mark-definition
+	 'marking-table
 	 '((#\h :control :meta)))
 
-(define-named-command com-package ()
+(define-command (com-package :name t :command-table lisp-table) ()
   (let* ((pane (current-window))
 	 (syntax (syntax (buffer pane)))
 	 (package (climacs-lisp-syntax::package-of syntax)))
@@ -2276,22 +2524,22 @@
 ;;; 
 ;;; For testing purposes
 
-(define-named-command com-reset-profile ()
+(define-command (com-reset-profile :name t :command-table development-table) ()
   #+sbcl (sb-profile:reset)
   #-sbcl nil)
 
-(define-named-command com-report-profile ()
+(define-command (com-report-profile :name t :command-table development-table) ()
   #+sbcl (sb-profile:report)
   #-sbcl nil)
 
-(define-named-command com-recompile ()
+(define-command (com-recompile :name t :command-table development-table) ()
   (asdf:operate 'asdf:load-op :climacs))
 
 
 (define-gesture-name :select-other :pointer-button-press (:left :meta) :unique nil)
 
 (define-presentation-translator lisp-string-to-string
-    (climacs-lisp-syntax::lisp-string string global-climacs-table
+    (climacs-lisp-syntax::lisp-string string development-table
                   :gesture :select-other
                   :tester-definitive t
                   :menu nil
@@ -2299,115 +2547,116 @@
     (object)
   object)
 
-(define-named-command com-accept-string ()
+(define-command (com-accept-string :name t :command-table development-table) ()
   (display-message (format nil "~s" (accept 'string))))
  
-(define-named-command com-accept-symbol ()
+(define-command (com-accept-symbol :name t :command-table development-table) ()
   (display-message (format nil "~s" (accept 'symbol))))	 
 
-(define-named-command com-accept-lisp-string ()
+(define-command (com-accept-lisp-string :name t :command-table development-table) ()
   (display-message (format nil "~s" (accept 'lisp-string))))
 
-(define-named-command com-toggle-visible-mark ()
+(define-command (com-visible-mark :name t :command-table marking-table) ()
   (setf (mark-visible-p (current-window)) (not (mark-visible-p (current-window)))))
 
 (loop for code from (char-code #\Space) to (char-code #\~)
       do (set-key `(com-self-insert ,*numeric-argument-marker*)
-	     'global-climacs-table
+	     'self-insert-table
 	     (list (list (code-char code)))))
 
 (set-key `(com-self-insert ,*numeric-argument-marker*)
-	 'global-climacs-table
+	 'self-insert-table
 	 '((#\Newline)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; 
 ;;; Some Unicode stuff
 
-(define-named-command com-insert-charcode ((code 'integer :prompt "Code point"))
+(define-command (com-insert-charcode :name t :command-table self-insert-table)
+    ((code 'integer :prompt "Code point"))
   (insert-object (point (current-window)) (code-char code)))
 
-(set-key '(com-insert-charcode 193) 'global-climacs-table '((:dead--acute)(#\A)))
-(set-key '(com-insert-charcode 201) 'global-climacs-table '((:dead--acute)(#\E)))
-(set-key '(com-insert-charcode 205) 'global-climacs-table '((:dead--acute)(#\I)))
-(set-key '(com-insert-charcode 211) 'global-climacs-table '((:dead--acute)(#\O)))
-(set-key '(com-insert-charcode 218) 'global-climacs-table '((:dead--acute)(#\U)))
-(set-key '(com-insert-charcode 221) 'global-climacs-table '((:dead--acute)(#\Y)))
-(set-key '(com-insert-charcode 225) 'global-climacs-table '((:dead--acute)(#\a)))
-(set-key '(com-insert-charcode 233) 'global-climacs-table '((:dead--acute)(#\e)))
-(set-key '(com-insert-charcode 237) 'global-climacs-table '((:dead--acute)(#\i)))
-(set-key '(com-insert-charcode 243) 'global-climacs-table '((:dead--acute)(#\o)))
-(set-key '(com-insert-charcode 250) 'global-climacs-table '((:dead--acute)(#\u)))
-(set-key '(com-insert-charcode 253) 'global-climacs-table '((:dead--acute)(#\y)))
-(set-key '(com-insert-charcode 199) 'global-climacs-table '((:dead--acute)(#\C)))
-(set-key '(com-insert-charcode 231) 'global-climacs-table '((:dead--acute)(#\c)))
-(set-key '(com-insert-charcode 215) 'global-climacs-table '((:dead--acute)(#\x)))
-(set-key '(com-insert-charcode 247) 'global-climacs-table '((:dead--acute)(#\-)))
-(set-key '(com-insert-charcode 222) 'global-climacs-table '((:dead--acute)(#\T)))
-(set-key '(com-insert-charcode 254) 'global-climacs-table '((:dead--acute)(#\t)))
-(set-key '(com-insert-charcode 223) 'global-climacs-table '((:dead--acute)(#\s)))
-(set-key '(com-insert-charcode 39) 'global-climacs-table '((:dead--acute)(#\Space)))
-
-(set-key '(com-insert-charcode 197) 'global-climacs-table '((:dead--acute)(:dead--acute)(#\A)))
-(set-key '(com-insert-charcode 229) 'global-climacs-table '((:dead--acute)(:dead--acute)(#\a)))
-
-(set-key '(com-insert-charcode 192) 'global-climacs-table '((:dead--grave)(#\A)))
-(set-key '(com-insert-charcode 200) 'global-climacs-table '((:dead--grave)(#\E)))
-(set-key '(com-insert-charcode 204) 'global-climacs-table '((:dead--grave)(#\I)))
-(set-key '(com-insert-charcode 210) 'global-climacs-table '((:dead--grave)(#\O)))
-(set-key '(com-insert-charcode 217) 'global-climacs-table '((:dead--grave)(#\U)))
-(set-key '(com-insert-charcode 224) 'global-climacs-table '((:dead--grave)(#\a)))
-(set-key '(com-insert-charcode 232) 'global-climacs-table '((:dead--grave)(#\e)))
-(set-key '(com-insert-charcode 236) 'global-climacs-table '((:dead--grave)(#\i)))
-(set-key '(com-insert-charcode 242) 'global-climacs-table '((:dead--grave)(#\o)))
-(set-key '(com-insert-charcode 249) 'global-climacs-table '((:dead--grave)(#\u)))
-(set-key '(com-insert-charcode 96) 'global-climacs-table '((:dead--grave)(#\Space)))
-
-(set-key '(com-insert-charcode 196) 'global-climacs-table '((:dead--diaeresis :shift)(#\A)))
-(set-key '(com-insert-charcode 203) 'global-climacs-table '((:dead--diaeresis :shift)(#\E)))
-(set-key '(com-insert-charcode 207) 'global-climacs-table '((:dead--diaeresis :shift)(#\I)))
-(set-key '(com-insert-charcode 214) 'global-climacs-table '((:dead--diaeresis :shift)(#\O)))
-(set-key '(com-insert-charcode 220) 'global-climacs-table '((:dead--diaeresis :shift)(#\U)))
-(set-key '(com-insert-charcode 228) 'global-climacs-table '((:dead--diaeresis :shift)(#\a)))
-(set-key '(com-insert-charcode 235) 'global-climacs-table '((:dead--diaeresis :shift)(#\e)))
-(set-key '(com-insert-charcode 239) 'global-climacs-table '((:dead--diaeresis :shift)(#\i)))
-(set-key '(com-insert-charcode 246) 'global-climacs-table '((:dead--diaeresis :shift)(#\o)))
-(set-key '(com-insert-charcode 252) 'global-climacs-table '((:dead--diaeresis :shift)(#\u)))
-(set-key '(com-insert-charcode 255) 'global-climacs-table '((:dead--diaeresis :shift)(#\y)))
-(set-key '(com-insert-charcode 34) 'global-climacs-table '((:dead--diaeresis :shift)(#\Space)))
-
-(set-key '(com-insert-charcode 195) 'global-climacs-table '((:dead--tilde :shift)(#\A)))
-(set-key '(com-insert-charcode 209) 'global-climacs-table '((:dead--tilde :shift)(#\N)))
-(set-key '(com-insert-charcode 227) 'global-climacs-table '((:dead--tilde :shift)(#\a)))
-(set-key '(com-insert-charcode 241) 'global-climacs-table '((:dead--tilde :shift)(#\n)))
-(set-key '(com-insert-charcode 198) 'global-climacs-table '((:dead--tilde :shift)(#\E)))
-(set-key '(com-insert-charcode 230) 'global-climacs-table '((:dead--tilde :shift)(#\e)))
-(set-key '(com-insert-charcode 208) 'global-climacs-table '((:dead--tilde :shift)(#\D)))
-(set-key '(com-insert-charcode 240) 'global-climacs-table '((:dead--tilde :shift)(#\d)))
-(set-key '(com-insert-charcode 216) 'global-climacs-table '((:dead--tilde :shift)(#\O)))
-(set-key '(com-insert-charcode 248) 'global-climacs-table '((:dead--tilde :shift)(#\o)))
-(set-key '(com-insert-charcode 126) 'global-climacs-table '((:dead--tilde :shift)(#\Space)))
-
-(set-key '(com-insert-charcode 194) 'global-climacs-table '((:dead--circumflex :shift)(#\A)))
-(set-key '(com-insert-charcode 202) 'global-climacs-table '((:dead--circumflex :shift)(#\E)))
-(set-key '(com-insert-charcode 206) 'global-climacs-table '((:dead--circumflex :shift)(#\I)))
-(set-key '(com-insert-charcode 212) 'global-climacs-table '((:dead--circumflex :shift)(#\O)))
-(set-key '(com-insert-charcode 219) 'global-climacs-table '((:dead--circumflex :shift)(#\U)))
-(set-key '(com-insert-charcode 226) 'global-climacs-table '((:dead--circumflex :shift)(#\a)))
-(set-key '(com-insert-charcode 234) 'global-climacs-table '((:dead--circumflex :shift)(#\e)))
-(set-key '(com-insert-charcode 238) 'global-climacs-table '((:dead--circumflex :shift)(#\i)))
-(set-key '(com-insert-charcode 244) 'global-climacs-table '((:dead--circumflex :shift)(#\o)))
-(set-key '(com-insert-charcode 251) 'global-climacs-table '((:dead--circumflex :shift)(#\u)))
-(set-key '(com-insert-charcode 94) 'global-climacs-table '((:dead--circumflex :shift)(#\Space)))
+(set-key '(com-insert-charcode 193) 'self-insert-table '((:dead--acute)(#\A)))
+(set-key '(com-insert-charcode 201) 'self-insert-table '((:dead--acute)(#\E)))
+(set-key '(com-insert-charcode 205) 'self-insert-table '((:dead--acute)(#\I)))
+(set-key '(com-insert-charcode 211) 'self-insert-table '((:dead--acute)(#\O)))
+(set-key '(com-insert-charcode 218) 'self-insert-table '((:dead--acute)(#\U)))
+(set-key '(com-insert-charcode 221) 'self-insert-table '((:dead--acute)(#\Y)))
+(set-key '(com-insert-charcode 225) 'self-insert-table '((:dead--acute)(#\a)))
+(set-key '(com-insert-charcode 233) 'self-insert-table '((:dead--acute)(#\e)))
+(set-key '(com-insert-charcode 237) 'self-insert-table '((:dead--acute)(#\i)))
+(set-key '(com-insert-charcode 243) 'self-insert-table '((:dead--acute)(#\o)))
+(set-key '(com-insert-charcode 250) 'self-insert-table '((:dead--acute)(#\u)))
+(set-key '(com-insert-charcode 253) 'self-insert-table '((:dead--acute)(#\y)))
+(set-key '(com-insert-charcode 199) 'self-insert-table '((:dead--acute)(#\C)))
+(set-key '(com-insert-charcode 231) 'self-insert-table '((:dead--acute)(#\c)))
+(set-key '(com-insert-charcode 215) 'self-insert-table '((:dead--acute)(#\x)))
+(set-key '(com-insert-charcode 247) 'self-insert-table '((:dead--acute)(#\-)))
+(set-key '(com-insert-charcode 222) 'self-insert-table '((:dead--acute)(#\T)))
+(set-key '(com-insert-charcode 254) 'self-insert-table '((:dead--acute)(#\t)))
+(set-key '(com-insert-charcode 223) 'self-insert-table '((:dead--acute)(#\s)))
+(set-key '(com-insert-charcode 39) 'self-insert-table '((:dead--acute)(#\Space)))
+
+(set-key '(com-insert-charcode 197) 'self-insert-table '((:dead--acute)(:dead--acute)(#\A)))
+(set-key '(com-insert-charcode 229) 'self-insert-table '((:dead--acute)(:dead--acute)(#\a)))
+
+(set-key '(com-insert-charcode 192) 'self-insert-table '((:dead--grave)(#\A)))
+(set-key '(com-insert-charcode 200) 'self-insert-table '((:dead--grave)(#\E)))
+(set-key '(com-insert-charcode 204) 'self-insert-table '((:dead--grave)(#\I)))
+(set-key '(com-insert-charcode 210) 'self-insert-table '((:dead--grave)(#\O)))
+(set-key '(com-insert-charcode 217) 'self-insert-table '((:dead--grave)(#\U)))
+(set-key '(com-insert-charcode 224) 'self-insert-table '((:dead--grave)(#\a)))
+(set-key '(com-insert-charcode 232) 'self-insert-table '((:dead--grave)(#\e)))
+(set-key '(com-insert-charcode 236) 'self-insert-table '((:dead--grave)(#\i)))
+(set-key '(com-insert-charcode 242) 'self-insert-table '((:dead--grave)(#\o)))
+(set-key '(com-insert-charcode 249) 'self-insert-table '((:dead--grave)(#\u)))
+(set-key '(com-insert-charcode 96) 'self-insert-table '((:dead--grave)(#\Space)))
+
+(set-key '(com-insert-charcode 196) 'self-insert-table '((:dead--diaeresis :shift)(#\A)))
+(set-key '(com-insert-charcode 203) 'self-insert-table '((:dead--diaeresis :shift)(#\E)))
+(set-key '(com-insert-charcode 207) 'self-insert-table '((:dead--diaeresis :shift)(#\I)))
+(set-key '(com-insert-charcode 214) 'self-insert-table '((:dead--diaeresis :shift)(#\O)))
+(set-key '(com-insert-charcode 220) 'self-insert-table '((:dead--diaeresis :shift)(#\U)))
+(set-key '(com-insert-charcode 228) 'self-insert-table '((:dead--diaeresis :shift)(#\a)))
+(set-key '(com-insert-charcode 235) 'self-insert-table '((:dead--diaeresis :shift)(#\e)))
+(set-key '(com-insert-charcode 239) 'self-insert-table '((:dead--diaeresis :shift)(#\i)))
+(set-key '(com-insert-charcode 246) 'self-insert-table '((:dead--diaeresis :shift)(#\o)))
+(set-key '(com-insert-charcode 252) 'self-insert-table '((:dead--diaeresis :shift)(#\u)))
+(set-key '(com-insert-charcode 255) 'self-insert-table '((:dead--diaeresis :shift)(#\y)))
+(set-key '(com-insert-charcode 34) 'self-insert-table '((:dead--diaeresis :shift)(#\Space)))
+
+(set-key '(com-insert-charcode 195) 'self-insert-table '((:dead--tilde :shift)(#\A)))
+(set-key '(com-insert-charcode 209) 'self-insert-table '((:dead--tilde :shift)(#\N)))
+(set-key '(com-insert-charcode 227) 'self-insert-table '((:dead--tilde :shift)(#\a)))
+(set-key '(com-insert-charcode 241) 'self-insert-table '((:dead--tilde :shift)(#\n)))
+(set-key '(com-insert-charcode 198) 'self-insert-table '((:dead--tilde :shift)(#\E)))
+(set-key '(com-insert-charcode 230) 'self-insert-table '((:dead--tilde :shift)(#\e)))
+(set-key '(com-insert-charcode 208) 'self-insert-table '((:dead--tilde :shift)(#\D)))
+(set-key '(com-insert-charcode 240) 'self-insert-table '((:dead--tilde :shift)(#\d)))
+(set-key '(com-insert-charcode 216) 'self-insert-table '((:dead--tilde :shift)(#\O)))
+(set-key '(com-insert-charcode 248) 'self-insert-table '((:dead--tilde :shift)(#\o)))
+(set-key '(com-insert-charcode 126) 'self-insert-table '((:dead--tilde :shift)(#\Space)))
+
+(set-key '(com-insert-charcode 194) 'self-insert-table '((:dead--circumflex :shift)(#\A)))
+(set-key '(com-insert-charcode 202) 'self-insert-table '((:dead--circumflex :shift)(#\E)))
+(set-key '(com-insert-charcode 206) 'self-insert-table '((:dead--circumflex :shift)(#\I)))
+(set-key '(com-insert-charcode 212) 'self-insert-table '((:dead--circumflex :shift)(#\O)))
+(set-key '(com-insert-charcode 219) 'self-insert-table '((:dead--circumflex :shift)(#\U)))
+(set-key '(com-insert-charcode 226) 'self-insert-table '((:dead--circumflex :shift)(#\a)))
+(set-key '(com-insert-charcode 234) 'self-insert-table '((:dead--circumflex :shift)(#\e)))
+(set-key '(com-insert-charcode 238) 'self-insert-table '((:dead--circumflex :shift)(#\i)))
+(set-key '(com-insert-charcode 244) 'self-insert-table '((:dead--circumflex :shift)(#\o)))
+(set-key '(com-insert-charcode 251) 'self-insert-table '((:dead--circumflex :shift)(#\u)))
+(set-key '(com-insert-charcode 94) 'self-insert-table '((:dead--circumflex :shift)(#\Space)))
 
-(define-named-command com-regex-search-forward ()
+(define-command (com-regex-search-forward :name t :command-table search-table) ()
   (let ((string (accept 'string :prompt "RE search"
 			:delimiter-gestures nil
 			:activation-gestures
 			'(:newline :return))))
     (re-search-forward (point (current-window)) string)))
 
-(define-named-command com-regex-search-backward ()
+(define-command (com-regex-search-backward :name t :command-table search-table) ()
   (let ((string (accept 'string :prompt "RE search backward"
 			:delimiter-gestures nil
 			:activation-gestures


Index: climacs/esa.lisp
diff -u climacs/esa.lisp:1.17 climacs/esa.lisp:1.18
--- climacs/esa.lisp:1.17	Tue Sep  6 23:30:34 2005
+++ climacs/esa.lisp	Tue Sep 13 21:23:59 2005
@@ -466,6 +466,17 @@
       (helper command-table nil)
       results)))
 
+(defun find-all-keystrokes-and-commands-with-inheritance (start-table)
+  (let ((results '()))
+    (labels  ((helper (table)
+		(let ((res (find-all-keystrokes-and-commands table)))
+		  (when res  (setf results (nconc res results)))
+		  (dolist (subtable (command-table-inherit-from
+				     (find-command-table table)))
+		    (helper subtable)))))
+      (helper start-table))
+    results))
+
 (defun sort-by-name (list)
   (sort list #'string< :key (lambda (item) (symbol-name (second item)))))
 
@@ -486,8 +497,9 @@
 			  &optional (sort-function #'sort-by-name))
   (formatting-table (stream)
     (loop for (keys command)
-	  in (funcall sort-function (find-all-keystrokes-and-commands
-					 command-table))
+	  in (funcall sort-function
+		      (find-all-keystrokes-and-commands-with-inheritance
+			   command-table))
 	  do (formatting-row (stream) 
 	       (formatting-cell (stream :align-x :right)
 		 (with-text-style (stream '(:sans-serif nil nil))




More information about the Climacs-cvs mailing list