-*- mode: text; outline-layout: (1 :) -*- This is the NEWS file for Eshell, a command shell written in Emacs Lisp. Please note that proper documentation is still on its way. I expect that 2.4.1 will include the final Info document. * Changes in 2.4: ** Primarily a performance release, in addition to a few slight changes in avaliable configuration variables: ** There is a distinction made between "simple" and "complex" functions. Complex functions are likely to cause modifications to the running Eshell command form, and thus require a form of evaluation that simulates Scheme continuations. This uses three times as much memory as using plain `eval', which is entirely sufficient for "simple" commands such as ls, cp, mv, etc. NOTE: If you write a command named eshell/NAME, which must throw either `eshell-defer' or `eshell-replace-command', you must add NAME to `eshell-complex-commands'. ** `ls' now uses `eshell-ls-exclude-hidden' to indicate that files beginning with a dot should be excluded. ** `eshell-glob-show-progress' is now nil by default, since it slows down recursive glob processing so much. ** ange-ftp is no longer required to compile Eshell, which broke XEmacs users in 2.3.2. ** `eshell-ls-initial-args' is new, and should be used instead of command aliases to introduce a common argument (such as -h). ** Command aliases and smart scrolling are both very slow and memory consumptive, although not much can be done about this. For complicated commands that themselves run slowly, the percentile impact is little. But for quick, simple commands such as cd, ls, etc., command aliases should definitely be avoided. And while smart scrolling (eshell-smart) is quite useful, it should be run on fast machines to be fully appreciated. ** The new option `eshell-stringify-t' determines whether Lisp `t' should be rendered as `t', or not at all. The truth of an expression can still be determined using: file-exists-p FILE && echo true ** Added a new option `eshell-default-target-is-dot', which if non-nil states that the default target of cp/mv/ln is the current directory, which mirrors the behavior of most DOS shells. * Changes in 2.3.2: ** More bug fixes. Greatly improved remote directory support, since now nearly all file attributes can be viewed. * Changes in 2.3.1: ** This a bug fix release, in preparation for inclusion as part of Emacs 21. ** One little feature, however, did sneak in: C-c C-y in the Eshell buffer will repeat the last argument entered. With a numeric prefix, it will repeat that many arguments. * Changes in 2.3: ** The control flow commands: if, unless, while, until: now test the exit code of external processes against 0 for truth, and the value of Lisp forms against t. Before, they would only check to see if the test expression generated output. ** Because the Elisp manual declares that C-c LETTER bindings be left to the user, several of Eshell's command mode bindings had to be changed. The equivalences are: 2.2 2.3 ----- ------- C-c e C-c M-v C-c p C-c M-i C-c h C-c M-o C-c b C-c M-b C-c l C-c M-l C-c ? C-c M-q, C-c m C-c M-m C-c i C-c M-h ** Added support for a ksh feature: "cd OLD NEW". This will replace OLD with NEW in the current directory name (the name returned by `pwd' specifically), and then attempt to change to that directory. ** Added a syntax convenience for short-circuited commands: file-exists-p file.cpp && echo file exists file-exists-p file.cpp || echo file does not exist These operators test either the return code of the Lisp function on the left-hand side (to determine if it's non-nil), or the exit code of an external function (testing for 0), whichever is appropriate. The precedence for these operators is lower than sequencing (;) and backgrounding (&), but higher than redirection (>) and piping (|). Within themselves, they are strictly left to right. In this sense, it acts on a chain of success and failure, continuing to the next part of the chain only if the operator would allow it. ** Added three new configuration variables: eshell-mv-overwrite-files eshell-cp-overwrite-files eshell-ln-overwrite-files The default for all three is t. If nil, a --force argument (-f) is required before any of the three commands will overwrite anything. This is different from --interactive (-i), which queries before destruction. * Changes in 2.2: ** Added a "FEATURES" file to the distribution, which gives a brief overview of the features offered by Eshell. ** When `eshell-command' is invoked, the minibuffer is put into eshell-mode, making all of your preferred Eshell keybindings available (such as completion). To bind M-! to use eshell-command, customize the variable `eshell-prefer-to-shell'. ** If both the `eshell-history' and `eshell-rebind' are in use, C-r and C-s now behave similarly to bash. In 2.1, it was necessary to enter a full regexp in the minibuffer before searching would begin. Now it's incremental, using isearch. ** All of the optional Eshell extension modules are now named "em-NAME.el". Required modules are named "esh-NAME.el". This prevents name collisions from occuring on filesystems with 8.3 name limits. ** New conditional constructs: if, unless, while and until. They can be used in any of the following fashions: if (string-match "gumby" (system-name)) { echo true } else { echo false } while {/sbin/ifconfig | egrep ppp0} { echo connected via ppp } ** New ls option implemented: -I GLOB. Used to exclude files matching GLOB from the listing. ** New list argument modifiers: (:i/REGEXP/) strips all elements not matching REGEXP. (:x/REGEXP/) strips all elements that do match the REGEXP. Other delimiters can also be used: (:i,REGEXP,). ** Extended the file-time predicate, so that a file can be used as a comparison basis. Example: "ls *(a+'file.c')" displays files accessed before "file.c" was last accessed. ** The eshell-xtra extension module now offers some cl (Emacs Common Lisp) convenience functions. They make it much easier to perform complex manipulations on list arguments. Since glob patterns and command substitutions both yield list values, they can be very useful. To enable eshell-xtra, customize the variable `eshell-options-list'. # Return results of glob, minus happy.el. The same as: # *.el~happy.el remove happy.el *.el # Remove all duplicate lines from command results. The same as: # egrep johnw /etc/passwd | uniq remove-duplicates ${egrep johnw /etc/passwd} # Replace a given list element with another. The same as: # *.el(:s/em-ls\.el/happy.el/) substitute happy.el em-ls.el *.el # Return element value if member of a list. This is roughly # equivalent to: # echo *.el | egrep "^happy.el$" | uniq find happy.el *.el # Count the number of times a string appears in a list. # Equivalent to: # echo *.el | egrep "^happy.el$" | wc -l count happy.el *.el # Combine two lists, eliminating duplicates. Roughly equivalent # to (difference is that the result is always sorted): # echo *.el e* | sort | uniq union *.el e* # Return overlapping members of two lists. Roughly equivalent # to: # comm -12 $ $ intersection *.el e* # Return members unique to the first list. Roughly equivalent # to: # comm -23 $ $ set-difference *.el e* # Return all members that don't overlap. Roughly equivalent to: # append ${comm -23 $ $} # ${comm -13 $ $} set-exclusive-or *.el e* ** cp and mv now support moving and copying of directories. With mv, this happens whenever a directory name is given as a source. With cp, it requires using either the -R or -a switch. Please be careful when using these options. A good backup policy is always worth the trouble, and until Eshell has been in active use for a few years, I wouldn't want to start moving directories around without a backup. ** Copying and moving directly TO a tar archive is allowed. It creates the archive if it doesn't exist, and updates it if it does (removing the filesystem entries in the case of mv). Note that this happens only with multiple sources, or a single directory source. If the archive name ends in ".tgz", ".tz2", ".taz", ".taZ", ".tar.gz", ".tar.bz2", or ".tar.Z", it will be compressed/decompressed appropriately. Using "-v" after the command name also works, for displaying the filenames as they are copied/moved: cp -v some_dir some_dir.tar.bz2 ** Implemented `du' in Lisp. If an external version of `du' is present, it is always used instead, since the Lisp version is much slower, and blocks Emacs while it's running. ** Implemented `time' in Lisp. It only displays elapsed wall-clock time, since Emacs doesn't provide facilities for determining the user/kernel time consumed by a subprocess. Its usefulness lies in the fact that it can show the elapsed time of Lisp function calls, and it's available on all operating systems. ** If a `grep' command is neither redirected, nor part of a command pipeline, it's output will occur in a `*grep*' buffer, allowing the user to use C-x ` to move to the source of each hit. The applies to the whole grep family: egrep, fgrep, agrep, and glimpse. Disable by customizing `eshell-plain-grep-behavior'. ** If a `diff' command is neither redirected, nor part of a command pipeline -- and if diff-mode.el is loaded -- the command's output will occur in a separate buffer in diff-mode, allowing the user to use C-x ` to move to each source difference. Disable by customizing `eshell-plain-diff-behavior'. ** If a `locate' command is neither redirected, nor part of a command pipeline -- and if diff-mode.el is loaded -- the command's output will occur in a separate buffer in locate-mode. Disable by customizing `eshell-plain-locate-behavior'. ** If a `make' command is sent to the background and not redirected, it's output will appear in a `*compilation*', allowing the user to enter C-x ` to view the source of each error. ** New list argument modifier ':u'. This removes any contiguous duplicate strings in the list. Used after ':o', it's the same as "sort | uniq". Example: echo **/*.c(:o:u) # returns uniq'd list of all .c files ** Arguments to `which' that are preceded by an asterix `*', will bypass alias lookup. This makes it possible to find out what the alias will invoke. ** Three new globbing constructs: #?, #* and #+, which correspond to the ?, * and + regular expressions. To show the correlation: glob regexp ---- ------ * .* ? . #* * #+ + #? ? ## + # zsh compatible # * # zsh compatible ** Changed the syntax of variable name quoting. The new syntax is: $VAR-NAME # interpolate the value of `VAR-NAME' $'VAR'-NAME # interpolate `VAR', followed by "-NAME" $"VAR"-NAME # (same) $"VA$VAR"-NAME # interpolate `VAR' into "VA?", then interpolate into "?-NAME". This syntax can be nested. Previously the argument "$-name" would have interpolated the value of $LOGNAME into the argument, yielding something like "johnw-name". ** New syntax for temporary data interpolation. Example: xdu -n $ This invokes the command "du -k", copies the result to a temp file, then passes the name of that temp file as an argument to `xdu'. Once `xdu' completes, the temp file is deleted. This syntax is quite similar to "<{command}" in bash, except that Emacs doesn't permit writing to named pipes. This is also useful with commands that need multiple generated inputs: comm -23 $ \ $ This command will display all the .c files in "~/src" that are not in "/usr/src", with `comm' the only external process invoked. ** New commands: C-c ? and C-c m. These two popup quick help buffers showing the various glob predicate and argument modifier characters. All those characters were too easy to forget. ** Using the '@' predicate with globs containing directories now works. Example: "ls -d *(^@)" (anywhere containing directories). ** Corrected the behavior of "ls -L". ** rm, cp, mv and ln now support "-i" (--interactive), which queries before overwriting/deleting any files. This is the default when the user id is 0. ** Line splitting in command result interpolation now works. This makes the following possible: length {listify {egrep blah FILE}} This invokes "egrep blah FILE", interpolating the result as a Lisp list, with each element a line of the output. The above command will report how many hits were found. Note that the `listify' is required here, since if egrep finds only one match, it will return it as a string, not a list. ** New configuration variable `eshell-virtual-targets'. Allows the user to specify new virtual targets, such as "/dev/kill" and "/dev/null". ** New virtual target "/dev/eshell". Anything output to this pseudo-device will be displayed in the Eshell window as normal output from the command. Useful on operating systems without "tee", since it lets you both view the command output, and redirect it somewhere else: ls > blah > /dev/eshell ; output goes to both "blah" and display ** New configuration variable `eshell-kill-processes-on-exit'. It can be set to one of: t, ask, every, nil. These settings mean: t - kill all processes spawned by an Eshell buffer when it is killed/exited. ask - same operation as t, but ask the user before doing so. every - some operation as ask, but query for every single process. nil - don't kill processes on exit. They will be killed only if Emacs itself is killed, or if the user kills/exits them. This is the default, and matches the behavior of 2.1. ** New configuration hook `eshell-first-time-mode-hook', which is called at the same time as `eshell-mode-hook' (just before it), but only once per Emacs session. ** Added '#*' '.#*' files to the `eshell-ls-backup-regexp'. ** Added '.bz2' files to the `eshell-ls-archive-regexp'. ** The "echo" command now takes a "-n" flag, which causes it to generate a newline after the printed text. ** New module `esh-toggle', which provides the global commands `eshell-toggle' and `eshell-toggle-cd'. To use these functions, simply type `M-x eshell-toggle'. With a prefix argument, it is the same as calling `eshell-toggle-cd', which emits a "cd $default-directory" immediately after switching. If `eshell-toggle' is called once, it will bring up Eshell in another window. If called twice in succession, it will take up the whole frame. After doing anything in the Eshell buffer, calling `eshell-toggle' yet again will restore the window configuration that was extent before the first call. ** Improved support for XEmacs 21.1 and 21.2. * Changes in 2.1: ** Eshell has been split into several functional "modules". There are base modules, which define the core of Eshell, and extension modules, whose use is entirely optional. See the variable `eshell-modules-list'. ** comint.el is no longer used. The functionality that Eshell had been using is now divided between eshell-mode.el, eshell-hist.el, eshell-cmpl.el and eshell-io.el. Most of that code is now radically altered from its original form. ** there is complete documentation available, using a prototype embedded documentation system called "texidoc". texidoc.el is included with the distribution of Eshell, but is not yet ready for general consumption. ** pushd, popd and dirs are provided in the extension module `eshell-dirs'. ** `cd', as defined in the extension module `eshell-dirs', can accept parent directory references of the form "...", where each additional "." refers to the next highest directory. ** recursive globbing, similar to zsh, is provided in the extension module `eshell-glob'. The syntax is "**/*.c", which means matches all of the C files in the current directory and below. Symbolic links are not traversed. To traverse them, use three asterices: "***/*.c". ** argument predicates and modifiers are provided in the extension module `eshell-pred'. The syntax is to suffix the argument with "(PREDS)" or "(:MOD:MOD)", or any combination. The allowable predicates follow zsh syntax, whereas the allowable modifiers follow bash's history argument modifier syntax. Thus, the command "echo alpha(:s/al/be/)" would yield the string "bepha". The history code and globbing rely upon this extension module to provide globbing predicates and history argument modifiers. If it is not used, those facilities won't be available. See the Info manual for a fuller description of predicates and modifiers, and how to use them. They are comprehensive enough to replace the use of "find ... | xargs " in most cases. ** the version info banner displayed at login is part of a sample extension module named `eshell-banner'. It can be de-selected by disabling the use of that module. If authors choose to write their on Eshell extension modules, they should copy this file ("eshell-banner.el") as a starting point. ** command aliases are provided in the extension module `eshell-alias'. These aliases are intended for simplicity, and persist immediately (i.e., no customization of Lisp variable is necesary in order to use them). The only caveat, and difference from other shells, is that argument expansion must always be provided by specifying '$*' somewhere in the alias string. A typical use might be: "alias ll 'ls -l $*'" ** argument parsing has complete changed in structure. It is now much easier for extension modules to extend the capability of the parser for their own needs. See `eshell-dirs' for an example, which extends the parser to properly handle filenames beginning with a tilde character, such as "cat ~johnw/.emacs". ** several more UNIX commands are now implemented in Lisp, in the extension module `eshell-unix': basename, cat, cp, date, dirname, ln, man, mkdir, mv and rmdir. ** the extension module `eshell-basic' defines some of the more basic shell commands, which are typically builtins in most shells: echo, umask, version, etc. ** programmable, context-aware completion is available using the extension module `eshell-cmpl'. This is accomplished by taking advantage of the functionality in the `pcomplete' module, which is included with the standard Eshell distribution. ** history code, which is almost entirely bash compatible, is provided in the extension module `eshell-hist'. ** rebinding of command keys while editing command input is provided in the extension module `eshell-rebind'. For example, this causes C-u to delete the current input text, rather than act as the universal argument prefix -- but only while editing command input. This is done to make Eshell feel more like a standard system shell. Once the point moves away from the command input text (C-c C-p is the typical way to do this), C-u takes on its normal meaning. The keys which get rebound, and their definition, are fully customizable. ** execution of Eshell scripts is provided in the extension module `eshell-script'. The interpretor should be named "/usr/local/bin/eshell", which is not offered with this release. Eshell itself can execute such scripts, however, since it evaluates them within the currently running Emacs. ** a new form of smart output display is provided in the extension module `eshell-smart'. See the Info manual for more details, since an accurate description of what "smart" means in this case is somewhat difficult to describe. ** a test suite is now included with Eshell, which is runnable by typing `M-x eshell-test'. However, this test can only be run against non-byte-compiled sources. For efficiency sake, all of the testing code is removed during byte-compilation. ** a few other niceties, such as implementing `expr' in terms of the calc package, or defining `make' to use compilation-mode whenever the user invokes it asynchronously, are provided in the extension module `eshell-xtra'. ** cd now maintains its own "directory ring", which remembers the last `eshell-last-dir-ring-size' places that Eshell has been to. The syntax is: cd - ; go to last location (swap top of ring and current) cd -4 ; go to 4th from last location cd =bcc ; go to last location containing regexp "bcc" cd = ; show list of locations If `eshell-last-dir-unique' is non-nil, this ring will never contain duplicate items. ** if an alias command like "ls" doesn't recognize a specified option, it will defer to the external version (searched for on the PATH). ** improved the "history" alias to be more like bash; specifically, there is support for the -r, -w and -a options. ** removed all dependencies on font-lock. eshell now does its own buffer highlighting. ** added full support for colorized ls output. To disable this feature, set `eshell-ls-use-colors' to nil. ** fixed a bug which was causing filter overruns when using pipes and processes that generate a lot of output (like "find" with "xargs"). ** removed `eshell-ls-default-args'. The proper way to pass default arguments to ls is by using a command alias. ** fixed a bug which prevented Eshell's ls from displaying very large file sizes. * Changes in 1.5: ** eshell now uses comint directly, rather than duplicating that code. For this to work, you will need an updated copy of comint, which can be found at http://www.emacs.org/~johnw/comint.el Or ask the author to send you a copy! ** optimized handling of output from a subprocess. In cases where both standard output and standard error are both headed for the "*eshell*" buffer (which is most of the time), the comint filter is used directly, bypassing eshell's redirection code. ** there is a new user variable, `eshell-visual-commands'. If any command name matches a member of this list, it will be executed using "term", and started in a new buffer. When that process exits -- and if you were viewing that buffer at the time -- it will return you to eshell. ** fixed "/dev/null". It now dumps output once again (before, it would give an error about trying to change the value of the constant symbol "nil"). ** fixed a problem with subcommands that was causing "echo ${whoami}" not to work. ** implemented a simple version of "history" that mimics the behavior of bash's same command. None of the command switches are supported, however, nor can an alternate history file be specified. Yet. ** if `eshell-input-ring-file-name' is non-nil (and it now defaults to "~/.history"), eshell will write out the current command history whenever the eshell buffer is killed. ** the "exit" alias will bury the eshell buffer; but it does not kill it (for the time being, there are some problems with trying to do that, while at the same time keep everything sane). ** after a call to `eshell-print', the display is now refreshed -- with consquent result that some of the lisp functions are now visibly slower, although you can at least now see that they're doing something. Setting `eshell-refresh-interval' to a higher value will make the functions run faster, but it will also make them seem a little choppier (no frequent updates). Setting this to a really high number will match the functionality of 1.4. ** if a "foreground" process is active, pressing RETURN will send the current string to that process; if there are multiple foreground processes active, the user will be prompted for which one. Note that eshell echos locally, so the app you're using (such as telnet) may have to turn echoing off. ** executables are searched for along the PATH, not the `exec-path'. Also, specifying a relative executable name now works (before, saying "src/ls", even if it was there, would not work). ** added an alias for "export" which behaves just as in bourne shell. That is, you can now add to the path by saying: export PATH=$PATH:/usr/local/bin" ** fixed a bug which made it impossible to say "echo $exec-path", and was causing $_ to be inaccessible. ** "ls -l" (the alias version, written in Lisp) now shows symbolic link targets. "ls -r" correctly reverses the file list. "ls -t" sorts by mod time. Ganging up options ("ls -ltr") now also works. ** before calling start-process, use `expand-file-name' on the program name, so that relative paths are seen as absolute ** looking up the command interpretor got broken again in 1.4 ** fixed problem where you couldn't cd to a directory with a numeric name ** `eshell-kill-alias' was reversing its arguments, so that "kill -9 PROC" wasn't working. ** fixed a problem in `eshell-argument-syntax-list', that was causing process references (e.g., #) to cause a syntax error. ** if output continues to generate from a subprocess, and you move point to another window or frame, eshell will now scroll to the end of the buffer. In 1.4, it would freeze the point of display at the location you were last at when leaving the window. ** protected a reference to `transient-mark-mode' with a call to `boundp', in case it's not bound yet. ** "date" now calls (current-time-string). If you want the other functions of the date command, call it with an explicit path, such as /bin/date. In the future, I'll make "date" an alias, and just call the real "date" if the alias doesn't recognize any of the command line switches. ** beyond these features and bugs, there were several other, smaller bugs fixed. Thanks to everyone who submitted feedback, and provided test cases. Most everything else on my TODO list is either a major bug, requiring redesign, or a new feature. * Changes in 1.4 ** `eshell-funcalln' was incorrectly calling `eshell-apply' rather than `eshell-applyn'. ** Pipes and subcommands were totally broken by the rewrite of the output handling code. And subcommands were even changing the main eshell buffer! So that's all working again. ** Always go the end of the current line when RETURN is pressed. ** Fixed a serious problem with globbing patterns and disk commands. ** Process interaction, when there is only one non-background process active, now works as expected again. * Changes in 1.3 ** The variable `eshell-cd-shows-directory' now control whether "cd" will report the directory name it changes to. ** The "alias" command didn't even really work, but now it's fixed. ** Removed dependency on `dired-replace-in-string' and `dired-glob-regexp'. ** If a variable is not found, it's value evaluates to "". If a command cannot be found, it prints "name not found", as rc does (rc: the Other Shell [read like 'the Other Woman'] :). ** "ls" has been implemented in Lisp. Remove it from the list of aliases if you still want to use the disk-based version. If there are flags which my implementation does not recognize, it will revert to the disk based version. ** "rm" has been implemented to call the Lisp function `delete-file'. If the argument is a buffer or process, it will kill it. If it is a symbol, it will delete it. ** If `cd' is given an ange-ftp file name, and then a disk command is run from that directory, eshell will call `shell-command' so that the command is run via "rsh" on the remote machine. ** Command aliases take a new second argument which allows you specify what kind of alias you're defining. So it's now possible to define an alias as '("ll" command "ls -l"). ** The history and input handling code was copied directly over from comint, rather than being reimplemented. The only changes I had to make were due to the fact that comint assumes that the current buffer always has exactly one underlying process associated with it. So although it's ugly to block move that much code, rather than just reuse it in place, at least for this version eshell supports comint's code for history and input navigation: *** !! accesses last command *** !command searches for last command, with option of command being a ;; regexp *** !? causes the current line to be replaced with that history ;; element *** M-p M-n walk through the history list *** If RETURN is pressed at a previous location in the eshell buffer (i.e., before `eshell-output-mark'), repeat the command text at the bottom before executing it. *** Note: numerical references to history sub-elements are currently ignored. * Changes in 1.2 ** Fixed some bugs with list flattening, `eshell-echo' and `eshell-dos-to-unix'. ** Removed "grep" alias. Too troublesome and confusing. ** Giving a prefix argument to C-RET (send string to process), will cause Emacs to read the input as a password. Also, a newline is now automatically appended to the string sent. ** Fixed many bugs dealing with aliases and foreign command interpretors. How did all those bugs creep in? :) ** The "dos2unix" alias no longer untabifies your files. ** Added aliases for "setq" and "if". More to come... ** Added some bindings to provide some compatibility with what comint users expect. ** Accessing history is now possible with "!command". The last command is available using "!!". If `eshell-history-by-regexp' is non-nil, you can use "!regexp", which will match anywhere with the line, requiring "!^regexp" to emulate the default behavior. ** "cd -" will return to the last directory visited. ** Variable referencing is now supported. It takes many forms: *** $VARIABLE name of an environment or Lisp variable *** $ALSO-VAR "-" is considered part of a name *** $-TOO only "MYVAR" is part of the variable name *** $#VARIABLE length of the value of VARIABLE *** $(lisp) Returns result of lisp evaluation. Note: Used alone like this, it is identical to just saying (lisp); but with the variable expansion form, the result may be interpolated a larger string, like "$(lisp)/other". *** ${command} Returns the value of an eshell subcommand. See the note above regarding lisp evaluations. The same applies here. *** $ANYVAR[10] Attempts to return the 10th element of ANYVAR. If ANYVAR's value is a string, it will be split in order to make it a list. The splitting will occur at whitespace. *** $ANYVAR[: 10] Just like above, except that splitting occurs at the colon now. *** $ANYVAR[: 10 20 ] Like above, but instead of returning just a string, it now returns a list of two elements. If the result is being interpolated into a larger string, this list will be flattened into one big string, with each element separated by a space. *** $ANYVAR["\\\\" 10] Separate on backslash characters. Actually, the first argument -- if it doesn't have the form of a number, or plain variable name -- is just a regular expression. So if you did want to split on numbers, you could say: $ANYVAR["[0-9]+" 10 20]. *** $ANYVAR[hello] Does an assoc with ANYVAR, expecting it to be an alist. *** $#ANYVAR[hello] Returns the length of the element of the alist ANYVAR who car is equal to "hello" *** Thus, you can now do crazy things like: 1+ ${egrep johnw /etc/passwd}[: $pu-index] > 'uid-after-me And return the value of the `pu-index'th element of your passwd entry (let's assuming it's set to 2, the user id), increment it by one, and then store this integer in the Lisp variable `uid-after-me'. ** $_ is defined (via an alias) as the arguments for the last command. If referenced plainly, it refers to the last argument of the last argument. If referenced as an array, it will return the Nth argument of the last command. * Changes in 1.1 ** Fixed a bug which made some of the defcustom forms unusable. ** `esh' is an alias for `eshell-subcommand', making it easier to run eshell commands synchronously from lisp forms. ** Fixed some erroneous ways that files were being separated and globbed. Failed globs get passed as the glob string. ** Special characters in filenames are now quoted when doing name completion. ** Eshell outputs a short banner message on startup, announcing the version. Set `eshell-display-banner-p' to nil to turn this off. ** Removed the troublesome global variables that were being used for capturing the output from the subcommands. ** Outputting to 'nil, or the pseudo-name "/dev/null", will drop output. ** Using ";;" means three empty commands now, instead of the unknown token ";;". ** The process interaction functions, such as C-c C-c, now always use the currently running sub-process if eshell has invoked only one. Otherwise, it prompts from among all running processes in Emacs. ** Changed C-c RET to just C-RET. ** Emacs-lisp-mode is run before switching the major mode to eshell, so that any hooks (like starting eldoc mode) work as you would expect for a lisp mode. * Changes in 1.0 (from the first pre-release version 0.2) ** Simplified the code a great deal, and broke it down into several more functions. ** Now uses `dired-glob-regexp', instead of duplicating that code. ** Redirection is possible to multiple targets. They will all receive the same output. ** Redirection of files, buffers or processes, using the Emacs syntax # or #. If `eshell-buffer-shorthand' is nil, you can even redirect into a lisp variable using the syntax: 'name. ** If you redirect within a pipe, the output will still go to the pipe, eliminating the need for "tee". To prevent this behavior, set `eshell-always-to-pipe' to nil. ** When redirecting to a buffer, the operator ">>>" will cause the redirection to insert at the current location of point in that buffer. Beware of the asynchronous nature of the subprocess, though, since it will continue inserting at point, even if point moves around. ** ~, ~user, and /:/path (to prevent environment variable substitution) are now supported. ** You can turn off the bogus nature of "&" by setting `eshell-support-ampersand' to nil. ** There is now extensive support for aliases, and redefinition of commands. You can either replace the definition of a command, or alter it. You can also modify the output which comes from the command, and still have it show up in all the places the user specified redirections to. ** Synchronous subcommands are supported, and can be used either to generate output, or to substitute for an argument. The syntax used is similar to rc, except that no whitespace is allowed after the initial brace. This is so that users can avoid the tedium of quoting all the time. echo {cd; ls} ; echos contents of home directory echo {+ 1 3} ; print `t', since sub-expr yields non-nil {+ 1 3} ; evalute in a subcommand, and print result ** Synchronous chaining of commands is supported, using ";": ls; ls -l; ls; ls -l ; appears in the order you expect ** There is a series of functions behind C-c now, for the purposes of interrupting processes. ** You can use C-c p and C-c b to insert named references to process and buffers. ** When a subprocess asks a question, you cannot answer it just by typing into the eshell buffer, since there's no way to know for certain which asynchronous subprocess you intend for the string to go to. Instead, use C-c RET, select the name of the process, and then enter your string in the minibuffer.