From: Jan Nieuwenhuizen Subject: Bugfix and feature for server.el To: emacs-devel@gnu.org cc: Han-Wen 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 * 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 | GNU LilyPond - The music typesetter http://www.xs4all.nl/~jantien | http://www.lilypond.org