From a277229e6b95a3610a88fcd5cd6f58d99414b95f Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Tue, 9 Oct 2001 02:26:00 +0000 Subject: [PATCH] (comint-insert-previous-argument): New function. (comint-mode-map): Bind `C-c .' to `comint-input-previous-argument'. (comint-insert-previous-argument-last-start-pos) (comint-insert-previous-argument-last-index): New variables. --- lisp/comint.el | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/lisp/comint.el b/lisp/comint.el index 71d0cae28ea..4be70c63dfa 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -559,6 +559,7 @@ Entry to this mode runs the hooks on `comint-mode-hook'." (define-key comint-mode-map "\C-c\C-p" 'comint-previous-prompt) (define-key comint-mode-map "\C-c\C-d" 'comint-send-eof) (define-key comint-mode-map "\C-c\C-s" 'comint-write-output) + (define-key comint-mode-map "\C-c." 'comint-insert-previous-argument) ;; Mouse Buttons: (define-key comint-mode-map [mouse-2] 'comint-insert-clicked-input) ;; Menu bars: @@ -1970,6 +1971,7 @@ This function could be in the list `comint-output-filter-functions'." (comint-snapshot-last-prompt)) (comint-snapshot-last-prompt)) (process-send-region process start end)) + ;; Random input hackage @@ -2197,6 +2199,58 @@ the beginning of the Nth previous `input' field, otherwise, it means the Nth occurance of text matching `comint-prompt-regexp'." (interactive "p") (comint-next-prompt (- n))) + +;; State used by `comint-insert-previous-argument' when cycling. +(defvar comint-insert-previous-argument-last-start-pos nil) +(make-variable-buffer-local 'comint-insert-previous-argument-last-start-pos) +(defvar comint-insert-previous-argument-last-index nil) +(make-variable-buffer-local 'comint-insert-previous-argument-last-index) + +;; Needs fixing: +;; make comint-arguments understand negative indices as bash does +(defun comint-insert-previous-argument (index) + "Insert the INDEXth argument from the previous comint command-line at point. +Spaces are added at beginning and/or end of the inserted string if +necessary to ensure that it's separated from adjacent arguments. +Interactively, if no prefix argument is given, the last argument is inserted. +Repeated interactive invocations will cycle through the same argument +from progressively earlier commands (using the value of INDEX specified +with the first command). +This command is like `M-.' in bash." + (interactive "P") + (unless (null index) + (setq index (prefix-numeric-value index))) + (cond ((eq last-command this-command) + ;; Delete last input inserted by this command. + (delete-region comint-insert-previous-argument-last-start-pos (point)) + (setq index comint-insert-previous-argument-last-index)) + (t + ;; This is a non-repeat invocation, so initialize state. + (setq comint-input-ring-index nil) + (setq comint-insert-previous-argument-last-index index) + (when (null comint-insert-previous-argument-last-start-pos) + ;; First usage; initialize to a marker + (setq comint-insert-previous-argument-last-start-pos + (make-marker))))) + ;; Make sure we're not in the prompt, and add a beginning space if necess. + (if (<= (point) (comint-line-beginning-position)) + (comint-bol) + (just-one-space)) + ;; Remember the beginning of what we insert, so we can delete it if + ;; the command is repeated. + (set-marker comint-insert-previous-argument-last-start-pos (point)) + ;; Insert the argument. + (let ((input-string (comint-previous-input-string 0))) + (when (string-match "[ \t\n]*&" input-string) + ;; strip terminating '&' + (setq input-string (substring input-string 0 (match-beginning 0)))) + (insert (comint-arguments input-string index index))) + ;; Make next invocation return arg from previous input + (setq comint-input-ring-index (1+ (or comint-input-ring-index 0))) + ;; Add a terminating space if necessary. + (unless (eolp) + (just-one-space))) + ;; Support for source-file processing commands. ;;============================================================================ @@ -2745,6 +2799,7 @@ Typing SPC flushes the help buffer." (if (eq first ?\ ) (set-window-configuration conf) (setq unread-command-events (listify-key-sequence key))))))) + (defun comint-get-next-from-history () "After fetching a line from input history, this fetches the following line. @@ -3161,6 +3216,7 @@ REGEXP-GROUP is the regular expression group in REGEXP to use." "^No history$" "^Not found$" ; Too common? "^Current buffer has no process$")) + ;; Converting process modes to use comint mode ;; =========================================================================== @@ -3245,6 +3301,7 @@ REGEXP-GROUP is the regular expression group in REGEXP to use." ;; You could use comint-dynamic-simple-complete to do the bulk of the ;; completion job. + (provide 'comint) ;;; comint.el ends here -- 2.39.2