Mercurial > emacs
changeset 78770:6db70c3a1837
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:26:32 +0000 |
parents | ca61e14e02a6 |
children | 28d0c39b6c3b |
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:24:48 2007 +0000 +++ b/lisp/shell.el Thu Sep 13 07:26:32 2007 +0000 @@ -802,51 +802,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)