jcgs@harlqn.UUCP (John Sturdy) (09/26/88)
Someone has asked for the code, despite the warning about its slowness, so here it is. Suggestion from jr: save the data it finds in a file between emacs sessions. ;;; shell-command.el ;;; Last edited: Fri Sep 23 16:23:24 1988 by jcgs (John Sturdy) on harlqn (defvar unix-command-path-string (getenv "PATH") "String containing the Unix shell command search path.") (defun rec-pick-path-parts (string start) "Pick out directory names in STRING starting at START, returning them as a list." (let ((colon-place (string-match "\\:" string start))) (if colon-place (cons (substring string start colon-place) (rec-pick-path-parts string (1+ colon-place))) (cons (substring string start nil) nil)))) (defvar unix-command-path (rec-pick-path-parts unix-command-path-string 0) "List of directory names in unix command path.") (defun file-executable-p (filename) "Return whether the file named is executable as a shell command by the user." (let ((attribute-string (nth 8 (file-attributes filename)))) (and (string= (substring attribute-string 3 4) "x") (not (string= (substring attribute-string 0 1) "d"))))) (defun list-executables-in-file-list (file-list already-there) "Return a list of executable files from amongst FILE-LIST, tacked onto the front of ALREADY-THERE." (if file-list (if (file-executable-p (car file-list)) (cons (cons (file-name-nondirectory (car file-list)) nil) (list-executables-in-file-list (cdr file-list) already-there)) (list-executables-in-file-list (cdr file-list) already-there)) already-there)) (defun list-executables-on-path (path) "Return a list of executable files (not including directory names) in directories on PATH." (if path (list-executables-in-file-list (directory-files (car path) t) (list-executables-on-path (cdr path))) nil)) (defvar unix-command-list nil "alist whose element's cars are strings containing the names of all shell commands defined by executable files in directories mentioned in unix-command-path.") (defvar last-shell-command "" "The last shell command read by the shell command completion mechanism.") (defun insert-shell-command () "Read a shell command, with completion on names of executable files in directories along your shell PATH variable; insert the command in the current buffer at point, and advance point." (interactive) (if (null unix-command-list) (progn (message "Scanning your shell command path, this may take a while...") (setq unix-command-list (list-executables-on-path unix-command-path)))) (setq last-shell-command (completing-read "Shell command: " unix-command-list nil ; no predicate nil ; match not required nil)) ; no default string (insert last-shell-command " ")) ;;; end of shell-plus.el __John (jcgs@uk.co.harlqn)