denny@mcmi.UUCP (09/18/87)
This is an updated version of the code I previously distributed via
mail request only. It has been running at several sites, and I feel
that it is now ready for general distribution.
For those of you who have inquired about command name completion:
Having just gone through a change of jobs and cities (I know...
excuses, excuses), I haven't had much time to work on it. Soon is
the best that I can say.
Please send enhancement suggestions and bug reports directly to me.
Denny ihnp4!ohgua!ugn!mcmi!denny
The diffs below are based on the 18.47 distribution.
------------------------------------------------------------------
*** shell.el.org Tue Aug 18 12:02:30 1987
--- shell.el Tue Aug 18 13:59:56 1987
***************
*** 43,48
(defvar explicit-shell-file-name nil
"*If non-nil, is file name to use for explicitly requested inferior shell.")
;In loaddefs.el now.
;(defconst shell-prompt-pattern
; "^[^#$%>]*[#$%>] *"
--- 43,54 -----
(defvar explicit-shell-file-name nil
"*If non-nil, is file name to use for explicitly requested inferior shell.")
+ (defvar shell-completions-window nil
+ "If non-nil, completion window requires cleaning up.")
+
+ (defvar shell-token-pattern "[ \t\n()<>&|;]"
+ "*Regexp used by shell name completion to mark path name boundries.")
+
;In loaddefs.el now.
;(defconst shell-prompt-pattern
; "^[^#$%>]*[#$%>] *"
***************
*** 90,95
nil
(setq shell-mode-map (make-sparse-keymap))
(define-key shell-mode-map "\C-m" 'shell-send-input)
(define-key shell-mode-map "\C-c\C-d" 'shell-send-eof)
(define-key shell-mode-map "\C-c\C-u" 'kill-shell-input)
(define-key shell-mode-map "\C-c\C-w" 'backward-kill-word)
--- 96,102 -----
nil
(setq shell-mode-map (make-sparse-keymap))
(define-key shell-mode-map "\C-m" 'shell-send-input)
+ (define-key shell-mode-map "\C-i" 'shell-file-name-completion)
(define-key shell-mode-map "\C-c\C-d" 'shell-send-eof)
(define-key shell-mode-map "\C-c\C-u" 'kill-shell-input)
(define-key shell-mode-map "\C-c\C-w" 'backward-kill-word)
***************
*** 98,104
(define-key shell-mode-map "\C-c\C-\\" 'quit-shell-subjob)
(define-key shell-mode-map "\C-c\C-o" 'kill-output-from-shell)
(define-key shell-mode-map "\C-c\C-r" 'show-output-from-shell)
! (define-key shell-mode-map "\C-c\C-y" 'copy-last-shell-input))
(defvar explicit-csh-args
(if (eq system-type 'hpux)
--- 105,115 -----
(define-key shell-mode-map "\C-c\C-\\" 'quit-shell-subjob)
(define-key shell-mode-map "\C-c\C-o" 'kill-output-from-shell)
(define-key shell-mode-map "\C-c\C-r" 'show-output-from-shell)
! (define-key shell-mode-map "\C-c\C-y" 'copy-last-shell-input)
! (define-key shell-mode-map "\C-c\C-k" 'kill-all-output-from-shell)
! (define-key shell-mode-map "\C-c\C-n" 'shell-next-command)
! (define-key shell-mode-map "\C-c\C-p" 'shell-prev-command))
!
(defvar explicit-csh-args
(if (eq system-type 'hpux)
***************
*** 194,199
by matching the regexp that is the value of shell-prompt-pattern if possible.
This regexp should start with \"^\"."
(interactive)
(end-of-line)
(if (eobp)
(progn
--- 205,211 -----
by matching the regexp that is the value of shell-prompt-pattern if possible.
This regexp should start with \"^\"."
(interactive)
+ (shell-completion-cleanup)
(end-of-line)
(if (eobp)
(progn
***************
*** 280,285
(interactive)
(process-send-eof))
(defun kill-output-from-shell ()
"Kill all output from shell since last input."
(interactive)
--- 292,359 -----
(interactive)
(process-send-eof))
+
+ (defun shell-file-name-completion ()
+ "Preform file name completion in shell mode"
+ (interactive)
+ (let ((shell-expand-string nil)
+ (shell-expand-begin nil)
+ (shell-expand-end nil)
+ (shell-expand-dir nil)
+ (shell-expand-file nil)
+ (shell-expand-completion nil))
+
+ ;; look back
+ (re-search-backward shell-token-pattern nil t)
+ (forward-char)
+ (setq shell-expand-begin (point))
+ ;; look ahead
+ (if (re-search-forward shell-token-pattern nil 0) (backward-char))
+ (setq shell-expand-end (point))
+
+ ;; the name requiring expansion
+ (setq shell-expand-string
+ (buffer-substring shell-expand-begin shell-expand-end))
+ ;; directory part of name
+ (setq shell-expand-dir
+ (or (file-name-directory shell-expand-string) default-directory))
+ ;; file part of name
+ (setq shell-expand-file
+ (file-name-nondirectory shell-expand-string))
+
+ ;; do the expansion
+ (setq shell-expand-completion
+ (file-name-completion shell-expand-file shell-expand-dir))
+ ;; display the results
+ (if (eq shell-expand-completion t) (message "Sole completion")
+ (if (eq shell-expand-completion nil) (message "No match")
+ (if (equal shell-expand-completion shell-expand-file)
+ (progn
+ (if shell-completions-window nil
+ (setq shell-completions-window
+ (current-window-configuration)))
+ (message "Making completion list...")
+ (with-output-to-temp-buffer " *Completions*"
+ (display-completion-list
+ (sort (file-name-all-completions
+ shell-expand-completion shell-expand-dir)
+ 'string-lessp)))
+ (message ""))
+ ;; put in the expansion
+ (search-backward shell-expand-file)
+ (replace-match shell-expand-completion t t))))))
+
+
+ (defun shell-completion-cleanup ()
+ "Clean up windows after shell file name completion."
+ (interactive)
+ (if shell-completions-window
+ (save-excursion
+ (set-window-configuration shell-completions-window)
+ (setq shell-completions-window nil))))
+
+
+
(defun kill-output-from-shell ()
"Kill all output from shell since last input."
(interactive)
***************
*** 289,294
(insert "*** output flushed ***\n")
(goto-char (point-max)))
(defun show-output-from-shell ()
"Display start of this batch of shell output at top of window.
Also put cursor there."
--- 363,388 -----
(insert "*** output flushed ***\n")
(goto-char (point-max)))
+ (defun kill-all-output-from-shell ()
+ "Kill shell buffer above current prompt."
+ (interactive)
+ (goto-char (point-max))
+ (re-search-backward shell-prompt-pattern nil t)
+ (kill-region (point-min) (point))
+ (goto-char (point-max)))
+
+ (defun shell-next-command ()
+ "Search for the next command in a shell."
+ (interactive)
+ (re-search-forward shell-prompt-pattern nil t))
+
+ (defun shell-prev-command ()
+ "Search for the previous command in a shell."
+ (interactive)
+ (beginning-of-line)
+ (re-search-backward shell-prompt-pattern nil t)
+ (re-search-forward shell-prompt-pattern nil t))
+
(defun show-output-from-shell ()
"Display start of this batch of shell output at top of window.
Also put cursor there."
***************
*** 325,330
(defun kill-shell-input ()
"Kill all text since last stuff output by the shell or its subjobs."
(interactive)
(kill-region (process-mark (get-buffer-process (current-buffer)))
(point)))
--- 419,425 -----
(defun kill-shell-input ()
"Kill all text since last stuff output by the shell or its subjobs."
(interactive)
+ (shell-completion-cleanup)
(kill-region (process-mark (get-buffer-process (current-buffer)))
(point)))