123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266 |
- \input texinfo @c -*-texinfo-*-
- @c %**start of header
- @setfilename ../../info/eshell.info
- @settitle Eshell: The Emacs Shell
- @include docstyle.texi
- @defindex cm
- @synindex vr fn
- @c %**end of header
- @copying
- This manual is for Eshell, the Emacs shell.
- Copyright @copyright{} 1999--2017 Free Software Foundation, Inc.
- @quotation
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3 or
- any later version published by the Free Software Foundation; with no
- Invariant Sections, with the Front-Cover Texts being ``A GNU Manual'',
- and with the Back-Cover Texts as in (a) below. A copy of the license
- is included in the section entitled ``GNU Free Documentation License''.
- (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
- modify this GNU manual.''
- @end quotation
- @end copying
- @dircategory Emacs misc features
- @direntry
- * Eshell: (eshell). A command shell implemented in Emacs Lisp.
- @end direntry
- @titlepage
- @sp 4
- @c The title is printed in a large font.
- @center @titlefont{User's Guide}
- @sp 1
- @center @titlefont{to}
- @sp 1
- @center @titlefont{Eshell: The Emacs Shell}
- @ignore
- @sp 2
- @center release 2.4
- @c -release-
- @end ignore
- @sp 3
- @center John Wiegley & Aidan Gauland
- @c -date-
- @page
- @vskip 0pt plus 1filll
- @insertcopying
- @end titlepage
- @contents
- @c ================================================================
- @c The real text starts here
- @c ================================================================
- @ifnottex
- @node Top
- @top Eshell
- Eshell is a shell-like command interpreter implemented in Emacs Lisp.
- It invokes no external processes except for those requested by the
- user. It is intended to be an alternative to the IELM (@pxref{Lisp Interaction, Emacs Lisp Interaction, , emacs, The Emacs Editor})
- REPL for Emacs @emph{and} with an interface similar to command shells
- such as @command{bash}, @command{zsh}, @command{rc}, or
- @command{4dos}.
- @c This manual is updated to release 2.4 of Eshell.
- @insertcopying
- @end ifnottex
- @menu
- * Introduction:: A brief introduction to the Emacs Shell.
- * Commands::
- * Expansion::
- * Input/Output::
- * Extension modules::
- * Bugs and ideas:: Known problems, and future ideas.
- * GNU Free Documentation License:: The license for this documentation.
- * Concept Index::
- * Function and Variable Index::
- * Command Index::
- @ignore
- * Key Index::
- @end ignore
- @end menu
- @node Introduction
- @chapter Introduction
- @section What is Eshell?
- @cindex what is Eshell?
- @cindex Eshell, what it is
- Eshell is a @dfn{command shell} written in Emacs Lisp. Everything it
- does, it uses Emacs's facilities to do. This means that Eshell is as
- portable as Emacs itself. It also means that cooperation with Lisp code
- is natural and seamless.
- What is a command shell? To properly understand the role of a shell,
- it's necessary to visualize what a computer does for you. Basically, a
- computer is a tool; in order to use that tool, you must tell it what to
- do---or give it ``commands.'' These commands take many forms, such as
- clicking with a mouse on certain parts of the screen. But that is only
- one form of command input.
- By far the most versatile way to express what you want the computer to
- do is by using an abbreviated language called @dfn{script}. In
- script, instead of telling the computer, ``list my files, please'',
- one writes a standard abbreviated command word---@samp{ls}. Typing
- @samp{ls} in a command shell is a script way of telling the computer
- to list your files.@footnote{This is comparable to viewing the
- contents of a folder using a graphical display.}
- The real flexibility of this approach is apparent only when you realize
- that there are many, many different ways to list files. Perhaps you
- want them sorted by name, sorted by date, in reverse order, or grouped
- by type. Most graphical browsers have simple ways to express this. But
- what about showing only a few files, or only files that meet a certain
- criteria? In very complex and specific situations, the request becomes
- too difficult to express using a mouse or pointing device. It is just
- these kinds of requests that are easily solved using a command shell.
- For example, what if you want to list every Word file on your hard
- drive, larger than 100 kilobytes in size, and which hasn't been looked
- at in over six months? That is a good candidate list for deletion, when
- you go to clean up your hard drive. But have you ever tried asking your
- computer for such a list? There is no way to do it! At least, not
- without using a command shell.
- The role of a command shell is to give you more control over what your
- computer does for you. Not everyone needs this amount of control, and
- it does come at a cost: Learning the necessary script commands to
- express what you want done. A complicated query, such as the example
- above, takes time to learn. But if you find yourself using your
- computer frequently enough, it is more than worthwhile in the long run.
- Any tool you use often deserves the time spent learning to master it.
- @footnote{For the understandably curious, here is what that command
- looks like: But don't let it fool you; once you know what's going on,
- it's easier than it looks: @code{ls -lt **/*.doc(Lk+50aM+5)}.}
- @section What Eshell is not
- @cindex Eshell, what it is not
- @cindex what Eshell is not
- @cindex what isn't Eshell?
- Eshell is @emph{not} a replacement for system shells such as
- @command{bash} or @command{zsh}. Use Eshell when you want to move
- text between Emacs and external processes; if you only want to pipe
- output from one external process to another (and then another, and so
- on), use a system shell, because Emacs's IO system is buffer oriented,
- not stream oriented, and is very inefficient at such tasks. If you
- want to write shell scripts in Eshell, don't; either write an elisp
- library or use a system shell.
- Some things Eshell just doesn't do well. It fills the niche between
- IELM and your system shell, where the peculiar use-cases lie, and it
- is less than ideal outside that niche.
- @menu
- * Contributors to Eshell:: People who have helped out!
- @end menu
- @node Contributors to Eshell
- @section Contributors to Eshell
- @cindex contributors
- @cindex authors
- Contributions to Eshell are welcome. I have limited time to work on
- this project, but I will gladly add any code you contribute to me to
- this package.
- The following persons have made contributions to Eshell.
- @itemize @bullet
- @item
- Eli Zaretskii made it possible for Eshell to run without requiring
- asynchronous subprocess support. This is important for MS-DOS, which
- does not have such support.
- @item
- Miles Bader contributed many fixes during the port to Emacs 21.
- @item
- Stefan Monnier fixed the things which bothered him, which of course made
- things better for all.
- @item
- Gerd Moellmann also helped to contribute bug fixes during the initial
- integration with Emacs 21.
- @item
- Alex Schroeder contributed code for interactively querying the user
- before overwriting files.
- @item
- Sudish Joseph helped with some XEmacs compatibility issues.
- @end itemize
- Apart from these, a lot of people have sent suggestions, ideas,
- requests, bug reports and encouragement. Thanks a lot! Without you
- there would be no new releases of Eshell.
- @node Commands
- @chapter Commands
- In a command shell, everything is done by invoking commands. This
- chapter covers command invocations in Eshell, including the command
- history and invoking commands in a script file.
- @menu
- * Invocation::
- * Arguments::
- * Built-ins::
- * Variables::
- * Aliases::
- * History::
- * Completion::
- * for loop::
- * Scripts::
- @end menu
- @node Invocation
- @section Invocation
- Unlike regular system shells, Eshell never invokes kernel functions
- directly, such as @code{exec(3)}. Instead, it uses the Lisp functions
- available in the Emacs Lisp library. It does this by transforming the
- input line into a callable Lisp form.@footnote{To see the Lisp form that will be invoked, type: @samp{eshell-parse-command "echo hello"}}
- The command can be either an Elisp function or an external command.
- Eshell looks first for an @ref{Aliases, alias} with the same name as the
- command, then a @ref{Built-ins, built-in command} or a function with the
- same name; if there is no match, it then tries to execute it as an
- external command.
- The semicolon (@code{;}) can be used to separate multiple command
- invocations on a single line. A command invocation followed by an
- ampersand (@code{&}) will be run in the background. Eshell has no job
- control, so you can not suspend or background the current process, or
- bring a background process into the foreground. That said, background
- processes invoked from Eshell can be controlled the same way as any
- other background process in Emacs.
- @node Arguments
- @section Arguments
- Command arguments are passed to the functions as either strings or
- numbers, depending on what the parser thinks they look like. If you
- need to use a function that takes some other data type, you will need to
- call it in an Elisp expression (which can also be used with
- @ref{Expansion, expansions}). As with other shells, you can
- escape special characters and spaces with the backslash (@code{\}) and
- apostrophes (@code{''}) and double quotes (@code{""}). This is needed
- especially for file names with special characters like pipe
- (@code{|}), which could be part of remote file names.
- @node Built-ins
- @section Built-in commands
- Several commands are built-in in Eshell. In order to call the
- external variant of a built-in command @code{foo}, you could call
- @code{*foo}. Usually, this should not be necessary. You can check
- what will be applied by the @code{which} command:
- @example
- ~ $ which ls
- eshell/ls is a compiled Lisp function in `em-ls.el'
- ~ $ which *ls
- /bin/ls
- @end example
- If you want to discard a given built-in command, you could declare an
- alias, @ref{Aliases}. Example:
- @example
- ~ $ which sudo
- eshell/sudo is a compiled Lisp function in `em-unix.el'
- ~ $ alias sudo '*sudo $*'
- ~ $ which sudo
- sudo is an alias, defined as "*sudo $*"
- @end example
- @vindex eshell-prefer-lisp-functions
- If you would prefer to use the built-in commands instead of the external
- commands, set @code{eshell-prefer-lisp-functions} to @code{t}.
- Some of the built-in commands have different behavior from their
- external counterparts, and some have no external counterpart. Most of
- these will print a usage message when given the @code{--help} option.
- @table @code
- @item addpath
- @cmindex addpath
- Adds a given path or set of paths to the PATH environment variable, or,
- with no arguments, prints the current paths in this variable.
- @item alias
- @cmindex alias
- Define an alias (@pxref{Aliases}). This does not add it to the aliases
- file.
- @item clear
- @cmindex clear
- Scrolls the contents of the eshell window out of sight, leaving a blank window.
- If provided with an optional non-nil argument, the scrollback contents are
- cleared instead.
- @item date
- @cmindex date
- Similar to, but slightly different from, the GNU Coreutils
- @command{date} command.
- @item define
- @cmindex define
- Define a varalias.
- @xref{Variable Aliases, , , elisp, The Emacs Lisp Reference Manual}.
- @item diff
- @cmindex diff
- Use Emacs's internal @code{diff} (not to be confused with
- @code{ediff}). @xref{Comparing Files, , , emacs, The GNU Emacs Manual}.
- @item grep
- @cmindex grep
- @itemx agrep
- @cmindex agrep
- @itemx egrep
- @cmindex egrep
- @itemx fgrep
- @cmindex fgrep
- @itemx glimpse
- @cmindex glimpse
- The @command{grep} commands are compatible with GNU @command{grep}, but
- use Emacs's internal @code{grep} instead.
- @item info
- @cmindex info
- Same as the external @command{info} command, but uses Emacs's internal
- Info reader.
- @item jobs
- @cmindex jobs
- List subprocesses of the Emacs process, if any, using the function
- @code{list-processes}.
- @item kill
- @cmindex kill
- Kill processes. Takes a PID or a process object and an optional
- signal specifier.
- @item listify
- @cmindex listify
- Eshell version of @code{list}. Allows you to create a list using Eshell
- syntax, rather than Elisp syntax. For example, @samp{listify foo bar}
- and @code{("foo" "bar")} both evaluate to @code{("foo" "bar")}.
- @item locate
- @cmindex locate
- Alias to Emacs's @code{locate} function, which simply runs the external
- @command{locate} command and parses the results.
- @xref{Dired and Find, , , emacs, The GNU Emacs Manual}.
- @item make
- @cmindex make
- Run @command{make} through @code{compile}.
- @xref{Compilation, , , emacs, The GNU Emacs Manual}.
- @item occur
- @cmindex occur
- Alias to Emacs's @code{occur}.
- @xref{Other Repeating Search, , , emacs, The GNU Emacs Manual}.
- @item printnl
- @cmindex printnl
- Print the arguments separated by newlines.
- @item cd
- @cmindex cd
- This command changes the current working directory. Usually, it is
- invoked as @samp{cd foo} where @file{foo} is the new working directory.
- But @command{cd} knows about a few special arguments:
- When it receives no argument at all, it changes to the home directory.
- Giving the command @samp{cd -} changes back to the previous working
- directory (this is the same as @samp{cd $-}).
- The command @samp{cd =} shows the directory stack. Each line is
- numbered.
- With @samp{cd =foo}, Eshell searches the directory stack for a directory
- matching the regular expression @samp{foo} and changes to that
- directory.
- With @samp{cd -42}, you can access the directory stack by number.
- @item su
- @cmindex su
- @itemx sudo
- @cmindex sudo
- Uses TRAMP's @command{su} or @command{sudo} method @pxref{Inline methods, , , tramp}
- to run a command via @command{su} or @command{sudo}. These commands
- are in the eshell-tramp module, which is disabled by default.
- @end table
- @subsection Built-in variables
- Eshell knows a few built-in variables:
- @table @code
- @item $+
- @vindex $+
- This variable always contains the current working directory.
- @item $-
- @vindex $-
- This variable always contains the previous working directory (the
- current working directory from before the last @code{cd} command).
- @item $_
- @vindex $_
- It refers to the last argument of the last command.
- @item $$
- @vindex $$
- This is the result of the last command. In case of an external
- command, it is @code{t} or @code{nil}.
- @item $?
- @vindex $?
- This variable contains the exit code of the last command (0 or 1 for
- Lisp functions, based on successful completion).
- @end table
- @node Variables
- @section Variables
- Since Eshell is just an Emacs REPL@footnote{Read-Eval-Print Loop}, it
- does not have its own scope, and simply stores variables the same you
- would in an Elisp program. Eshell provides a command version of
- @code{setq} for convenience.
- @node Aliases
- @section Aliases
- Aliases are commands that expand to a longer input line. For example,
- @command{ll} is a common alias for @code{ls -l}, and would be defined
- with the command invocation @samp{alias ll ls -l}; with this defined,
- running @samp{ll foo} in Eshell will actually run @samp{ls -l foo}.
- Aliases defined (or deleted) by the @command{alias} command are
- automatically written to the file named by @code{eshell-aliases-file},
- which you can also edit directly (although you will have to manually
- reload it).
- @node History
- @section History
- @cmindex history
- The @samp{history} command shows all commands kept in the history ring
- as numbered list. If the history ring contains
- @code{eshell-history-size} commands, those numbers change after every
- command invocation, therefore the @samp{history} command shall be
- applied before using the expansion mechanism with history numbers.
- The n-th entry of the history ring can be applied with the @samp{!n}
- command. If @code{n} is negative, the entry is counted from the end
- of the history ring.
- @samp{!foo} expands to the last command beginning with @code{foo}, and
- @samp{!?foo} to the last command containing @code{foo}. The n-th
- argument of the last command beginning with @code{foo} is accessible
- by @code{!foo:n}.
- The history ring is loaded from a file at the start of every session,
- and written back to the file at the end of every session. The file path
- is specified in @code{eshell-history-file-name}. Unlike other shells,
- such as Bash, Eshell can not be configured to keep a history ring of a
- different size than that of the history file.
- Since the default buffer navigation and searching key-bindings are
- still present in the Eshell buffer, the commands for history
- navigation and searching are bound to different keys:
- @table @kbd
- @item M-r
- @itemx M-s
- History I-search.
- @item M-p
- @itemx M-n
- Previous and next history line. If there is anything on the input
- line when you run these commands, they will instead jump to the
- previous or next line that begins with that string.
- @end table
- @node Completion
- @section Completion
- Eshell uses the pcomplete package for programmable completion, similar
- to that of other command shells. Argument completion differs depending
- on the preceding command: for example, possible completions for
- @command{rmdir} are only directories, while @command{rm} completions can
- be directories @emph{and} files. Eshell provides predefined completions
- for the built-in functions and some common external commands, and you
- can define your own for any command.
- Eshell completion also works for lisp forms and glob patterns. If the
- point is on a lisp form, then @key{TAB} will behave similarly to completion
- in @code{elisp-mode} and @code{lisp-interaction-mode}. For glob
- patterns, If there are few enough possible completions of the patterns,
- they will be cycled when @key{TAB} is pressed, otherwise it will be removed
- from the input line and the possible completions will be listed.
- If you want to see the entire list of possible completions when it's
- below the cycling threshold, press @kbd{M-?}.
- @subsection pcomplete
- Pcomplete, short for programmable completion, is the completion
- library originally written for Eshell, but usable for command
- completion@footnote{Command completion as opposed to code completion,
- which is a beyond the scope of pcomplete.} in other modes.
- Completions are defined as functions (with @code{defun}) named
- @code{pcomplete/COMMAND}, where @code{COMMAND} is the name of the
- command for which this function provides completions; you can also name
- the function @code{pcomplete/MAJOR-MODE/COMMAND} to define completions
- for a specific major mode.
- @node for loop
- @section @code{for} loop
- Because Eshell commands can not (easily) be combined with lisp forms,
- Eshell provides a command-oriented @command{for}-loop for convenience.
- The syntax is as follows:
- @example
- @code{for VAR in TOKENS @{ command invocation(s) @}}
- @end example
- where @samp{TOKENS} is a space-separated sequence of values of
- @var{VAR} for each iteration. This can even be the output of a
- command if @samp{TOKENS} is replaced with @samp{@{ command invocation @}}.
- @node Scripts
- @section Scripts
- @cmindex source
- @fnindex eshell-source-file
- You can run Eshell scripts much like scripts for other shells; the main
- difference is that since Eshell is not a system command, you have to run
- it from within Emacs. An Eshell script is simply a file containing a
- sequence of commands, as with almost any other shell script. Scripts
- are invoked from Eshell with @command{source}, or from anywhere in Emacs
- with @code{eshell-source-file}.
- @cmindex .
- If you wish to load a script into your @emph{current} environment,
- rather than in a subshell, use the @code{.} command.
- @node Expansion
- @chapter Expansion
- Expansion in a command shell is somewhat like macro expansion in macro
- parsers (such as @command{cpp} and @command{m4}), but in a command
- shell, they are less often used for constants, and usually for using
- variables and string manipulation.@footnote{Eshell has no
- string-manipulation expansions because the Elisp library already
- provides many functions for this.} For example, @code{$var} on a line
- expands to the value of the variable @code{var} when the line is
- executed. Expansions are usually passed as arguments, but may also be
- used as commands.@footnote{E.g., entering just @samp{$var} at the prompt
- is equivalent to entering the value of @code{var} at the prompt.}
- @menu
- * Dollars Expansion::
- * Globbing::
- @end menu
- @node Dollars Expansion
- @section Dollars Expansion
- Eshell has different @code{$} expansion syntax from other shells. There
- are some similarities, but don't let these lull you into a false sense
- of familiarity.
- @table @code
- @item $var
- Expands to the value bound to @code{var}. This is the main way to use
- variables in command invocations.
- @item $#var
- Expands to the length of the value bound to @code{var}. Raises an error
- if the value is not a sequence
- (@pxref{Sequences Arrays Vectors, Sequences, , elisp, The Emacs Lisp Reference Manual}).
- @item $(lisp)
- Expands to the result of evaluating the S-expression @code{(lisp)}. On
- its own, this is identical to just @code{(lisp)}, but with the @code{$},
- it can be used in a string, such as @samp{/some/path/$(lisp).txt}.
- @item $@{command@}
- Returns the output of @command{command}, which can be any valid Eshell
- command invocation, and may even contain expansions.
- @item $var[i]
- Expands to the @code{i}th element of the value bound to @code{var}. If
- the value is a string, it will be split at whitespace to make it a list.
- Again, raises an error if the value is not a sequence.
- @item $var[: i]
- As above, but now splitting occurs at the colon character.
- @item $var[: i j]
- As above, but instead of returning just a string, it now returns a list
- of two strings. 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.
- @item $var["\\\\" i]
- Separate on backslash characters. Actually, the first argument -- if it
- doesn't have the form of a number, or a plain variable name -- can be
- any regular expression. So to split on numbers, use @samp{$var["[0-9]+" 10 20]}.
- @item $var[hello]
- Calls @code{assoc} on @code{var} with @code{"hello"}, expecting it to be
- an alist (@pxref{Association List Type, Association Lists, , elisp,
- The Emacs Lisp Reference Manual}).
- @item $#var[hello]
- Returns the length of the cdr of the element of @code{var} who car is equal
- to @code{"hello"}.
- @end table
- @node Globbing
- @section Globbing
- Eshell's globbing syntax is very similar to that of Zsh. Users coming
- from Bash can still use Bash-style globbing, as there are no
- incompatibilities. Most globbing is pattern-based expansion, but there
- is also predicate-based expansion. See
- @ref{Filename Generation, , , zsh, The Z Shell Manual}
- for full syntax. To customize the syntax and behavior of globbing in
- Eshell see the Customize@footnote{@xref{Easy Customization, , , emacs,
- The GNU Emacs Manual}.}
- groups ``eshell-glob'' and ``eshell-pred''.
- @node Input/Output
- @chapter Input/Output
- Since Eshell does not communicate with a terminal like most command
- shells, IO is a little different.
- @section Visual Commands
- If you try to run programs from within Eshell that are not
- line-oriented, such as programs that use ncurses, you will just get
- garbage output, since the Eshell buffer is not a terminal emulator.
- Eshell solves this problem by running such programs in Emacs's
- terminal emulator.
- Programs that need a terminal to display output properly are referred
- to in this manual as ``visual commands,'' because they are not simply
- line-oriented. You must tell Eshell which commands are visual, by
- adding them to @code{eshell-visual-commands}; for commands that are
- visual for only certain @emph{sub}-commands -- e.g., @samp{git log} but
- not @samp{git status} -- use @code{eshell-visual-subcommands}; and for
- commands that are visual only when passed certain options, use
- @code{eshell-visual-options}.
- Caution: Some tools such as Git use the pager @samp{less} by default
- to paginate their output but call it with its @samp{-F} option. This
- option causes @samp{less} to echo the output instead of paginating it
- if the output is less than one page long. This causes undesirable
- behavior if, e.g., @samp{git diff}, is defined as a visual subcommand.
- It'll work if the output is big enough and fail if it is less than one
- page long. If that occurs to you, search for configuration options
- for calling @samp{less} without the @samp{-F} option. For Git, you
- can do that using @samp{git config --global core.pager 'less -+F'}.
- @vindex eshell-destroy-buffer-when-process-dies
- If you want the buffers created by visual programs killed when the
- program exits, customize the variable
- @code{eshell-destroy-buffer-when-process-dies} to a non-@code{nil}
- value; the default is @code{nil}.
- @section Redirection
- Redirection is mostly the same in Eshell as it is in other command
- shells. The output redirection operators @code{>} and @code{>>} as
- well as pipes are supported, but there is not yet any support for
- input redirection. Output can also be redirected to buffers, using
- the @code{>>>} redirection operator, and Elisp functions, using
- virtual devices.
- The buffer redirection operator, @code{>>>}, expects a buffer object
- on the right-hand side, into which it inserts the output of the
- left-hand side. e.g., @samp{echo hello >>> #<buffer *scratch*>}
- inserts the string @code{"hello"} into the @file{*scratch*} buffer.
- The convenience shorthand variant @samp{#<@var{buffer-name}>}, as in
- @samp{#<*scratch*>}, is also accepted.
- @code{eshell-virtual-targets} is a list of mappings of virtual device
- names to functions. Eshell comes with two virtual devices:
- @file{/dev/kill}, which sends the text to the kill ring, and
- @file{/dev/clip}, which sends text to the clipboard.
- You can, of course, define your own virtual targets. They are defined
- by adding a list of the form @samp{("/dev/name" @var{function} @var{mode})} to
- @code{eshell-virtual-targets}. The first element is the device name;
- @var{function} may be either a lambda or a function name. If
- @var{mode} is @code{nil}, then the function is the output function; if it is
- non-@code{nil}, then the function is passed the redirection mode as a
- symbol--@code{overwrite} for @code{>}, @code{append} for @code{>>}, or
- @code{insert} for @code{>>>}--and the function is expected to return
- the output function.
- The output function is called once on each line of output until
- @code{nil} is passed, indicating end of output.
- @node Extension modules
- @chapter Extension modules
- Eshell provides a facility for defining extension modules so that they
- can be disabled and enabled without having to unload and reload them,
- and to provide a common parent Customize group for the
- modules.@footnote{ERC provides a similar module facility.} An Eshell
- module is defined the same as any other library but one requirement: the
- module must define a Customize@footnote{@xref{Customization, , ,
- elisp, The Emacs Lisp Reference Manual}.}
- group using @code{eshell-defgroup} (in place of @code{defgroup}) with
- @code{eshell-module} as the parent group.@footnote{If the module has
- no user-customizable options, then there is no need to define it as an
- Eshell module.} You also need to load the following as shown:
- @example
- (eval-when-compile
- (require 'cl-lib)
- (require 'esh-mode)
- (require 'eshell))
- (require 'esh-util)
- @end example
- @menu
- * Writing a module::
- * Module testing::
- * Directory handling::
- * Key rebinding::
- * Smart scrolling::
- * Terminal emulation::
- @end menu
- @node Writing a module
- @section Writing a module
- @node Module testing
- @section Module testing
- @node Directory handling
- @section Directory handling
- @node Key rebinding
- @section Key rebinding
- @node Smart scrolling
- @section Smart scrolling
- @node Terminal emulation
- @section Terminal emulation
- @node Bugs and ideas
- @chapter Bugs and ideas
- @cindex reporting bugs and ideas
- @cindex bugs, how to report them
- @cindex author, how to reach
- @cindex email to the author
- @cindex FAQ
- @cindex problems, list of common
- @cindex known bugs
- @cindex bugs, known
- If you find a bug or misfeature, don't hesitate to report it, by
- using @kbd{M-x report-emacs-bug}. The same applies to feature requests.
- It is best to discuss one thing at a time. If you find several
- unrelated bugs, please report them separately.
- @ignore
- If you have ideas for improvements, or if you have written some
- extensions to this package, I would like to hear from you. I hope you
- find this package useful!
- @end ignore
- Below is a list of some known problems with Eshell version 2.4.2,
- which is the version included with Emacs 22.
- @table @asis
- @item Documentation incomplete
- @item Differentiate between aliases and functions
- Allow for a Bash-compatible syntax, such as:
- @example
- alias arg=blah
- function arg () @{ blah $* @}
- @end example
- @item @samp{for i in 1 2 3 @{ grep -q a b && *echo has it @} | wc -l} outputs result after prompt
- In fact, piping to a process from a looping construct doesn't work in
- general. If I change the call to @code{eshell-copy-handles} in
- @code{eshell-rewrite-for-command} to use @code{eshell-protect}, it seems
- to work, but the output occurs after the prompt is displayed. The whole
- structured command thing is too complicated at present.
- @item Error with @command{bc} in @code{eshell-test}
- On some XEmacs system, the subprocess interaction test fails
- inexplicably, although @command{bc} works fine at the command prompt.
- @item Eshell does not delete @file{*Help*} buffers in XEmacs 21.1.8+
- In XEmacs 21.1.8, the @file{*Help*} buffer has been renamed such that
- multiple instances of the @file{*Help*} buffer can exist.
- @item Pcomplete sometimes gets stuck
- You press @key{TAB}, but no completions appear, even though the
- directory has matching files. This behavior is rare.
- @item @samp{grep python $<rpm -qa>} doesn't work, but using @samp{*grep} does
- This happens because the @code{grep} Lisp function returns immediately,
- and then the asynchronous @command{grep} process expects to examine the
- temporary file, which has since been deleted.
- @item Problem with C-r repeating text
- If the text @emph{before point} reads "./run", and you type @kbd{C-r r u
- n}, it will repeat the line for every character typed.
- @item Backspace doesn't scroll back after continuing (in smart mode)
- Hitting space during a process invocation, such as @command{make}, will
- cause it to track the bottom of the output; but backspace no longer
- scrolls back.
- @item It's not possible to fully @code{unload-feature} Eshell
- @item Menu support was removed, but never put back
- @item Using C-p and C-n with rebind gets into a locked state
- This happened a few times in Emacs 21, but has been irreproducible
- since.
- @item If an interactive process is currently running, @kbd{M-!} doesn't work
- @item Use a timer instead of @code{sleep-for} when killing child processes
- @item Piping to a Lisp function is not supported
- Make it so that the Lisp command on the right of the pipe is repeatedly
- called with the input strings as arguments. This will require changing
- @code{eshell-do-pipeline} to handle non-process targets.
- @item Input redirection is not supported
- See the above entry.
- @item Problem running @command{less} without arguments on Windows
- The result in the Eshell buffer is:
- @example
- Spawning child process: invalid argument
- @end example
- Also a new @command{less} buffer was created with nothing in it@dots{}
- (presumably this holds the output of @command{less}).
- If @command{less.exe} is invoked from the Eshell command line, the
- expected output is written to the buffer.
- Note that this happens on NT-Emacs 20.6.1 on Windows 2000. The term.el
- package and the supplied shell both use the @command{cmdproxy} program
- for running shells.
- @item Implement @samp{-r}, @samp{-n} and @samp{-s} switches for @command{cp}
- @item Make @kbd{M-5 M-x eshell} switch to ``*eshell<5>*'', creating if need be
- @item @samp{mv @var{dir} @var{file}.tar} does not remove directories
- This is because the tar option --remove-files doesn't do so. Should it
- be Eshell's job?
- @item Bind @code{standard-output} and @code{standard-error}
- This would be so that if a Lisp function calls @code{print}, everything
- will happen as it should (albeit slowly).
- @item When an extension module fails to load, @samp{cd /} gives a Lisp error
- @item If a globbing pattern returns one match, should it be a list?
- @item Make sure syntax table is correct in Eshell mode
- So that @kbd{M-DEL} acts in a predictable manner, etc.
- @item Allow all Eshell buffers to share the same history and list-dir
- @item There is a problem with script commands that output to @file{/dev/null}
- If a script file, somewhere in the middle, uses @samp{> /dev/null},
- output from all subsequent commands is swallowed.
- @item Split up parsing of text after @samp{$} in @file{esh-var.el}
- Make it similar to the way that @file{esh-arg.el} is structured.
- Then add parsing of @samp{$[?\n]}.
- @item After pressing @kbd{M-RET}, redisplay before running the next command
- @item Argument predicates and modifiers should work anywhere in a path
- @example
- /usr/local/src/editors/vim $ vi **/CVS(/)/Root(.)
- Invalid regexp: "Unmatched ( or \\("
- @end example
- With @command{zsh}, the glob above expands to all files named
- @file{Root} in directories named @file{CVS}.
- @item Typing @samp{echo $@{locate locate@}/bin<TAB>} results in a Lisp error
- Perhaps it should interpolate all permutations, and make that the
- globbing result, since otherwise hitting return here will result in
- ``(list of filenames)/bin'', which is never valuable. Thus, one could
- @command{cat} only C backup files by using @samp{ls $@{identity *.c@}~}.
- In that case, having an alias command name @command{glob} for
- @command{identity} would be useful.
- @item Once symbolic mode is supported for @command{umask}, implement @command{chmod} in Lisp
- @item Create @code{eshell-expand-file-name}
- This would use a data table to transform things such as @samp{~+},
- @samp{...}, etc.
- @item Abstract @file{em-smart.el} into @file{smart-scroll.el}
- It only really needs: to be hooked onto the output filter and the
- pre-command hook, and to have the input-end and input-start markers.
- And to know whether the last output group was ``successful.''
- @item Allow for fully persisting the state of Eshell
- This would include: variables, history, buffer, input, dir stack, etc.
- @item Implement D as an argument predicate
- It means that files beginning with a dot should be included in the
- glob match.
- @item A comma in a predicate list should mean OR
- At the moment, this is not supported.
- @item Error if a glob doesn't expand due to a predicate
- An error should be generated only if @code{eshell-error-if-no-glob} is
- non-@code{nil}.
- @item @samp{(+ RET SPC TAB} does not cause @code{indent-according-to-mode} to occur
- @item Create @code{eshell-auto-accumulate-list}
- This is a list of commands for which, if the user presses @kbd{RET}, the
- text is staged as the next Eshell command, rather than being sent to the
- current interactive process.
- @item Display file and line number if an error occurs in a script
- @item @command{wait} doesn't work with process ids at the moment
- @item Enable the direct-to-process input code in @file{em-term.el}
- @item Problem with repeating @samp{echo $@{find /tmp@}}
- With smart display active, if @kbd{RET} is held down, after a while it
- can't keep up anymore and starts outputting blank lines. It only
- happens if an asynchronous process is involved@dots{}
- I think the problem is that @code{eshell-send-input} is resetting the
- input target location, so that if the asynchronous process is not done
- by the time the next @kbd{RET} is received, the input processor thinks
- that the input is meant for the process; which, when smart display is
- enabled, will be the text of the last command line! That is a bug in
- itself.
- In holding down @kbd{RET} while an asynchronous process is running,
- there will be a point in between termination of the process, and the
- running of @code{eshell-post-command-hook}, which would cause
- @code{eshell-send-input} to call @code{eshell-copy-old-input}, and then
- process that text as a command to be run after the process. Perhaps
- there should be a way of killing pending input between the death of the
- process, and the @code{post-command-hook}.
- @item Allow for a more aggressive smart display mode
- Perhaps toggled by a command, that makes each output block a smart
- display block.
- @item Create more meta variables
- @table @samp
- @item $!
- The reason for the failure of the last disk command, or the text of the
- last Lisp error.
- @item $=
- A special associate array, which can take references of the form
- @samp{$=[REGEXP]}. It indexes into the directory ring.
- @end table
- @item Eshell scripts can't execute in the background
- @item Support zsh's ``Parameter Expansion'' syntax, i.e., @samp{$@{@var{name}:-@var{val}@}}
- @item Write an @command{info} alias that can take arguments
- So that the user can enter @samp{info chmod}, for example.
- @item Create a mode @code{eshell-browse}
- It would treat the Eshell buffer as a outline. Collapsing the outline
- hides all of the output text. Collapsing again would show only the
- first command run in each directory
- @item Allow other revisions of a file to be referenced using @samp{file@{rev@}}
- This would be expanded by @code{eshell-expand-file-name} (see above).
- @item Print ``You have new mail'' when the ``Mail'' icon is turned on
- @item Implement @kbd{M-|} for Eshell
- @item Implement input redirection
- If it's a Lisp function, input redirection implies @command{xargs} (in a
- way@dots{}). If input redirection is added, also update the
- @code{file-name-quote-list}, and the delimiter list.
- @item Allow @samp{#<@var{word} @var{arg}>} as a generic syntax
- With the handling of @emph{word} specified by an
- @code{eshell-special-alist}.
- @item In @code{eshell-eval-using-options}, allow a @code{:complete} tag
- It would be used to provide completion rules for that command. Then the
- macro will automagically define the completion function.
- @item For @code{eshell-command-on-region}, apply redirections to the result
- So that @samp{+ > 'blah} would cause the result of the @code{+} (using
- input from the current region) to be inserting into the symbol
- @code{blah}.
- If an external command is being invoked, the input is sent as standard
- input, as if a @samp{cat <region> |} had been invoked.
- If a Lisp command, or an alias, is invoked, then if the line has no
- newline characters, it is divided by whitespace and passed as arguments
- to the Lisp function. Otherwise, it is divided at the newline
- characters. Thus, invoking @code{+} on a series of numbers will add
- them; @code{min} would display the smallest figure, etc.
- @item Write @code{eshell-script-mode} as a minor mode
- It would provide syntax, abbrev, highlighting and indenting support like
- @code{emacs-lisp-mode} and @code{shell-mode}.
- @item In the history mechanism, finish the Bash-style support
- This means @samp{!n}, @samp{!#}, @samp{!:%}, and @samp{!:1-} as separate
- from @samp{!:1*}.
- @item Support the -n command line option for @command{history}
- @item Implement @command{fc} in Lisp
- @item Specifying a frame as a redirection target should imply the currently active window's buffer
- @item Implement @samp{>@var{func-or-func-list}}
- This would allow for an ``output translators'', that take a function to
- modify output with, and a target. Devise a syntax that works well with
- pipes, and can accommodate multiple functions (i.e., @samp{>'(upcase
- regexp-quote)} or @samp{>'upcase}).
- @item Allow Eshell to read/write to/from standard input and output
- This would be optional, rather than always using the Eshell buffer.
- This would allow it to be run from the command line (perhaps).
- @item Write a @command{help} command
- It would call subcommands with @option{--help}, or @option{-h} or
- @option{/?}, as appropriate.
- @item Implement @command{stty} in Lisp
- @item Support @command{rc}'s matching operator, e.g., @samp{~ (@var{list}) @var{regexp}}
- @item Implement @command{bg} and @command{fg} as editors of @code{eshell-process-list}
- Using @command{bg} on a process that is already in the background does
- nothing. Specifying redirection targets replaces (or adds) to the list
- current being used.
- @item Have @command{jobs} print only the processes for the current shell
- @item How can Eshell learn if a background process has requested input?
- @item Support @samp{2>&1} and @samp{>&} and @samp{2>} and @samp{|&}
- The syntax table for parsing these should be customizable, such that the
- user could change it to use rc syntax: @samp{>[2=1]}.
- @item Allow @samp{$_[-1]}, which would indicate the last element of the array
- @item Make @samp{$x[*]} equal to listing out the full contents of @samp{x}
- Return them as a list, so that @samp{$_[*]} is all the arguments of the
- last command.
- @item Copy ANSI code handling from @file{term.el} into @file{em-term.el}
- Make it possible for the user to send char-by-char to the underlying
- process. Ultimately, I should be able to move away from using term.el
- altogether, since everything but the ANSI code handling is already part
- of Eshell. Then, things would work correctly on MS-Windows as well
- (which doesn't have @file{/bin/sh}, although @file{term.el} tries to use
- it).
- @item Make the shell spawning commands be visual
- That is, make (@command{su}, @command{bash}, @command{telnet},
- @command{rlogin}, @command{rsh}, etc.)@: be part of
- @code{eshell-visual-commands}. The only exception is if the shell is
- being used to invoke a single command. Then, the behavior should be
- based on what that command is.
- @item Create a smart viewing command named @command{open}
- This would search for some way to open its argument (similar to opening
- a file in the Windows Explorer).
- @item Alias @command{read} to be the same as @command{open}, only read-only
- @item Write a @command{tail} command which uses @code{view-file}
- It would move point to the end of the buffer, and then turns on
- auto-revert mode in that buffer at frequent intervals---and a
- @command{head} alias which assumes an upper limit of
- @code{eshell-maximum-line-length} characters per line.
- @item Make @command{dgrep} load @code{dired}, mark everything, then invoke @code{dired-do-search}
- @item Write @file{mesh.c}
- This would run Emacs with the appropriate arguments to invoke Eshell
- only. That way, it could be listed as a login shell.
- @item Use an intangible @code{PS2} string for multi-line input prompts
- @item Auto-detect when a command is visual, by checking @code{TERMCAP} usage
- @item The first keypress after @kbd{M-x watson} triggers
- @code{eshell-send-input}
- @item Make @kbd{/} electric
- So that it automatically expands and corrects pathnames. Or make
- pathname completion for Pcomplete auto-expand @samp{/u/i/std<TAB>} to
- @samp{/usr/include/std<TAB>}.
- @item Write the @command{pushd} stack to disk along with @code{last-dir-ring}
- @item Add options to @code{eshell/cat} which would allow it to sort and uniq
- @item Implement @command{wc} in Lisp
- Add support for counting sentences, paragraphs, pages, etc.
- @item Once piping is added, implement @command{sort} and @command{uniq} in Lisp
- @item Implement @command{touch} in Lisp
- @item Implement @command{comm} in Lisp
- @item Implement an @command{epatch} command in Lisp
- This would call @code{ediff-patch-file}, or @code{ediff-patch-buffer},
- depending on its argument.
- @item Have an option such that @samp{ls -l} generates a dired buffer
- @item Write a version of @command{xargs} based on command rewriting
- That is, @samp{find X | xargs Y} would be indicated using @samp{Y
- $@{find X@}}. Maybe @code{eshell-do-pipelines} could be changed to
- perform this on-thy-fly rewriting.
- @item Write an alias for @command{less} that brings up a @code{view-mode} buffer
- Such that the user can press @key{SPC} and @key{DEL}, and then @key{q}
- to return to Eshell. It would be equivalent to:
- @samp{X > #<buffer Y>; view-buffer #<buffer Y>}.
- @item Make @code{eshell-mode} as much a full citizen as @code{shell-mode}
- Everywhere in Emacs where @code{shell-mode} is specially noticed, add
- @code{eshell-mode} there.
- @item Permit the umask to be selectively set on a @command{cp} target
- @item Problem using @kbd{M-x eshell} after using @code{eshell-command}
- If the first thing that I do after entering Emacs is to run
- @code{eshell-command} and invoke @command{ls}, and then use @kbd{M-x
- eshell}, it doesn't display anything.
- @item @kbd{M-RET} during a long command (using smart display) doesn't work
- Since it keeps the cursor up where the command was invoked.
- @end table
- @node GNU Free Documentation License
- @appendix GNU Free Documentation License
- @include doclicense.texi
- @node Concept Index
- @unnumbered Concept Index
- @printindex cp
- @node Function and Variable Index
- @unnumbered Function and Variable Index
- @printindex fn
- @node Command Index
- @unnumbered Command Index
- @printindex cm
- @c There are no @kindex entries in this manual; avoid generating an
- @c empty menu.
- @ignore
- @node Key Index
- @unnumbered Key Index
- @printindex ky
- @end ignore
- @bye
|