changeset 84531:8321f44d75a4

Chris Moore <dooglus at gmail.com> (shell-resync-dirs): Don't move the cursor relative to the command being edited.
author Glenn Morris <rgm@gnu.org>
date Thu, 13 Sep 2007 07:21:47 +0000
parents 17fb17cc9d05
children a73e462cd831
files lisp/shell.el
diffstat 1 files changed, 48 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/shell.el	Thu Sep 13 07:19:30 2007 +0000
+++ b/lisp/shell.el	Thu Sep 13 07:21:47 2007 +0000
@@ -808,51 +808,54 @@
 command again."
   (interactive)
   (let* ((proc (get-buffer-process (current-buffer)))
-	 (pmark (process-mark proc)))
-    (goto-char pmark)
-    ;; If the process echoes commands, don't insert a fake command in
-    ;; the buffer or it will appear twice.
-    (unless comint-process-echoes
-      (insert shell-dirstack-query) (insert "\n"))
-    (sit-for 0) ; force redisplay
-    (comint-send-string proc shell-dirstack-query)
-    (comint-send-string proc "\n")
-    (set-marker pmark (point))
-    (let ((pt (point))
-	  (regexp
-	   (concat
-	    (if comint-process-echoes
-		;; Skip command echo if the process echoes
-		(concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
-	      "\\(\\)")
-	    "\\(.+\n\\)")))
-      ;; This extra newline prevents the user's pending input from spoofing us.
-      (insert "\n") (backward-char 1)
-      ;; Wait for one line.
-      (while (not (looking-at regexp))
-	(accept-process-output proc)
-	(goto-char pt)))
-    (goto-char pmark) (delete-char 1) ; remove the extra newline
-    ;; That's the dirlist. grab it & parse it.
-    (let* ((dl (buffer-substring (match-beginning 2) (1- (match-end 2))))
-	   (dl-len (length dl))
-	   (ds '())			; new dir stack
-	   (i 0))
-      (while (< i dl-len)
-	;; regexp = optional whitespace, (non-whitespace), optional whitespace
-	(string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir
-	(setq ds (cons (concat comint-file-name-prefix
-			       (substring dl (match-beginning 1)
-					  (match-end 1)))
-		       ds))
-	(setq i (match-end 0)))
-      (let ((ds (nreverse ds)))
-	(condition-case nil
-	    (progn (shell-cd (car ds))
-		   (setq shell-dirstack (cdr ds)
-			 shell-last-dir (car shell-dirstack))
-		   (shell-dirstack-message))
-	  (error (message "Couldn't cd")))))))
+	 (pmark (process-mark proc))
+	 (started-at-pmark (= (point) (marker-position pmark))))
+    (save-excursion
+      (goto-char pmark)
+      ;; If the process echoes commands, don't insert a fake command in
+      ;; the buffer or it will appear twice.
+      (unless comint-process-echoes
+	(insert shell-dirstack-query) (insert "\n"))
+      (sit-for 0)			; force redisplay
+      (comint-send-string proc shell-dirstack-query)
+      (comint-send-string proc "\n")
+      (set-marker pmark (point))
+      (let ((pt (point))
+	    (regexp
+	     (concat
+	      (if comint-process-echoes
+		  ;; Skip command echo if the process echoes
+		  (concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
+		"\\(\\)")
+	      "\\(.+\n\\)")))
+	;; This extra newline prevents the user's pending input from spoofing us.
+	(insert "\n") (backward-char 1)
+	;; Wait for one line.
+	(while (not (looking-at regexp))
+	  (accept-process-output proc)
+	  (goto-char pt)))
+      (goto-char pmark) (delete-char 1) ; remove the extra newline
+      ;; That's the dirlist. grab it & parse it.
+      (let* ((dl (buffer-substring (match-beginning 2) (1- (match-end 2))))
+	     (dl-len (length dl))
+	     (ds '())			; new dir stack
+	     (i 0))
+	(while (< i dl-len)
+	  ;; regexp = optional whitespace, (non-whitespace), optional whitespace
+	  (string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir
+	  (setq ds (cons (concat comint-file-name-prefix
+				 (substring dl (match-beginning 1)
+					    (match-end 1)))
+			 ds))
+	  (setq i (match-end 0)))
+	(let ((ds (nreverse ds)))
+	  (condition-case nil
+	      (progn (shell-cd (car ds))
+		     (setq shell-dirstack (cdr ds)
+			   shell-last-dir (car shell-dirstack))
+		     (shell-dirstack-message))
+	    (error (message "Couldn't cd"))))))
+    (if started-at-pmark (goto-char (marker-position pmark)))))
 
 ;; For your typing convenience:
 (defalias 'dirs 'shell-resync-dirs)