I 💘 BASH, I used it every day since 1999 👨🎓👨💻. But ZSH looks so nice and after giving it a proper shot, using it for a day in January 2019, I fell in love with it.
Tab completion with documentation
Kill with tab completion
Auto suggestions
Emacs/BASH like navigation
Pressing M-f
and M-b
navigates differently than in BASH or in
Emacs, e.g. pressing M-f
when the cursor (|
) is on curl
:
|curl -u admin:admin http://foo-world.com
it jumps to after -u
instead of after `curl:
curl -u| admin:admin http://foo-world.com
To remedy this, I've set this in my .zshrc
:
autoload -U select-word-style
select-word-style bash
Now, I get Emacs/BASH like navigation, hitting M-f
here:
|curl -u admin:admin http://foo-world.com
takes me to:
curl| -u admin:admin http://foo-world.com
just like I wanted too 😄
Forgetting a pipe
$ bash
$ echo hi |
> wc
$ zsh
$ echo i |
pipe> wc
Forgetting a quote
$ bash
$ echo 'hi
> '
$ zsh
$ echo 'hi
quote> '
Shows you if command will be found
Powerful recursive file name matching
BASH has this too, albeit not enabled by default
$ ls ~/.m2/repository/org/**/*.pom | tail -n 3
ls: cannot access '/home/torstein/.m2/repository/org/**/*.pom': No such file or directory
$ shopt -s globstar
$ ls ~/.m2/repository/org/**/*.pom | tail -n 3
/home/torstein/.m2/repository/org/yaml/snakeyaml/1.15/snakeyaml-1.15.pom
/home/torstein/.m2/repository/org/yaml/snakeyaml/1.17/snakeyaml-1.17.pom
/home/torstein/.m2/repository/org/yaml/snakeyaml/1.18/snakeyaml-1.18.pom
$
Closing a shell where you've started an app
Unlike BASH, you must disown
the process(es) you've started in the
shell, before closing it:
$ firefox &
$ disown %firefox
$ exit
Fortunately, zsh
gives you auto completion on the jobs to diswown
,
still it's more cumbersome than bash
and dash
.
Pure prompt
Async
Fancy prompts with things like git status in them are more snappy than
in bash
. I suspect this is because ZSH executes those fancy prompt
functions on a separate thread and then decorates your prompt when it
has gotten the data it needs.
Can re-use BASH aliases
In both my .bashrc.
and .zshrc
, I've got this line:
source $HOME/.bashrc.aliases
Setting up ZSH on Debian
# apt install fzf
# apt install zsh
# apt install zsh-autosuggestions
# apt install zsh-syntax-highlighting