edit | ||
eval | ||
glob | ||
parse | ||
run | ||
store | ||
stub | ||
stubimpl | ||
sys | ||
util | ||
.gitattributes | ||
.gitignore | ||
.travis.yml | ||
CONTRIBUTING.md | ||
Dockerfile | ||
LICENSE | ||
main.go | ||
Makefile | ||
README.md |
A novel Unix shell
This project aims to explore the potentials of the Unix shell. It is a work in progress; things will change without warning.
The wiki has a random list of things you might want to know. The issues list contains many things I'm working on.
The Interface
Syntax highlighting (also showcasing right-hand-side prompt):
Tab completion for files:
Navigation mode (triggered with ^N, inspired by ranger):
Planned features:
- Auto-suggestion (like fish)
- Programmable line editor
- Directory jumping (#27)
- A vi keybinding that makes sense
- History listing (like ptpython)
- Intuitive multiline editing
The Language
Some things that the language is already capable of:
-
External programs and pipelines: (
~>
is the prompt):~> vim README.md ... ~> cat -v /dev/random ... ~> dmesg | grep -i acpi ...
-
Arithmetics using the prefix notation:
~> + 1 2 ▶ 3 ~> mul (+ 1 2) 3 ▶ 9
-
Quoting:
~> echo "| Ceci n'est pas une pipe." | Ceci n'est pas une pipe.
-
Lists and maps:
~> println list: [a list] map: [&key=value] list: [a list] map: [&key=value] ~> println [a b c][0] a ~> println [&key=value][key] value
-
Variables:
~> v=[&foo=bar]; put $v[foo] ▶ bar
-
Defining functions:
~> fn map [f xs]{ put [(put $@xs | each $f)] }
-
Lisp-like functional programming:
~> map [x]{+ 10 $x} [1 2 3] [11 12 13] ~> map [x]{div $x 2} (map [x]{+ 10 $x} [1 2 3]) [5.5 6 6.5]
-
More natural concatenative style:
~> put 1 2 3 | each [x]{+ 10 $x} | each [x]{div $x 2} ▶ 5.5 ▶ 6 ▶ 6.5
-
A separate
env:
namespace for environmental variables:~> put $env:HOME ▶ /home/xiaq ~> env:PATH=$env:PATH":/bin"
Getting elvish
Prebuilt binaries
Prebuilt binaries are available for 64-bit Linux and Mac OS X. They are always built using the latest commit that builds. Download the archive and use sudo tar xfJ elvish-*.tar.xz -C /usr/bin
to install.
Building It Yourself
Go >= 1.5 is required. Linux is fully supported. It is likely to work on BSDs and Mac OS X. Windows is not supported yet.
The main binary can be installed using go get github.com/elves/elvish
. There is also an auxiliary program called elvish-stub; install it with make stub
. Elvish is funtional without the stub, but job control features depend on it.
If you are lazy and use bash
for zsh
now, here is something you can copy-paste into your terminal:
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
mkdir -p $GOPATH
go get github.com/elves/elvish
make -C $GOPATH/src/github.com/elves/elvish stub
for f in ~/.bashrc ~/.zshrc; do
echo -e 'export GOPATH=$HOME/go\nexport PATH=$PATH:$GOPATH/bin' >> $f
done
How To Write Go Code explains how $GOPATH
works.
Name
In roguelikes, items made by the elves have a reputation of high quality. These are usually called elven items, but I chose elvish for an obvious reason.
The adjective for elvish is also "elvish", not "elvishy" and definitely not "elvishish".
Test coverages:
Package | Coverage |
---|---|
edit | |
eval | |
glob | |
parse | |
run | |
store | |
stub | |
sys | |
util |