drw@culdev1.UUCP (Dale Worley) (10/22/87)
Here's a revision to Emacs M-x shell. This allows: M-x shell take me to my shell (start it if necessary) C-u - M-x shell make another shell for me (can be used more than once) extra shells are named *shell<2>*, etc. C-u 2 M-x shell take me to *shell<2>* beeps if you haven't created it yet, so you don't accidentally start up another shell Here's the official documentation: A negative argument causes further shell windows (*shell<2>*, *shell<3>, etc.) to be created. A positive argument causes the shell window with that number to be selected, instead of *shell* (which is number 1). Shells with numbers > 1 must be created explicitly; shell 1 is created automatically if it is selected but does not already exist. (defun shell (&optional shell-number) "Run an inferior shell, with I/O through buffer *shell*. If buffer exists but shell process is not running, make new shell. Program used comes from variable explicit-shell-file-name, or (if that is nil) from the ESHELL environment variable, or else from SHELL if there is no ESHELL. If a file ~/.emacs_SHELLNAME exists, it is given as initial input (Note that this may lose due to a timing error if the shell discards input when it starts up.) The buffer is put in shell-mode, giving commands for sending input and controlling the subjobs of the shell. See shell-mode. See also variable shell-prompt-pattern. The shell file name (sans directories) is used to make a symbol name such as `explicit-csh-arguments'. If that symbol is a variable, its value is used as a list of arguments when invoking the shell. Otherwise, one argument `-i' is passed to the shell. Note that many people's .cshrc files unconditionally clear the prompt. If yours does, you will probably want to change it. A negative argument causes further shell windows (*shell<2>*, *shell<3>, etc.) to be created. A positive argument causes the shell window with that number to be selected, instead of *shell* (which is number 1). Shells with numbers > 1 must be created explicitly; shell 1 is created automatically if it is selected but does not already exist." (interactive "p") (let* ((prog (or explicit-shell-file-name (getenv "ESHELL") (getenv "SHELL") "/bin/sh")) (name (file-name-nondirectory prog)) (dont nil) shell-name) ; process the user argument (cond ; a null argument is the same as 1 ((null shell-number) (setq shell-number 1)) ; a negative argument means find a new shell number ((< shell-number 1) (progn (setq shell-number 2) (while (get-buffer (concat "*shell<" (int-to-string shell-number) ">*")) (setq shell-number (1+ shell-number))))) ; if he's trying to select a shell > 1, check to see if it exists first ((> shell-number 1) (if (null (get-buffer (concat "*shell<" (int-to-string shell-number) ">*"))) (progn (ding) (setq dont t))))) ; if we haven't found an error, do it (if (not dont) (progn (setq shell-name (if (eq shell-number 1) "shell" (concat "shell<" (int-to-string shell-number) ">"))) (switch-to-buffer (apply 'make-shell shell-name prog (if (file-exists-p (concat "~/.emacs_" name)) (concat "~/.emacs_" name)) (let ((symbol (intern-soft (concat "explicit-" name "-args")))) (if (and symbol (boundp symbol)) (symbol-value symbol) '("-i"))))))))) Enjoy! Dale -- Dale Worley Cullinet Software ARPA: culdev1!drw@eddie.mit.edu UUCP: ...!seismo!harvard!mit-eddie!culdev1!drw Give me money or kill me! Exercise your childishness -- remember, we are all 10 in some base.