emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: comint-accumulate-marker


From: JD Smith
Subject: Re: comint-accumulate-marker
Date: Tue, 18 Apr 2006 12:10:45 -0700


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)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]