[climacs-cvs] CVS climacs
thenriksen
thenriksen at common-lisp.net
Wed Jan 23 18:17:05 UTC 2008
Update of /project/climacs/cvsroot/climacs
In directory clnet:/tmp/cvs-serv3677
Modified Files:
climacs-lisp-syntax-commands.lisp climacs.lisp packages.lisp
typeout.lisp
Log Message:
Added code by Rudi Schlatte to integrated Climacs with CL:ED. Only
SBCL is supported for now.
--- /project/climacs/cvsroot/climacs/climacs-lisp-syntax-commands.lisp 2008/01/21 17:19:34 1.9
+++ /project/climacs/cvsroot/climacs/climacs-lisp-syntax-commands.lisp 2008/01/23 18:17:05 1.10
@@ -139,6 +139,11 @@
(presentation)
(list (presentation-object presentation)))
+(define-command (com-edit-definition :name t :command-table climacs-lisp-table)
+ ((symbol 'symbol))
+ "Edit definition of the symbol."
+ (edit-definition symbol))
+
(define-command (com-edit-this-definition :command-table climacs-lisp-table)
()
"Edit definition of the symbol at point.
--- /project/climacs/cvsroot/climacs/climacs.lisp 2006/11/12 16:06:06 1.4
+++ /project/climacs/cvsroot/climacs/climacs.lisp 2008/01/23 18:17:05 1.5
@@ -30,21 +30,25 @@
(in-package :climacs)
-(defun climacs (&key new-process (process-name "Climacs")
+(defun find-climacs-frame ()
+ (let ((frame-manager (find-frame-manager)))
+ (when frame-manager
+ (find-if (lambda (x) (and (typep x 'climacs)
+ (eq (clim:frame-state x) :enabled)))
+ (frame-manager-frames frame-manager)))))
+
+(defun climacs (&rest args &key new-process (process-name "Climacs")
(width 900) (height 400))
"Starts up a climacs session"
- (let ((frame (make-application-frame 'climacs :width width :height height)))
- (flet ((run ()
- (run-frame-top-level frame)))
- (if new-process
- (clim-sys:make-process #'run :name process-name)
- (run)))))
+ (declare (ignore new-process process-name width height))
+ (apply #'climacs-common nil args))
-(defun climacs-rv (&key new-process (process-name "Climacs")
- (width 900) (height 400))
+(defun climacs-rv (&rest args &key new-process (process-name "Climacs")
+ (width 900) (height 400))
"Starts up a climacs session with alternative colors."
;; SBCL doesn't inherit dynamic bindings when starting new
;; processes, so start a new processes and THEN setup the colors.
+ (declare (ignore width height))
(flet ((run ()
(let ((*background-color* +black+)
(*foreground-color* +gray+)
@@ -52,7 +56,45 @@
(*info-fg-color* +gray+)
(*mini-bg-color* +black+)
(*mini-fg-color* +white+))
- (climacs :new-process nil :width width :height height))))
+ (apply #'climacs-common nil :new-process nil args))))
(if new-process
- (clim-sys:make-process #'run :name process-name)
- (run))))
+ (clim-sys:make-process #'run :name process-name)
+ (run))))
+
+(defun edit-file (thing &rest args
+ &key (process-name "Climacs") (width 900) (height 400))
+ "Edit THING in an existing climacs process or start a new one. THING
+can be a filename (edit the file) or symbol (edit its function definition)."
+ (declare (ignore process-name width height))
+ (let ((climacs-frame (find-climacs-frame))
+ (command
+ (typecase thing
+ (null nil)
+ (symbol (list 'drei-lisp-syntax::com-edit-definition thing))
+ ((or string pathname)
+ (truename thing) ; raise file-error if file doesn't exist
+ (list 'esa-io::com-find-file thing))
+ (t (error 'type-error :datum thing
+ :expected-type '(or null string pathname symbol))))))
+ (if climacs-frame
+ (execute-frame-command climacs-frame command)
+ (apply #'climacs-common command :new-process t args)))
+ t)
+
+(defun climacs-common (command &key new-process (process-name "Climacs")
+ (width 900) (height 400))
+ (let* ((frame (make-application-frame 'climacs :width width :height height))
+ (*application-frame* frame)
+ (esa:*esa-instance* frame))
+ (adopt-frame (find-frame-manager) *application-frame*)
+ (when command (execute-frame-command *application-frame* command))
+ (flet ((run () (run-frame-top-level frame)))
+ (if new-process
+ (clim-sys:make-process #'run :name process-name)
+ (run)))))
+
+;;; Append to end of *ed-functions* so we don't overwrite the user's
+;;; preferred editor
+#+sbcl
+(unless (member 'edit-file sb-ext:*ed-functions*)
+ (setf sb-ext:*ed-functions* (append sb-ext:*ed-functions* (list 'edit-file))))
--- /project/climacs/cvsroot/climacs/packages.lisp 2008/01/21 17:19:34 1.135
+++ /project/climacs/cvsroot/climacs/packages.lisp 2008/01/23 18:17:05 1.136
@@ -199,5 +199,6 @@
(:use :clim-lisp :clim :clim-sys :clim-extensions :climacs-gui :drei)
(:export #:climacs
#:climacs-rv
- #:edit-definition)
+ #:edit-definition
+ #:edit-file)
(:documentation "Package containing entry points to Climacs."))
\ No newline at end of file
--- /project/climacs/cvsroot/climacs/typeout.lisp 2008/01/21 17:08:48 1.3
+++ /project/climacs/cvsroot/climacs/typeout.lisp 2008/01/23 18:17:05 1.4
@@ -111,7 +111,7 @@
"Call `continuation' with a single argument, a
stream meant for typeout. `Climacs' is the Climacs instance in
which the typeout pane should be shown, and `label' is the name
-of the created typeout view."
+of the created typeout view. Returns NIL."
(let* ((typeout-view (ensure-typeout-view climacs label))
(pane-with-typeout (or (find typeout-view (windows climacs)
:key #'view)
@@ -127,7 +127,8 @@
(setf (last-cursor-position typeout-view)
(multiple-value-list (stream-cursor-position pane-with-typeout)))))))
(add-output-record new-record (output-history typeout-view))
- (setf (dirty typeout-view) t))))
+ (setf (dirty typeout-view) t)
+ nil)))
(defmacro with-typeout ((stream &optional (label "Typeout")) &body body)
"Evaluate `body' with `stream' bound to a stream that can be
More information about the Climacs-cvs
mailing list