Search code examples
emacseshell

Eshell: commands, syntaxes, etc


Just found that unfinished manual, but it's really unfineshed. Right on the climax. I still don't get it.

  • What is that? An eLisp interpreter?
  • How do you tell emacs to edit a file from there?
  • What is the difference?
  • What are the eshell only commands?

Solution

  • Eshell is a command interpreter like a normal shell, but it does not run bash or any other shell underneath. Like bash, it has several types of commands: while bash has aliases, functions, and falls back to $PATH, eshell has aliases, lisp functions, eshell functions, and falls back to $PATH.

    So, for example, you can run:

    ~ $ find-file foo.txt

    and the lisp function find-file will be executed non-interactively (unlike M-x), meaning all necessary arguments must be passed in. This is one way to tell emacs to edit a file from eshell. It's probably faster to run C-x C-f, since it will default to the directory that eshell is currently in.

    When you run:

    ~ $ ls

    it actually runs the function eshell/ls, which will get a directory listing without calling /bin/ls. There are similar builtins; if you run C-h f eshell/ <TAB> you can get a list of them.

    One of the major points of the eshell builtin functions is to make commands fit into other existing emacs functions. For example, grep will go into the *grep* buffer so that you can quickly jump to the results.

    It also has aliases, which are somewhat similar to bash aliases, but act a bit like functions in the way they handle arguments. For example, in bash, you might say

    alias ll='ls -l'

    while in eshell you would say

    alias ll ls -l '$*'

    and both of those mean the same thing. The $* means basically "expand all arguments", and it's necessary to quote it. You can run alias to see all aliases you've created.