From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: JD Smith Newsgroups: gmane.emacs.devel Subject: Re: comint-accumulate-marker Date: Tue, 18 Apr 2006 12:10:45 -0700 Message-ID: References: NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 (Apple Message framework v749.3) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Content-Transfer-Encoding: 7bit X-Trace: sea.gmane.org 1145387498 23997 80.91.229.2 (18 Apr 2006 19:11:38 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Tue, 18 Apr 2006 19:11:38 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Apr 18 21:11:33 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FVvbR-0003Cz-MU for ged-emacs-devel@m.gmane.org; Tue, 18 Apr 2006 21:11:10 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FVvbQ-0007oI-RG for ged-emacs-devel@m.gmane.org; Tue, 18 Apr 2006 15:11:08 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1FVvbC-0007oD-SZ for emacs-devel@gnu.org; Tue, 18 Apr 2006 15:10:54 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1FVvbB-0007nQ-7y for emacs-devel@gnu.org; Tue, 18 Apr 2006 15:10:53 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FVvbB-0007nN-1S for emacs-devel@gnu.org; Tue, 18 Apr 2006 15:10:53 -0400 Original-Received: from [204.127.200.84] (helo=sccrmhc14.comcast.net) by monty-python.gnu.org with esmtp (Exim 4.52) id 1FVvc3-0008Ti-8R; Tue, 18 Apr 2006 15:11:47 -0400 Original-Received: from [192.168.1.3] (c-69-254-192-132.hsd1.ar.comcast.net[69.254.192.132]) by comcast.net (sccrmhc14) with SMTP id <20060418191046014008au9ge>; Tue, 18 Apr 2006 19:10:46 +0000 In-Reply-To: Original-To: rms@gnu.org X-Mailer: Apple Mail (2.749.3) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:53022 Archived-At: On Apr 18, 2006, at 5:57 AM, Richard Stallman wrote: > Please install it, and enable it by default. The reason this > is ok to install now is that the current behavior is wrong. I will install it shortly, but wanted to run one more variant of the patch by everyone first. This version is permanently enabled. It also saves input even when you use M-r/M-s, and it binds "C-c C-g" to a new function `comint-restore-input', so no matter where you are on the history ring, you can zap back to your stranded partial input with C-c C-g. Let me know if that's a good binding (and where it should be documented). JD Index: comint.el =================================================================== RCS file: /sources/emacs/emacs/lisp/comint.el,v retrieving revision 1.337 diff -c -r1.337 comint.el *** comint.el 27 Mar 2006 08:50:20 -0000 1.337 --- comint.el 18 Apr 2006 19:06:05 -0000 *************** *** 465,470 **** --- 465,471 ---- (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-g" '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,563 **** --- 559,567 ---- "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 **** --- 642,648 ---- (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,1020 **** --- 1020,1035 ---- (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,1043 **** 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." --- 1050,1067 ---- arg))) (defun comint-previous-input (arg) ! "Cycle backwards through input history, saving input." (interactive "*p") ! (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,1082 **** --- 1101,1114 ---- (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,1100 **** ;; Has a match been found? (if (null pos) (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) --- 1120,1132 ---- ;; 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)) ! (comint-delete-input) (insert (ring-ref comint-input-ring pos))))) (defun comint-next-matching-input (regexp n)