2013-09-12 16:15:53 -04:00
|
|
|
;;; em-script.el --- Eshell script files -*- lexical-binding:t -*-
|
2000-06-23 05:24:10 +00:00
|
|
|
|
2015-01-01 14:26:41 -08:00
|
|
|
;; Copyright (C) 1999-2015 Free Software Foundation, Inc.
|
2000-06-23 05:24:10 +00:00
|
|
|
|
2000-10-16 12:27:09 +00:00
|
|
|
;; Author: John Wiegley <johnw@gnu.org>
|
|
|
|
|
2000-06-23 05:24:10 +00:00
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 03:36:21 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
2000-06-23 05:24:10 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 03:36:21 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
2000-06-23 05:24:10 +00:00
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2008-05-06 03:36:21 +00:00
|
|
|
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
2000-06-23 05:24:10 +00:00
|
|
|
|
2007-12-05 07:03:18 +00:00
|
|
|
;;; Commentary:
|
2000-06-23 05:24:10 +00:00
|
|
|
|
2007-12-05 07:03:18 +00:00
|
|
|
;;; Code:
|
2000-06-23 05:24:10 +00:00
|
|
|
|
2002-11-29 09:43:35 +00:00
|
|
|
(require 'eshell)
|
More CL cleanups and reduction of use of cl.el.
* woman.el, winner.el, vc/vc-rcs.el, vc/vc-hooks.el, vc/vc-hg.el:
* vc/vc-git.el, vc/vc-dir.el, vc/vc-bzr.el, vc/vc-annotate.el:
* textmodes/tex-mode.el, textmodes/sgml-mode.el, tar-mode.el:
* strokes.el, ses.el, server.el, progmodes/js.el, progmodes/gdb-mi.el:
* progmodes/flymake.el, progmodes/ebrowse.el, progmodes/compile.el:
* play/tetris.el, play/snake.el, play/pong.el, play/landmark.el:
* play/hanoi.el, play/decipher.el, play/5x5.el, nxml/nxml-mode.el:
* net/secrets.el, net/quickurl.el, midnight.el, mail/footnote.el:
* image-dired.el, ibuffer.el, ibuf-macs.el, ibuf-ext.el, hexl.el:
* eshell/eshell.el, eshell/esh-io.el, eshell/esh-ext.el:
* eshell/esh-cmd.el, eshell/em-ls.el, eshell/em-hist.el:
* eshell/em-cmpl.el, eshell/em-banner.el:
* url/url.el, url/url-queue.el, url/url-parse.el, url/url-http.el:
* url/url-future.el, url/url-dav.el, url/url-cookie.el:
* calendar/parse-time.el, test/eshell.el: Use cl-lib.
* wid-browse.el, wdired.el, vc/vc.el, vc/vc-mtn.el, vc/vc-cvs.el:
* vc/vc-arch.el, tree-widget.el, textmodes/texinfo.el:
* textmodes/refill.el, textmodes/css-mode.el, term/tvi970.el:
* term/ns-win.el, term.el, shell.el, ps-samp.el:
* progmodes/perl-mode.el, progmodes/pascal.el, progmodes/gud.el:
* progmodes/glasses.el, progmodes/etags.el, progmodes/cwarn.el:
* play/gamegrid.el, play/bubbles.el, novice.el, notifications.el:
* net/zeroconf.el, net/xesam.el, net/snmp-mode.el, net/mairix.el:
* net/ldap.el, net/eudc.el, net/browse-url.el, man.el:
* mail/mailheader.el, mail/feedmail.el:
* url/url-util.el, url/url-privacy.el, url/url-nfs.el, url/url-misc.el:
* url/url-methods.el, url/url-gw.el, url/url-file.el, url/url-expand.el:
Dont use CL.
* ibuf-ext.el (ibuffer-mark-old-buffers): Use float-time.
* eshell/esh-opt.el (eshell-eval-using-options): Quote code with
`lambda' rather than with `quote'.
(eshell-do-opt): Adjust accordingly.
(eshell-process-option): Simplify.
* eshell/esh-var.el:
* eshell/em-script.el: Require `esh-opt' for eshell-eval-using-options.
* emacs-pcase.el (pcase--dontcare-upats, pcase--let*)
(pcase--expand, pcase--u1): Rename pcase's internal `dontcare' pattern
to `pcase--dontcare'.
* emacs-cl.el (labels): Mark obsolete.
(cl--letf, letf): Move to cl-lib.
(cl--letf*, letf*): Remove.
* emacs-cl-lib.el (cl-nth-value): Use defalias.
* emacs-cl-macs.el (cl-dolist, cl-dotimes): Add indent rule.
(cl-progv): Rewrite.
(cl--letf, cl-letf): Move from cl.el.
(cl-letf*): New macro.
* emacs-cl-extra.el (cl--progv-before, cl--progv-after): Remove.
2012-07-11 19:13:41 -04:00
|
|
|
(require 'esh-opt)
|
2002-11-29 09:43:35 +00:00
|
|
|
|
2008-05-21 03:51:08 +00:00
|
|
|
;;;###autoload
|
Replace eshell-defgroup with plain defgroup
Borrowing a trick from vc-sccs.el, wrap the defgroup in a progn
so that the whole thing ends up in the generated autoload file,
esh-groups.el.
* em-alias.el, em-banner.el, em-basic.el, em-cmpl.el, em-dirs.el:
* em-glob.el, em-hist.el, em-ls.el, em-pred.el, em-prompt.el:
* em-rebind.el, em-script.el, em-smart.el, em-term.el, em-unix.el:
* em-xtra.el: Replace eshell-defgroup with (progn (defgroup.
* eshell.el (eshell-defgroup): Remove alias.
2012-06-27 00:08:06 -07:00
|
|
|
(progn
|
|
|
|
(defgroup eshell-script nil
|
2000-06-23 05:24:10 +00:00
|
|
|
"This module allows for the execution of files containing Eshell
|
|
|
|
commands, as a script file."
|
|
|
|
:tag "Running script files."
|
Replace eshell-defgroup with plain defgroup
Borrowing a trick from vc-sccs.el, wrap the defgroup in a progn
so that the whole thing ends up in the generated autoload file,
esh-groups.el.
* em-alias.el, em-banner.el, em-basic.el, em-cmpl.el, em-dirs.el:
* em-glob.el, em-hist.el, em-ls.el, em-pred.el, em-prompt.el:
* em-rebind.el, em-script.el, em-smart.el, em-term.el, em-unix.el:
* em-xtra.el: Replace eshell-defgroup with (progn (defgroup.
* eshell.el (eshell-defgroup): Remove alias.
2012-06-27 00:08:06 -07:00
|
|
|
:group 'eshell-module))
|
2000-06-23 05:24:10 +00:00
|
|
|
|
|
|
|
;;; User Variables:
|
|
|
|
|
2011-03-04 20:11:05 -08:00
|
|
|
(defcustom eshell-script-load-hook nil
|
Cosmetic doc fixes for eshell.
* eshell/em-alias.el, eshell/em-banner.el, eshell/em-basic.el:
* eshell/em-cmpl.el, eshell/em-dirs.el, eshell/em-glob.el:
* eshell/em-hist.el, eshell/em-ls.el, eshell/em-pred.el:
* eshell/em-prompt.el, eshell/em-rebind.el, eshell/em-script.el:
* eshell/em-smart.el, eshell/em-term.el, eshell/em-unix.el:
* eshell/esh-cmd.el, eshell/esh-ext.el, eshell/esh-io.el:
* eshell/esh-mode.el, eshell/esh-proc.el, eshell/esh-test.el:
* eshell/esh-util.el, eshell/esh-var.el:
Remove leading `*' from docs of faces and defcustoms.
2010-09-25 14:51:55 -07:00
|
|
|
"A list of functions to call when loading `eshell-script'."
|
2011-03-04 20:11:05 -08:00
|
|
|
:version "24.1" ; removed eshell-script-initialize
|
2000-06-23 05:24:10 +00:00
|
|
|
:type 'hook
|
|
|
|
:group 'eshell-script)
|
|
|
|
|
2009-09-13 02:16:25 +00:00
|
|
|
(defcustom eshell-login-script (expand-file-name "login" eshell-directory-name)
|
Cosmetic doc fixes for eshell.
* eshell/em-alias.el, eshell/em-banner.el, eshell/em-basic.el:
* eshell/em-cmpl.el, eshell/em-dirs.el, eshell/em-glob.el:
* eshell/em-hist.el, eshell/em-ls.el, eshell/em-pred.el:
* eshell/em-prompt.el, eshell/em-rebind.el, eshell/em-script.el:
* eshell/em-smart.el, eshell/em-term.el, eshell/em-unix.el:
* eshell/esh-cmd.el, eshell/esh-ext.el, eshell/esh-io.el:
* eshell/esh-mode.el, eshell/esh-proc.el, eshell/esh-test.el:
* eshell/esh-util.el, eshell/esh-var.el:
Remove leading `*' from docs of faces and defcustoms.
2010-09-25 14:51:55 -07:00
|
|
|
"If non-nil, a file to invoke when starting up Eshell interactively.
|
2000-06-23 05:24:10 +00:00
|
|
|
This file should be a file containing Eshell commands, where comment
|
|
|
|
lines begin with '#'."
|
|
|
|
:type 'file
|
|
|
|
:group 'eshell-script)
|
|
|
|
|
2009-09-13 02:16:25 +00:00
|
|
|
(defcustom eshell-rc-script (expand-file-name "profile" eshell-directory-name)
|
Cosmetic doc fixes for eshell.
* eshell/em-alias.el, eshell/em-banner.el, eshell/em-basic.el:
* eshell/em-cmpl.el, eshell/em-dirs.el, eshell/em-glob.el:
* eshell/em-hist.el, eshell/em-ls.el, eshell/em-pred.el:
* eshell/em-prompt.el, eshell/em-rebind.el, eshell/em-script.el:
* eshell/em-smart.el, eshell/em-term.el, eshell/em-unix.el:
* eshell/esh-cmd.el, eshell/esh-ext.el, eshell/esh-io.el:
* eshell/esh-mode.el, eshell/esh-proc.el, eshell/esh-test.el:
* eshell/esh-util.el, eshell/esh-var.el:
Remove leading `*' from docs of faces and defcustoms.
2010-09-25 14:51:55 -07:00
|
|
|
"If non-nil, a file to invoke whenever Eshell is started.
|
2000-06-23 05:24:10 +00:00
|
|
|
This includes when running `eshell-command'."
|
|
|
|
:type 'file
|
|
|
|
:group 'eshell-script)
|
|
|
|
|
|
|
|
;;; Functions:
|
|
|
|
|
|
|
|
(defun eshell-script-initialize ()
|
|
|
|
"Initialize the script parsing code."
|
|
|
|
(make-local-variable 'eshell-interpreter-alist)
|
|
|
|
(setq eshell-interpreter-alist
|
2013-06-09 18:39:40 +12:00
|
|
|
(cons (cons #'(lambda (file args)
|
|
|
|
(string= (file-name-nondirectory file)
|
|
|
|
"eshell"))
|
|
|
|
'eshell/source)
|
2000-06-23 05:24:10 +00:00
|
|
|
eshell-interpreter-alist))
|
2000-10-29 05:18:48 +00:00
|
|
|
(make-local-variable 'eshell-complex-commands)
|
|
|
|
(setq eshell-complex-commands
|
|
|
|
(append '("source" ".") eshell-complex-commands))
|
2000-06-23 05:24:10 +00:00
|
|
|
;; these two variables are changed through usage, but we don't want
|
|
|
|
;; to ruin it for other modules
|
|
|
|
(let (eshell-inside-quote-regexp
|
|
|
|
eshell-outside-quote-regexp)
|
|
|
|
(and (not eshell-non-interactive-p)
|
|
|
|
eshell-login-script
|
|
|
|
(file-readable-p eshell-login-script)
|
|
|
|
(eshell-do-eval
|
|
|
|
(list 'eshell-commands
|
|
|
|
(catch 'eshell-replace-command
|
|
|
|
(eshell-source-file eshell-login-script))) t))
|
|
|
|
(and eshell-rc-script
|
|
|
|
(file-readable-p eshell-rc-script)
|
|
|
|
(eshell-do-eval
|
|
|
|
(list 'eshell-commands
|
|
|
|
(catch 'eshell-replace-command
|
|
|
|
(eshell-source-file eshell-rc-script))) t))))
|
|
|
|
|
|
|
|
(defun eshell-source-file (file &optional args subcommand-p)
|
|
|
|
"Execute a series of Eshell commands in FILE, passing ARGS.
|
|
|
|
Comments begin with '#'."
|
|
|
|
(interactive "f")
|
|
|
|
(let ((orig (point))
|
|
|
|
(here (point-max))
|
2010-11-23 12:36:15 -05:00
|
|
|
(inhibit-point-motion-hooks t))
|
2000-06-23 05:24:10 +00:00
|
|
|
(goto-char (point-max))
|
2010-11-23 12:36:15 -05:00
|
|
|
(with-silent-modifications
|
|
|
|
;; FIXME: Why not use a temporary buffer and avoid this
|
|
|
|
;; "insert&delete" business? --Stef
|
|
|
|
(insert-file-contents file)
|
|
|
|
(goto-char (point-max))
|
|
|
|
(throw 'eshell-replace-command
|
|
|
|
(prog1
|
|
|
|
(list 'let
|
|
|
|
(list (list 'eshell-command-name (list 'quote file))
|
|
|
|
(list 'eshell-command-arguments
|
|
|
|
(list 'quote args)))
|
|
|
|
(let ((cmd (eshell-parse-command (cons here (point)))))
|
|
|
|
(if subcommand-p
|
|
|
|
(setq cmd (list 'eshell-as-subcommand cmd)))
|
|
|
|
cmd))
|
|
|
|
(delete-region here (point))
|
|
|
|
(goto-char orig))))))
|
2000-06-23 05:24:10 +00:00
|
|
|
|
|
|
|
(defun eshell/source (&rest args)
|
|
|
|
"Source a file in a subshell environment."
|
|
|
|
(eshell-eval-using-options
|
|
|
|
"source" args
|
|
|
|
'((?h "help" nil nil "show this usage screen")
|
|
|
|
:show-usage
|
|
|
|
:usage "FILE [ARGS]
|
|
|
|
Invoke the Eshell commands in FILE in a subshell, binding ARGS to $1,
|
|
|
|
$2, etc.")
|
|
|
|
(eshell-source-file (car args) (cdr args) t)))
|
|
|
|
|
Set the property `eshell-no-numeric-conversions' on the following
functions (which all deal with filesystem entities, and never Lisp
numerical values): eshell/cd, eshell/pushd, eshell/popd, eshell/ls,
eshell/source, eshell/., eshell/man, eshell/rm, eshell/mkdir,
eshell/rmdir, eshell/mv, eshell/cp, eshell/ln, eshell/cat,
eshell/make, eshell/diff, eshell/locate, eshell/occur, eshell/which,
eshell/addpath.
2001-05-10 03:47:24 +00:00
|
|
|
(put 'eshell/source 'eshell-no-numeric-conversions t)
|
|
|
|
|
2000-06-23 05:24:10 +00:00
|
|
|
(defun eshell/. (&rest args)
|
|
|
|
"Source a file in the current environment."
|
|
|
|
(eshell-eval-using-options
|
|
|
|
"." args
|
|
|
|
'((?h "help" nil nil "show this usage screen")
|
|
|
|
:show-usage
|
|
|
|
:usage "FILE [ARGS]
|
|
|
|
Invoke the Eshell commands in FILE within the current shell
|
|
|
|
environment, binding ARGS to $1, $2, etc.")
|
|
|
|
(eshell-source-file (car args) (cdr args))))
|
|
|
|
|
Set the property `eshell-no-numeric-conversions' on the following
functions (which all deal with filesystem entities, and never Lisp
numerical values): eshell/cd, eshell/pushd, eshell/popd, eshell/ls,
eshell/source, eshell/., eshell/man, eshell/rm, eshell/mkdir,
eshell/rmdir, eshell/mv, eshell/cp, eshell/ln, eshell/cat,
eshell/make, eshell/diff, eshell/locate, eshell/occur, eshell/which,
eshell/addpath.
2001-05-10 03:47:24 +00:00
|
|
|
(put 'eshell/. 'eshell-no-numeric-conversions t)
|
|
|
|
|
2007-12-05 07:03:18 +00:00
|
|
|
(provide 'em-script)
|
2000-06-23 05:24:10 +00:00
|
|
|
|
2008-05-21 03:51:08 +00:00
|
|
|
;; Local Variables:
|
|
|
|
;; generated-autoload-file: "esh-groups.el"
|
|
|
|
;; End:
|
|
|
|
|
2000-06-23 05:24:10 +00:00
|
|
|
;;; em-script.el ends here
|