# HG changeset patch # User J.D. Smith # Date 1145404133 0 # Node ID 3233d9998115435586938d6d7d62f466850c5524 # Parent fda7f21dca32a16e0177066b12bd2230c0486155 (comint-previous-input): Don't clobber input line when moving off either end of the input history ring. (comint-delete-input): New function, used by `comint-previous-input' and others. (comint-previous-matching-input): Use `coming-delete-input'. Save the partial input if leaving the edit line. Goto point-max before deleting input to avoid partial input fragments hanging around. (comint-restore-input): New function, used by `comint-previous-input', and bound to "C-c C-j". diff -r fda7f21dca32 -r 3233d9998115 lisp/comint.el --- a/lisp/comint.el Tue Apr 18 23:46:53 2006 +0000 +++ b/lisp/comint.el Tue Apr 18 23:48:53 2006 +0000 @@ -465,6 +465,7 @@ (define-key map "\C-c\C-l" 'comint-dynamic-list-input-ring) (define-key map "\C-c\C-n" 'comint-next-prompt) (define-key map "\C-c\C-p" 'comint-previous-prompt) + (define-key map "\C-c\C-j" 'comint-restore-input) (define-key map "\C-c\C-d" 'comint-send-eof) (define-key map "\C-c\C-s" 'comint-write-output) (define-key map "\C-c." 'comint-insert-previous-argument) @@ -558,6 +559,9 @@ "Non-nil if you are accumulating input lines to send as input together. The command \\[comint-accumulate] sets this.") +(defvar comint-stored-incomplete-input nil + "Stored input for history cycling.") + (put 'comint-replace-by-expanded-history 'menu-enable 'comint-input-autoexpand) (put 'comint-input-ring 'permanent-local t) (put 'comint-input-ring-index 'permanent-local t) @@ -638,6 +642,7 @@ (make-local-variable 'comint-scroll-to-bottom-on-input) (make-local-variable 'comint-move-point-for-output) (make-local-variable 'comint-scroll-show-maximum-output) + (make-local-variable 'comint-stored-incomplete-input) ;; This makes it really work to keep point at the bottom. (make-local-variable 'scroll-conservatively) (setq scroll-conservatively 10000) @@ -1015,6 +1020,16 @@ (t arg))) +(defun comint-restore-input () + "Restore unfinished input." + (interactive) + (when comint-input-ring-index + (comint-delete-input) + (when (> (length comint-stored-incomplete-input) 0) + (insert comint-stored-incomplete-input) + (message "Input restored")) + (setq comint-input-ring-index nil))) + (defun comint-search-start (arg) "Index to start a directional search, starting at `comint-input-ring-index'." (if comint-input-ring-index @@ -1035,9 +1050,18 @@ arg))) (defun comint-previous-input (arg) - "Cycle backwards through input history." + "Cycle backwards through input history, saving input." (interactive "*p") - (comint-previous-matching-input "." arg)) + (if (and comint-input-ring-index + (or ;; leaving the "end" of the ring + (and (< arg 0) ; going down + (eq comint-input-ring-index 0)) + (and (> arg 0) ; going up + (eq comint-input-ring-index + (1- (ring-length comint-input-ring))))) + comint-stored-incomplete-input) + (comint-restore-input) + (comint-previous-matching-input "." arg))) (defun comint-next-input (arg) "Cycle forwards through input history." @@ -1077,6 +1101,14 @@ (if (string-match regexp (ring-ref comint-input-ring n)) n))) +(defun comint-delete-input () + "Delete all input between accumulation or process mark and point." + (delete-region + ;; Can't use kill-region as it sets this-command + (or (marker-position comint-accum-marker) + (process-mark (get-buffer-process (current-buffer)))) + (point-max))) + (defun comint-previous-matching-input (regexp n) "Search backwards through input history for match for REGEXP. \(Previous history elements are earlier commands.) @@ -1088,13 +1120,13 @@ ;; Has a match been found? (if (null pos) (error "Not found") + ;; If leaving the edit line, save partial input + (if (null comint-input-ring-index) ;not yet on ring + (setq comint-stored-incomplete-input + (funcall comint-get-old-input))) (setq comint-input-ring-index pos) (message "History item: %d" (1+ pos)) - (delete-region - ;; Can't use kill-region as it sets this-command - (or (marker-position comint-accum-marker) - (process-mark (get-buffer-process (current-buffer)))) - (point)) + (comint-delete-input) (insert (ring-ref comint-input-ring pos))))) (defun comint-next-matching-input (regexp n)