From: John Wiegley Date: Fri, 1 Sep 2000 22:48:12 +0000 (+0000) Subject: See ChangeLog X-Git-Tag: emacs-pretest-21.0.90~1845 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=79cf8e808eed44d1fb836639a6ede0f19b92726d;p=emacs.git See ChangeLog --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d422cb057ae..0a16adc5b5b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,28 @@ +2000-09-01 John Wiegley + + * pcomplete.el (pcomplete-dirs-or-entries): Added a missing + predicate, which caused entries in the completion list to be + doubled. + +2000-08-30 John Wiegley + + * eshell/esh-mode.el (eshell-mode): Bound C-c M-d to toggle direct + sending to subprocesses. Also, hook pre-command-hook if + `eshell-send-direct-to-subprocesses' is non-nil. + (eshell-send-direct-to-subprocesses): New config variable. If t, + subprocess input is send immediately. + (eshell-toggle-direct-send): New function. + (eshell-self-insert-command): New function. + (eshell-intercept-commands): New function. + (eshell-send-input): If direct subprocess sending is enabled, + don't echo any input to the Eshell buffer. Let the subprocess + handle that. This requires "stty echo" in bash, for example. + +2000-08-28 John Wiegley + + * eshell/esh-var.el (pcomplete/eshell-mode/unset): Added + completion function for Eshell's implementation of `unset'. + 2000-09-02 Eli Zaretskii * info.el (Info-directory-list): Doc fix. diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el index 2db4f2a10b6..1d79c8af701 100644 --- a/lisp/eshell/esh-mode.el +++ b/lisp/eshell/esh-mode.el @@ -107,6 +107,11 @@ The input is contained in the region from `eshell-last-input-start' to :type 'hook :group 'eshell-mode) +(defcustom eshell-send-direct-to-subprocesses nil + "*If t, send any input immediately to a subprocess." + :type 'boolean + :group 'eshell-mode) + (defcustom eshell-expand-input-functions nil "*Functions to call before input is parsed. Each function is passed two arguments, which bounds the region of the @@ -331,6 +336,7 @@ sessions, such as when using `eshell-command'.") (if (eq (key-binding [(meta ?.)]) 'find-tag) (define-key eshell-mode-map [(meta ?.)] 'eshell-find-tag)) (define-key eshell-command-map [(meta ?o)] 'eshell-mark-output) + (define-key eshell-command-map [(meta ?d)] 'eshell-toggle-direct-send) (define-key eshell-command-map [(control ?a)] 'eshell-bol) (define-key eshell-command-map [(control ?b)] 'eshell-backward-argument) @@ -414,9 +420,13 @@ sessions, such as when using `eshell-command'.") (if (and load-hook (boundp load-hook)) (run-hooks load-hook)))) - (when eshell-scroll-to-bottom-on-input - (make-local-hook 'pre-command-hook) - (add-hook 'pre-command-hook 'eshell-preinput-scroll-to-bottom t t)) + (make-local-hook 'pre-command-hook) + + (if eshell-send-direct-to-subprocesses + (add-hook 'pre-command-hook 'eshell-intercept-commands t t)) + + (if eshell-scroll-to-bottom-on-input + (add-hook 'pre-command-hook 'eshell-preinput-scroll-to-bottom t t)) (when eshell-scroll-show-maximum-output (set (make-local-variable 'scroll-conservatively) 1000)) @@ -471,6 +481,44 @@ sessions, such as when using `eshell-command'.") ;;; Internal Functions: +(defun eshell-toggle-direct-send () + (interactive) + (if eshell-send-direct-to-subprocesses + (progn + (setq eshell-send-direct-to-subprocesses nil) + (remove-hook 'pre-command-hook 'eshell-intercept-commands t) + (message "Sending subprocess input on RET")) + (setq eshell-send-direct-to-subprocesses t) + (add-hook 'pre-command-hook 'eshell-intercept-commands t t) + (message "Sending subprocess input directly"))) + +(defun eshell-self-insert-command (N) + (interactive "i") + (process-send-string + (eshell-interactive-process) + (char-to-string (if (symbolp last-command-char) + (get last-command-char 'ascii-character) + last-command-char)))) + +(defun eshell-intercept-commands () + (when (and (eshell-interactive-process) + (not (and (integerp last-input-event) + (memq last-input-event '(?\C-x ?\C-c))))) + (let ((possible-events (where-is-internal this-command)) + (name (symbol-name this-command)) + (intercept t)) + ;; Assume that any multikey combination which does NOT target an + ;; Eshell command, is a combo the user wants invoked rather than + ;; sent to the underlying subprocess. + (unless (and (> (length name) 7) + (equal (substring name 0 7) "eshell-")) + (while possible-events + (if (> (length (car possible-events)) 1) + (setq intercept nil possible-events nil) + (setq possible-events (cdr possible-events))))) + (if intercept + (setq this-command 'eshell-self-insert-command))))) + (defun eshell-find-tag (&optional tagname next-p regexp-p) "A special version of `find-tag' that ignores read-onlyness." (interactive) @@ -652,12 +700,15 @@ newline." (let ((copy (eshell-get-old-input use-region))) (goto-char eshell-last-output-end) (insert-and-inherit copy))) - (unless no-newline + (unless (or no-newline + (and eshell-send-direct-to-subprocesses + proc-running-p)) (insert-before-markers-and-inherit ?\n)) (if proc-running-p (progn (eshell-update-markers eshell-last-output-end) - (if (= eshell-last-input-start eshell-last-input-end) + (if (or eshell-send-direct-to-subprocesses + (= eshell-last-input-start eshell-last-input-end)) (unless no-newline (process-send-string (eshell-interactive-process) "\n")) (process-send-region (eshell-interactive-process) diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el index 34994630251..ddbcf257d7e 100644 --- a/lisp/eshell/esh-var.el +++ b/lisp/eshell/esh-var.el @@ -299,6 +299,13 @@ This function is explicit for adding to `eshell-parse-argument-hook'." (match-string 2 (car sets)))) (setq sets (cdr sets)))) +(defun pcomplete/eshell-mode/export () + "Completion function for Eshell's `export'." + (while (pcomplete-here + (if eshell-complete-export-definition + process-environment + (eshell-envvar-names))))) + (defun eshell/unset (&rest args) "Unset an environment variable." (while args @@ -306,12 +313,9 @@ This function is explicit for adding to `eshell-parse-argument-hook'." (setenv (car args) nil t)) (setq args (cdr args)))) -(defun pcomplete/eshell-mode/export () - "Completion function for Eshell's `export'." - (while (pcomplete-here - (if eshell-complete-export-definition - process-environment - (eshell-envvar-names))))) +(defun pcomplete/eshell-mode/unset () + "Completion function for Eshell's `unset'." + (while (pcomplete-here (eshell-envvar-names)))) (defun eshell/setq (&rest args) "Allow command-ish use of `setq'." diff --git a/lisp/pcomplete.el b/lisp/pcomplete.el index 4f506212230..218bc670f49 100644 --- a/lisp/pcomplete.el +++ b/lisp/pcomplete.el @@ -686,7 +686,11 @@ Magic characters are those in `pcomplete-arg-quote-list'." (defsubst pcomplete-dirs-or-entries (&optional regexp predicate) "Return either directories, or qualified entries." (append (let ((pcomplete-stub pcomplete-stub)) - (pcomplete-entries regexp predicate)) + (pcomplete-entries + regexp (or predicate + (function + (lambda (path) + (not (file-directory-p path))))))) (pcomplete-entries nil 'file-directory-p))) (defun pcomplete-entries (&optional regexp predicate)