[clim-desktop-cvs] CVS clim-desktop

thenriksen thenriksen at common-lisp.net
Thu Jun 1 19:59:11 UTC 2006


Update of /project/clim-desktop/cvsroot/clim-desktop
In directory clnet:/tmp/cvs-serv12319

Modified Files:
	swine.lisp climacs.lisp 
Log Message:
Added translators and commands to only lookup some definitions of a
symbol (eg, a class definition) and cleaned the rest of the
cross-application Climacs calling code.


--- /project/clim-desktop/cvsroot/clim-desktop/swine.lisp	2006/05/31 18:01:04	1.17
+++ /project/clim-desktop/cvsroot/clim-desktop/swine.lisp	2006/06/01 19:59:11	1.18
@@ -1005,13 +1005,31 @@
                 (climacs-gui::goto-position (point (climacs-gui::current-window)) offset))
          (pop-find-definition-stack)))))
 
-(defun edit-definition (symbol)
-  (let ((definitions (find-definitions-for-climacs symbol)))
-    (cond ((null definitions)
-           (climacs-gui::display-message "No known definitions for: ~A" symbol)
-           (beep))
-          (t
-           (goto-definition symbol definitions)))))
+;; KLUDGE: We need to put more info in the definition objects to begin with.
+(defun definition-type (definition)
+  (let ((data (read-from-string (first definition))))
+     (case (first data)
+      ((or cl:defclass)
+       'cl:class)
+      ((or cl:defgeneric
+           cl:defmethod
+           cl:defun
+           cl:defmacro)
+       'cl:function)
+      (t t))))
+
+(defun edit-definition (symbol &optional type)
+  (let ((all-definitions (find-definitions-for-climacs symbol)))
+    (let ((definitions (if (not type)
+                           all-definitions
+                           (remove-if-not #'(lambda (definition)
+                                              (eq (definition-type definition) type))
+                                          all-definitions))))
+      (cond ((null definitions)
+             (climacs-gui::display-message "No known definitions for: ~A" symbol)
+             (beep))
+            (t
+             (goto-definition symbol definitions))))))
 
 ;; XXX, get Swine into Climacs proper.
 (export 'edit-definition)
--- /project/clim-desktop/cvsroot/clim-desktop/climacs.lisp	2006/05/31 11:11:08	1.9
+++ /project/clim-desktop/cvsroot/clim-desktop/climacs.lisp	2006/06/01 19:59:11	1.10
@@ -29,6 +29,8 @@
 	 'base-table
 	 '((#\c :control) (#\d :control) (#\s :control)))
 
+;; The following code relates to calling Climacs from other applications.
+
 (defmacro with-climacs-frame ((frame-symbol) &body body)
   (let ((frame-manager-sym (gensym)))
    `(let ((,frame-manager-sym (find-frame-manager)))
@@ -46,14 +48,14 @@
       ;; FIXME: The new frame must be ready, this is a hack.
       (sleep 1))))
 
-(defgeneric edit-in-climacs (thing)
+(defgeneric edit-in-climacs (thing &key &allow-other-keys)
   (:documentation "Edit thing in Climacs, start Climacs if is not
-  running.")
-  (:method :before (thing)
-           (declare (ignore thing))
-           (ensure-climacs)))
+                   running.")
+  (:method :before (thing &key &allow-other-keys)
+   (declare (ignore thing))
+   (ensure-climacs)))
 
-(defmethod edit-in-climacs ((thing pathname))
+(defmethod edit-in-climacs ((thing pathname) &key &allow-other-keys)
   (when (wild-pathname-p thing)
     (error 'file-error :pathname thing
            "Cannot edit wild pathname."))
@@ -62,15 +64,35 @@
       (execute-frame-command 
        frame `(com-find-file ,thing)))))
 
-(defmethod edit-in-climacs ((thing string))
+(defmethod edit-in-climacs ((thing string) &key &allow-other-keys)
   ;; Hope it is a pathname.
   (edit-in-climacs (pathname thing)))
 
-(defmethod edit-in-climacs ((thing symbol))
+(defmethod edit-in-climacs ((thing symbol) &key type &allow-other-keys)
   (with-climacs-frame (frame)
     (when frame
       (execute-frame-command 
-       frame `(com-edit-definition ,thing)))))
+       frame `(com-edit-definition-of-type ,thing ,type)))))
+
+;; These commands should only be called from within Climacs:
+
+(define-command (com-edit-definition :name t :command-table global-climacs-table)
+    ((symbol 'symbol
+      :prompt "Edit symbol"))
+  "Edit the definition of a symbol as a given type.
+
+If the symbol has been defined more than once (eg. to a function
+as well as a class, or as numerous methods), a
+mouse-click-sensitive list of available definitions will be
+displayed."
+  (climacs-lisp-syntax:edit-definition symbol))
+
+(define-command (com-edit-definition-of-type :name t :command-table global-climacs-table)
+    ((symbol 'symbol
+      :prompt "Edit symbol")
+     (type 'symbol))
+  "Edit the definition of a symbol as a given type."
+  (climacs-lisp-syntax:edit-definition symbol type))
 
 ;; Redefine (ed)
 (handler-bind ((#+sbcl sb-ext:package-lock-violation
@@ -87,40 +109,50 @@
           (with-climacs-frame (frame)
             (raise-frame frame))))))
 
-(define-command (com-edit-definition :name t :command-table global-climacs-table)
+;; The following commands can be safely called from outside Climacs:
+
+(define-command (com-edit-class-definition :name t :command-table global-command-table)
     ((symbol 'symbol
       :prompt "Edit symbol"))
-  "Edit the definition of a symbol.
+  "Edit the class definition of a symbol."
+  (edit-in-climacs symbol :type 'class))
 
-If the symbol has been defined more than once (eg. to a function
-as well as a class, or as numerous methods), a
-mouse-click-sensitive list of available definitions will be
-displayed."
-  (climacs-lisp-syntax:edit-definition symbol))
+(define-command (com-edit-function-definition :name t :command-table global-command-table)
+    ((symbol 'symbol
+      :prompt "Edit symbol"))
+  "Edit the function definition of a symbol."
+  (edit-in-climacs symbol :type 'function))
 
 (define-command (com-edit-in-climacs :command-table global-command-table)
     ((thing t))
   (edit-in-climacs thing))
 
-(define-presentation-to-command-translator global-edit-symbol-definition
-    (symbol com-edit-in-climacs global-command-table
+(define-presentation-to-command-translator global-edit-symbol-definition-translator
+    (symbol com-edit-definition global-command-table
             :tester ((object presentation)
                      (declare (ignore object))
-                     (not (eq (presentation-type presentation) 'unknown-symbol)))
+                     (and (not (eq (presentation-type presentation) 'unknown-symbol))))
             :gesture :edit
             :documentation "Edit Definition")
     (object)
     (list object))
 
-(define-presentation-to-command-translator global-edit-command-name-definition
-    (command-name com-edit-in-climacs global-command-table
+(define-presentation-to-command-translator global-edit-class-name-definition-translator
+    (class-name com-edit-class-definition global-command-table
+            :gesture :edit
+            :documentation "Edit Class Definition")
+    (object)
+    (list object))
+
+(define-presentation-to-command-translator global-edit-command-name-definition-translator
+    (command-name com-edit-function-definition global-command-table
                   :gesture :edit
                   :documentation "Edit Definition Of Command")
     (object)
     (list object))
 
-(define-presentation-to-command-translator global-edit-command-definition
-    (command com-edit-in-climacs global-command-table
+(define-presentation-to-command-translator global-edit-command-definition-translator
+    (command com-edit-function-definition global-command-table
              :gesture :edit
              :documentation "Edit Definition Of Command")
     (object)




More information about the Clim-desktop-cvs mailing list