From: JD Smith <jdsmith@as.arizona.edu>
Subject: Re: comint-accumulate-marker
Date: Mon, 17 Apr 2006 11:06:36 -0700 [thread overview]
Message-ID: <pan.2006.04.17.18.06.31.376086@as.arizona.edu> (raw)
In-Reply-To: E1FUwhn-0000va-4Q@fencepost.gnu.org
On Sat, 15 Apr 2006 22:09:39 -0400, Richard Stallman wrote:
> In a terminal
> shell, using up arrow to recall history doesn't clobber the partially
> complete command you are composin. If you go back down, it is still
> there (even if it's blank). Not so in comint modes. Going down with
> M-p only wraps you around the input ring.
>
> This would clearly be an improvement. Can you implement it?
Here is a patch which implements this behavior. I've added a custom
variable controlling whether it is on or off, and have left it off by
default for now. If people like it and think it would be
generically useful, I can enable it by default.
JD
Index: comint.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/comint.el,v
retrieving revision 1.337
diff -w -b -c -c -r1.337 comint.el
*** comint.el 27 Mar 2006 08:50:20 -0000 1.337
--- comint.el 17 Apr 2006 17:59:10 -0000
***************
*** 251,256 ****
--- 251,263 ----
file)
:group 'comint)
+ (defcustom comint-save-partial-input nil
+ "*If non-nil, save partial input at the prompt when cycling through history.
+ The saved input is recovered when moving off of the end of input
+ history in either direction. If no input, restores blank line."
+ :type 'boolean
+ :group 'comint)
+
(defcustom comint-scroll-to-bottom-on-input nil
"*Controls whether input to interpreter causes window to scroll.
If nil, then do not scroll. If t or `all', scroll all windows showing buffer.
***************
*** 558,563 ****
--- 565,573 ----
"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,643 ****
--- 648,654 ----
(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)
***************
*** 1034,1043 ****
(ring-length comint-input-ring))
arg)))
(defun comint-previous-input (arg)
! "Cycle backwards through input history."
(interactive "*p")
(comint-previous-matching-input "." arg))
(defun comint-next-input (arg)
"Cycle forwards through input history."
--- 1045,1078 ----
(ring-length comint-input-ring))
arg)))
+
(defun comint-previous-input (arg)
! "Cycle backwards through input history.
! Save incomplete input if `comint-save-partial-input' is non-nil."
(interactive "*p")
+ (if comint-save-partial-input
+ (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)
+ (progn
+ (goto-char (point-max))
+ (comint-delete-input)
+ (when (> (length comint-stored-incomplete-input) 0)
+ (insert comint-stored-incomplete-input)
+ (message "Incomplete input restored"))
+ (setq comint-input-ring-index nil))
+ ;; If leaving 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)))
+ (goto-char (point-max))
(comint-previous-matching-input "." arg))
+ (comint-previous-matching-input "." arg)))
(defun comint-next-input (arg)
"Cycle forwards through input history."
***************
*** 1077,1082 ****
--- 1112,1125 ----
(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)))
+
(defun comint-previous-matching-input (regexp n)
"Search backwards through input history for match for REGEXP.
\(Previous history elements are earlier commands.)
***************
*** 1090,1100 ****
(error "Not found")
(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))
(insert (ring-ref comint-input-ring pos)))))
(defun comint-next-matching-input (regexp n)
--- 1133,1139 ----
(error "Not found")
(setq comint-input-ring-index pos)
(message "History item: %d" (1+ pos))
! (comint-delete-input)
(insert (ring-ref comint-input-ring pos)))))
(defun comint-next-matching-input (regexp n)
next prev parent reply other threads:[~2006-04-17 18:06 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-13 19:45 comint-accumulate-marker JD Smith
2006-04-16 0:19 ` comint-accumulate-marker Bob Portmann
2006-04-16 2:09 ` comint-accumulate-marker Richard Stallman
2006-04-17 18:06 ` JD Smith [this message]
2006-04-18 9:47 ` comint-accumulate-marker Nick Roberts
2006-04-18 11:25 ` comint-accumulate-marker Stefan Monnier
2006-04-18 20:50 ` comint-accumulate-marker Richard Stallman
2006-04-18 12:57 ` comint-accumulate-marker Richard Stallman
2006-04-18 19:10 ` comint-accumulate-marker JD Smith
2006-04-18 20:54 ` comint-accumulate-marker David Kastrup
2006-04-18 21:06 ` comint-accumulate-marker JD Smith
2006-04-18 23:25 ` comint-accumulate-marker Stuart D. Herring
2006-04-18 21:22 ` comint-accumulate-marker Nick Roberts
2006-04-18 21:38 ` comint-accumulate-marker JD Smith
2006-04-18 23:24 ` comint-accumulate-marker Nick Roberts
[not found] ` <1145403002.27500.42.camel@turtle.as.arizona.edu>
2006-04-19 0:01 ` comint-accumulate-marker Nick Roberts
2006-04-19 0:01 ` Bug in diff-mode? (was: Re: comint-accumulate-marker) Nick Roberts
2006-04-19 15:40 ` Richard Stallman
2006-04-19 15:40 ` comint-accumulate-marker Richard Stallman
2006-04-20 7:25 ` comint-accumulate-marker David Kastrup
2006-04-20 7:45 ` comint-accumulate-marker Nick Roberts
2006-04-20 17:29 ` comint-accumulate-marker JD Smith
2006-04-18 22:21 ` comint-accumulate-marker Stuart D. Herring
2006-04-18 22:48 ` comint-accumulate-marker JD Smith
2006-04-18 23:39 ` comint-accumulate-marker Miles Bader
2006-04-19 0:02 ` comint-accumulate-marker JD Smith
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pan.2006.04.17.18.06.31.376086@as.arizona.edu \
--to=jdsmith@as.arizona.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).