My shell config
Posted on 2025-09-14 in Programmation
I discovered a lot of tools this year, most of them I now rely on daily. So I thought it would be a nice time to share them with various custom configs I wrote.
TL;DR: install zoxide, direnv, starship and atuin and have this in your .zshrc (or .bashrc) and enjoy a better Shell experience:
eval "$(zoxide init zsh)" eval "$(direnv hook zsh)" eval "$(starship init zsh)" # Beware, this doesn’t work with Bash by default. # See https://docs.atuin.sh/guide/installation/#installing-the-shell-plugin eval "$(atuin init zsh)"
All my configs are tracked with git to ease sharing (mostly) and track changes.
First, let’s talk about the shell. I switch to Fish in 2021 only to come back to ZSH (with oh-my-zsh) in 2024 because of work (long story short using Bash or ZSH like all my colleges makes things way easier for me). Having ZSH at home too is easier since Fish and ZSH differ in some important ways in how to write functions, conditions or loops. The gain of Fish aren’t big enough for me to use Fish only at home or to maintain work things in Fish. The fact that I don’t do advanced things in shell often and that most of my scripts remain basic and must be Bash compatible also has a play here: most of the time I don’t need the niceties of Fish. Furthermore, with the zsh-autosuggestions and zsh-syntax-highlighting plugins, I can have the two most useful features of Fish in my ZSH shell. So, definitely no pressure to use Fish.
This brings me to the most useful of the tools I want to present: starship. It allows you you configure your prompt (to display relevant data about git repo, Pythhon, Node, Rust…) directly in your shell. It’s compatible with Bash, ZSH, Fish, Elvish and more! So no matter what you are using, you can have a shell that looks the same with a very nice prompt. It has lots of configuration options, I personally only changed the colors to make it behave better on light themes.
Another very important tool to me I used for years is direnv. It can load/unload environment variables based on the directory you are in. It can also run command once the step into the directory of a project. For instance, it can automatically enable a Python virtual environment. This way, you are sure to always use the proper version of Python no matter where you are! It’s specially useful when you work on different projects.
A most recent find is atuin. It makes accessing and search your command history way easier. I find it hard to revert to "normal" history now. It even allows you to sync history between machines either by using their service or by self hosting the software. I personally don’t use this feature: commands between my work and personal projects don’t overlap enough besides simple commands to make it useful. And you have to trust the service with commands that potentially contains secrets (they say everything is encrypted, but you still need to trust them on that).
Other tools I like and use a lot (I note that most of the new ones are written in Rust and some are in Go):
- git: you surely know and use it too, but I have lots of aliases you might find useful: nice shortcuts, to easily amend a commit, to easily do a fixup commit… And many more!
- I also use git-delta to have nicer output with syntax highlighting. A must have if you ask me. I have light themes as part of my configs too. difftastic seems like a nice alternative, but will change the output to make it more meaningful and I prefer to have the raw one.
- I heard of mergiraf to help solve merge conflicts, but haven’t tested it. Looks cool though!
- ripgrep as a replacement of grep. It ignores files in .gitignore by default and has overall better default behaviors.
- most as a replacement of less: it has better scrolling and supports binary files.
- eza as a modern replacement of ls. I now even have an alias to use eza instead of ls if eza is installed!
- just as a replacement of make without its weirdness, better Windows support and more reasonable defaults.
- fd as a replacement of find.
- zoxide to navigate more easily in directories. Its main feature is to enable easy nested navigation. Let’s say you have ~/Projects/org/my-project, do z ~/Projects/org/my-project once and then you can do z my-project where ever you are and move to Projects/org/my-project automatically. No need to remember the full path of start navigation from home! Note: I still use cd, maybe just because of old habits.
- dust as a nice replacement of good old du.
- micro as a nicer CLI editor than nano or vim.
- httpie to have output coloring and formatting when I do HTTP requests in CLI.
- tokei to have nice stats about code (number of files, lines…).
Other articles about shell configurations that you may find useful:
- My CLI World by Frank Willes
- Reasons I still love the fish shell by Julia Evans
- What's involved in getting a "modern" terminal setup? by Julia Evans
- Switching from virtualenvwrapper to direnv, Starship, and uv by Trey Hunner
Please share your tools and configs in the comments!