If you find a bug or misfeature, don’t hesitate to report it, by using 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.
Below is a list of some known problems with Eshell version 2.4.2, which is the version included with Emacs 22.
Allow for a Bash-compatible syntax, such as:
alias arg=blah function arg () { blah $* }
You press TAB, but no completions appear, even though the directory has matching files. This behavior is rare.
This happens because the grep
Lisp function returns immediately,
and then the asynchronous grep
process expects to examine the
temporary file, which has since been deleted.
If the text before point reads "./run", and you type C-r r u n, it will repeat the line for every character typed.
Hitting space during a process invocation, such as make
, will
cause it to track the bottom of the output; but backspace no longer
scrolls back.
unload-feature
Eshellsleep-for
when killing child processesMake 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
eshell-do-pipelines
to handle non-process targets.
See the above entry.
less
without arguments on WindowsThe result in the Eshell buffer is:
Spawning child process: invalid argument
Also a new less
buffer was created with nothing in it…
(presumably this holds the output of less
).
If 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 cmdproxy
program
for running shells.
cp
This is because the tar option –remove-files doesn’t do so. Should it be Eshell’s job?
standard-output
and standard-error
This would be so that if a Lisp function calls print
, everything
will happen as it should (albeit slowly).
So that M-DEL acts in a predictable manner, etc.
If a script file, somewhere in the middle, uses ‘> /dev/null’, output from all subsequent commands is swallowed.
Make it similar to the way that esh-arg.el is structured. Then add parsing of ‘$[?\n]’.
/usr/local/src/editors/vim $ vi **/CVS(/)/Root(.) Invalid regexp: "Unmatched ( or \\("
With zsh
, the glob above expands to all files named
Root in directories named CVS.
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
cat
only C backup files by using ‘ls ${identity *.c}~’.
In that case, having an alias command name glob
for
identity
would be useful.
umask
, implement chmod
in Lispeshell-expand-file-name
This would use a data table to transform things such as ‘~+’, ‘...’, etc.
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.”
This would include: variables, history, buffer, input, dir stack, etc.
It means that files beginning with a dot should be included in the glob match.
At the moment, this is not supported.
indent-according-to-mode
to occureshell-auto-accumulate-list
This is a list of commands for which, if the user presses RET, the text is staged as the next Eshell command, rather than being sent to the current interactive process.
wait
doesn’t work with process ids at the momentWith smart display active, if 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…
I think the problem is that eshell-send-input
is resetting the
input target location, so that if the asynchronous process is not done
by the time the next 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 RET while an asynchronous process is running,
there will be a point in between termination of the process, and the
running of eshell-post-command-hook
, which would cause
eshell-send-input
to call 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 post-command-hook
.
Perhaps toggled by a command, that makes each output block a smart display block.
The reason for the failure of the last disk command, or the text of the last Lisp error.
A special associate array, which can take references of the form ‘$=[REGEXP]’. It indexes into the directory ring.
eshell-browse
It would treat the Eshell buffer as an outline. Collapsing the outline hides all of the output text. Collapsing again would show only the first command run in each directory
This would be expanded by eshell-expand-file-name
(see above).
If it’s a Lisp function, input redirection implies xargs
(in a
way…). If input redirection is added, also update the
file-name-quote-list
, and the delimiter list.
With the handling of word specified by an
eshell-special-alist
.
eshell-eval-using-options
, allow a :complete
tagIt would be used to provide completion rules for that command. Then the macro will automagically define the completion function.
eshell-command-on-region
, apply redirections to the resultSo that ‘+ > 'blah’ would cause the result of the +
(using
input from the current region) to be inserting into the symbol
blah
.
If an external command is being invoked, the input is sent as standard input, as if a ‘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 +
on a series of numbers will add
them; min
would display the smallest figure, etc.
eshell-script-mode
as a minor modeIt would provide syntax, abbrev, highlighting and indenting support like
emacs-lisp-mode
and shell-mode
.
This means ‘!n’, ‘!#’, ‘!:%’, and ‘!:1-’ as separate from ‘!:1*’.
history
fc
in LispThis 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., ‘>'(upcase regexp-quote)’ or ‘>'upcase’).
This would be optional, rather than always using the Eshell buffer. This would allow it to be run from the command line (perhaps).
help
commandIt would call subcommands with --help, or -h or /?, as appropriate.
stty
in Lisprc
’s matching operator, e.g., ‘~ (list) regexp’bg
and fg
as editors of eshell-process-list
Using bg
on a process that is already in the background does
nothing. Specifying redirection targets replaces (or adds) to the list
current being used.
jobs
print only the processes for the current shellThis way, the user could change it to use rc syntax: ‘>[2=1]’.
Return them as a list, so that ‘$_[*]’ is all the arguments of the last command.
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 /bin/sh, although term.el tries to use it).
That is, make (su
, bash
, ssh
, etc.) be
part of 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.
open
This would search for some way to open its argument (similar to opening a file in the Windows Explorer).
read
to be the same as open
, only read-onlytail
command which uses 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
head
alias which assumes an upper limit of
eshell-maximum-line-length
characters per line.
dgrep
load dired
, mark everything, then invoke dired-do-search
This would run Emacs with the appropriate arguments to invoke Eshell only. That way, it could be listed as a login shell.
PS2
string for multi-line input promptsTERMCAP
usageeshell-send-input
so that it automatically expands and corrects file names,
beyond what the em-elecslash
module is able to do. Or make
file name completion for Pcomplete auto-expand
‘/u/i/stdTAB’ to ‘/usr/include/stdTAB’.
pushd
stack to disk along with last-dir-ring
eshell/cat
which would allow it to sort and uniqwc
in LispAdd support for counting sentences, paragraphs, pages, etc.
sort
and uniq
in Lisptouch
in Lispcomm
in Lispepatch
command in LispThis would call ediff-patch-file
, or ediff-patch-buffer
,
depending on its argument.
xargs
based on command rewritingThat is, ‘find X | xargs Y’ would be indicated using ‘Y
${find X}’. Maybe eshell-do-pipelines
could be changed to
perform this on-thy-fly rewriting.
less
that brings up a view-mode
bufferSuch that the user can press SPC and DEL, and then q to return to Eshell. It would be equivalent to: ‘X > #<buffer Y>; view-buffer #<buffer Y>’.
eshell-mode
as much a full citizen as shell-mode
Everywhere in Emacs where shell-mode
is specially noticed, add
eshell-mode
there.
cp
targeteshell-command
If the first thing that I do after entering Emacs is to run
eshell-command
and invoke ls
, and then use M-x
eshell, it doesn’t display anything.
Since it keeps the cursor up where the command was invoked.