[climacs-cvs] CVS climacs

dmurray dmurray at common-lisp.net
Sun May 7 20:11:20 UTC 2006


Update of /project/climacs/cvsroot/climacs
In directory clnet:/tmp/cvs-serv28753

Modified Files:
	file-commands.lisp 
Log Message:
find-file now takes an optional readonlyp argument, meaning
find-file-read-only (which had got out of sync/date) can go.


--- /project/climacs/cvsroot/climacs/file-commands.lisp	2006/05/06 15:40:47	1.14
+++ /project/climacs/cvsroot/climacs/file-commands.lisp	2006/05/07 20:11:20	1.15
@@ -228,7 +228,7 @@
     (and (or (null name) (eql name :unspecific))
 	 (or (null type) (eql type :unspecific)))))
 
-(defun find-file (filepath)
+(defun find-file (filepath &optional readonlyp)
   (cond ((null filepath)
 	 (display-message "No file name given.")
 	 (beep))
@@ -238,38 +238,45 @@
 	(t
 	 (let ((existing-buffer (find filepath (buffers *application-frame*)
 			       :key #'filepath :test #'equal)))
-	   (if existing-buffer
+	   (if (and existing-buffer (if readonlyp (read-only-p existing-buffer) t))
 	       (switch-to-buffer existing-buffer)
-	       (let ((buffer (make-buffer))
-		     (pane (current-window)))
-                 ;; Clear the pane's cache; otherwise residue from the
-                 ;; previously displayed buffer may under certain
-                 ;; circumstances be displayed.
-                 (clear-cache pane)
-                 (setf (syntax buffer) nil)
-		 (setf (offset (point (buffer pane))) (offset (point pane)))
-		 (setf (buffer (current-window)) buffer)
-		 ;; Don't want to create the file if it doesn't exist.
-		 (when (probe-file filepath)
-		   (with-open-file (stream filepath :direction :input)
-		     (input-from-stream stream buffer 0))
-		   (setf (file-write-time buffer) (file-write-date filepath))
-                   ;; A file! That means we may have a local options
-                   ;; line to parse.
-                   (evaluate-attributes-line buffer))
-                 ;; If the local options line didn't set a syntax, do
-                 ;; it now.
-                 (when (null (syntax buffer))
-                   (setf (syntax buffer)
-                         (make-instance (syntax-class-name-for-filepath filepath)
-                                        :buffer buffer)))
-		 (setf (filepath buffer) filepath
-		       (name buffer) (filepath-filename filepath)
-		       (needs-saving buffer) nil)
-		 (beginning-of-buffer (point pane))
-                 (update-syntax buffer (syntax buffer))
-                 (clear-modify buffer)
-		 buffer))))))
+	       (progn
+		 (when readonlyp
+		   (unless (probe-file filepath)
+		     (beep)
+		     (display-message "No such file: ~A" filepath)
+		     (return-from find-file nil)))
+		 (let ((buffer (make-buffer))
+		       (pane (current-window)))
+		   ;; Clear the pane's cache; otherwise residue from the
+		   ;; previously displayed buffer may under certain
+		   ;; circumstances be displayed.
+		   (clear-cache pane)
+		   (setf (syntax buffer) nil)
+		   (setf (offset (point (buffer pane))) (offset (point pane)))
+		   (setf (buffer (current-window)) buffer)
+		   ;; Don't want to create the file if it doesn't exist.
+		   (when (probe-file filepath)
+		     (with-open-file (stream filepath :direction :input)
+		       (input-from-stream stream buffer 0))
+		     (setf (file-write-time buffer) (file-write-date filepath))
+		     ;; A file! That means we may have a local options
+		     ;; line to parse.
+		     (evaluate-attributes-line buffer))
+		   ;; If the local options line didn't set a syntax, do
+		   ;; it now.
+		   (when (null (syntax buffer))
+		     (setf (syntax buffer)
+			   (make-instance (syntax-class-name-for-filepath filepath)
+			      :buffer buffer)))
+		   (setf (filepath buffer) filepath
+			 (name buffer) (filepath-filename filepath)
+			 (needs-saving buffer) nil
+			 (read-only-p buffer) readonlyp)
+		   (beginning-of-buffer (point pane))
+		   (update-syntax buffer (syntax buffer))
+		   (clear-modify buffer)
+		   buffer)))))))
 
 (defun directory-of-buffer (buffer)
   "Extract the directory part of the filepath to the file in BUFFER.
@@ -294,42 +301,6 @@
 	 'buffer-table
 	 '((#\x :control) (#\f :control)))
 
-(defun find-file-read-only (filepath)
-  (cond ((null filepath)
-	 (display-message "No file name given.")
-	 (beep))
-	((directory-pathname-p filepath)
-	 (display-message "~A is a directory name." filepath)
-	 (beep))
-	(t
-	 (let ((existing-buffer (find filepath (buffers *application-frame*)
-				      :key #'filepath :test #'equal)))
-	   (if (and existing-buffer (read-only-p existing-buffer))
-	       (switch-to-buffer existing-buffer)
-	       (if (probe-file filepath)
-		   (let ((buffer (make-buffer))
-			 (pane (current-window)))
-		     (setf (offset (point (buffer pane))) (offset (point pane)))
-		     (setf (buffer (current-window)) buffer)
-		     (setf (syntax buffer)
-			   (make-instance (syntax-class-name-for-filepath filepath)
-			      :buffer (buffer (point pane))))
-		     (with-open-file (stream filepath :direction :input)
-		       (input-from-stream stream buffer 0))
-		     (setf (filepath buffer) filepath
-			   (name buffer) (filepath-filename filepath)
-			   (needs-saving buffer) nil
-			   (read-only-p buffer) t)
-		     (beginning-of-buffer (point pane))
-		     ;; this one is needed so that the buffer modification protocol
-		     ;; resets the low and high marks after redisplay
-		     (redisplay-frame-panes *application-frame*)
-		     buffer)
-		   (progn
-		     (display-message "No such file: ~A" filepath)
-		     (beep)
-		     nil)))))))
-
 (define-command (com-find-file-read-only :name t :command-table buffer-table) ()
   "Prompt for a filename then open that file readonly.
 If a buffer is already visiting that file, switch to that buffer. If the filename given does not name an existing file, signal an error."
@@ -337,7 +308,7 @@
 			  :default (directory-of-buffer (buffer (current-window)))
 			  :default-type 'pathname
 			  :insert-default t)))
-    (find-file-read-only filepath)))
+    (find-file filepath t)))
 
 (set-key 'com-find-file-read-only
 	 'buffer-table




More information about the Climacs-cvs mailing list