summaryrefslogtreecommitdiff
path: root/lisp/comint.el
diff options
context:
space:
mode:
authorJ.D. Smith <jdsmith@as.arizona.edu>2006-04-18 23:49:28 +0000
committerJ.D. Smith <jdsmith@as.arizona.edu>2006-04-18 23:49:28 +0000
commitc3d2959c211970250a6f863b5e1b6e463fbb9a0d (patch)
treeef749a8d5eabc9b361afa6509271b8747de1b152 /lisp/comint.el
parent014513ef4fccf8be833d1c2b8dbbf1f1c2ac20a5 (diff)
downloademacs-c3d2959c211970250a6f863b5e1b6e463fbb9a0d.tar.gz
(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".
Diffstat (limited to 'lisp/comint.el')
-rw-r--r--lisp/comint.el46
1 files changed, 39 insertions, 7 deletions
diff --git a/lisp/comint.el b/lisp/comint.el
index 5ab00354f80..a44e252ca97 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -465,6 +465,7 @@ executed once when the buffer is created."
(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 @@ This is to support the command \\[comint-get-next-from-history].")
"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 @@ Entry to this mode runs the hooks on `comint-mode-hook'."
(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 @@ See also `comint-read-input-ring'."
(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 @@ Moves relative to `comint-input-ring-index'."
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 @@ Moves relative to START, or `comint-input-ring-index'."
(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 @@ If N is negative, find the next or Nth next match."
;; 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)