From: Jan Nieuwenhuizen <janneke@gnu.org>
Subject: Bugfix and feature for server.el
To: emacs-devel@gnu.org
cc: Han-Wen <hanwen@cs.uu.nl>
Date: Sat, 10 Aug 2002 17:46:22 +0200
Organization: Jan at Peder


Find the following fix attached.  We had a problem with our
application that uses `emacslient --no-wait' to edit input files.

Emacs-21.2 (unlike previous versions), when invoked through
`emacsclient --no-wait', wants to revert buffers whenever they have
been edited, and does allow any editing, which is annoying.  When
invoking with --no-wait, we are typically `moving around' and editing
the same file all the time; and do not want to revert.

When it does revert the buffer, it does not use the column argument of
emacsclient; this is now fixed.

Greetings,
Han-Wen and Jan.


Btw: this message was sent to bug-gnu-emacs about three weeks ago, but
     that list seems to be slightly foobarred?  We both have current
     disclaimers with GNU.


ChangeLog:
2002-07-21  Jan Nieuwenhuizen  <janneke@gnu.org>

	* server.el (server-process-filter): Cleanup stray if.  Add
	'no-revert to file list entry when emacsclient was invoked with
	'--no-wait'.
	(server-visit-files): New function goto-line-column.  Accept
	'no-revert option.  Bugfix: also goto column when reverting
	buffer.

--- server.el.~1.78.~	2001-12-18 17:42:38.000000000 +0100
+++ server.el	2002-08-10 17:32:10.000000000 +0200
@@ -251,40 +251,43 @@ Prefix arg means just kill any existing 
 		       (substring request (match-beginning 0) (1- (match-end 0))))
 		      (pos 0))
 		  (setq request (substring request (match-end 0)))
-		  (if (string-match "\\`-nowait" arg)
-		      (setq nowait t)
-		    (cond
-    			;; ARG is a line number option.
-		     ((string-match "\\`\\+[0-9]+\\'" arg)
+		  (cond
+		   ((string-match "\\`-nowait" arg)
+		    (setq nowait t))
+		   ;; ARG is a line number option.
+		   ((string-match "\\`\\+[0-9]+\\'" arg)
 		      (setq lineno (string-to-int (substring arg 1))))
-		     ;; ARG is line number:column option. 
-		     ((string-match "\\`+\\([0-9]+\\):\\([0-9]+\\)\\'" arg)
-		      (setq lineno (string-to-int (match-string 1 arg))
-			    columnno (string-to-int (match-string 2 arg))))
-		     (t
-		      ;; ARG is a file name.
-		      ;; Collapse multiple slashes to single slashes.
-		      (setq arg (command-line-normalize-file-name arg))
-		      ;; Undo the quoting that emacsclient does
-		      ;; for certain special characters.
-		      (while (string-match "&." arg pos)
-			(setq pos (1+ (match-beginning 0)))
-			(let ((nextchar (aref arg pos)))
-			  (cond ((= nextchar ?&)
-				 (setq arg (replace-match "&" t t arg)))
-				((= nextchar ?-)
-				 (setq arg (replace-match "-" t t arg)))
-				(t
-				 (setq arg (replace-match " " t t arg))))))
-		      ;; Now decode the file name if necessary.
-		      (if coding-system
-			  (setq arg (decode-coding-string arg coding-system)))
-		      (setq files
-			    (cons (list arg lineno columnno)
-				  files))
-		      (setq lineno 1)
-		      (setq columnno 0))))))
-	      (run-hooks 'pre-command-hook)
+		   ;; ARG is line number:column option. 
+		   ((string-match "\\`+\\([0-9]+\\):\\([0-9]+\\)\\'" arg)
+		    (setq lineno (string-to-int (match-string 1 arg))
+			  columnno (string-to-int (match-string 2 arg))))
+		   (t
+		    ;; ARG is a file name.
+		    ;; Collapse multiple slashes to single slashes.
+		    (setq arg (command-line-normalize-file-name arg))
+		    ;; Undo the quoting that emacsclient does
+		    ;; for certain special characters.
+		    (while (string-match "&." arg pos)
+		      (setq pos (1+ (match-beginning 0)))
+		      (let ((nextchar (aref arg pos)))
+			(cond ((= nextchar ?&)
+			       (setq arg (replace-match "&" t t arg)))
+			      ((= nextchar ?-)
+			       (setq arg (replace-match "-" t t arg)))
+			      (t
+			       (setq arg (replace-match " " t t arg))))))
+		    ;; Now decode the file name if necessary.
+		    (if coding-system
+			(setq arg (decode-coding-string arg coding-system)))
+		    (setq files
+			  ;; When invoking emacsclient with --no-wait, we are
+			  ;; typically `moving around' and editing the same file;
+			  ;; and do not want to revert.  Should make --no-revert
+			  ;; option for emacsclient?
+			  (cons (list arg lineno columnno (if nowait 'no-revert nil))
+				files))
+		    (setq lineno 1)
+		    (setq columnno 0)))))
 	      (server-visit-files files client nowait)
 	      (run-hooks 'post-command-hook)
 	      ;; CLIENT is now a list (CLIENTNUM BUFFERS...)
@@ -309,6 +312,13 @@ Prefix arg means just kill any existing 
 FILES is an alist whose elements are (FILENAME LINENUMBER COLUMNNUMBER).
 NOWAIT non-nil means this client is not waiting for the results,
 so don't mark these buffers specially, just visit them normally."
+
+  (defun goto-line-column (file-line-col)
+    (goto-line (nth 1 file-line-col))
+    (let ((column-number (nth 2 file-line-col)))
+      (if (> column-number 0)
+	  (move-to-column (1- column-number)))))
+  
   ;; Bind last-nonmenu-event to force use of keyboard, not mouse, for queries.
   (let (client-record (last-nonmenu-event t) (obuf (current-buffer)))
     ;; Restore the current buffer afterward, but not using save-excursion,
@@ -322,7 +332,8 @@ so don't mark these buffers specially, j
 	  (let* ((filen (car (car files)))
 		 (obuf (get-file-buffer filen)))
 	    (push filen file-name-history)
-	    (if (and obuf (set-buffer obuf))
+	    (if (and obuf (set-buffer obuf)
+		     (not (memq 'no-revert (car files))))
 		(progn
 		  (cond ((file-exists-p filen)
 			 (if (or (not (verify-visited-file-modtime obuf))
@@ -335,12 +346,9 @@ so don't mark these buffers specially, j
 				      ", write buffer to file? "))
 			     (write-file filen))))
 		  (setq server-existing-buffer t)
-		  (goto-line (nth 1 (car files))))
+		  (goto-line-column (car files)))
 	      (set-buffer (find-file-noselect filen))
-	      (goto-line (nth 1 (car files)))
-	      (let ((column-number (nth 2 (car files))))
-		(when (> column-number 0)
-		  (move-to-column (1- column-number))))
+	      (goto-line-column (car files))
 	      (run-hooks 'server-visit-hook)))
 	  (if (not nowait)
 	      (setq server-buffer-clients

-- 
Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond - The music typesetter
http://www.xs4all.nl/~jantien       | http://www.lilypond.org




