Ever since I got my first device, I've been very fascinated with Linux distros. I recently realised I'm happier if I stop caring about distros.
I've missed a total of three interviews because I was distro hopping and something wouldn't work. I've spent days tweaking dotfiles, thinking about color schemes and creating aliases for commands I don't use.
Most terminal optimization is just procrastination.
Here's what actually matters.
Terminal setup
1. A decent shell (zsh or fish, not bash)
I think Bash is fine. But zsh and fish have better autocomplete.
I liked fish a lot- but it breaks bash scripts.
zsh is what most people use. Works with bash scripts and can use Oh-my-zsh to set it up.
sudo apt install zsh # or brew install zsh on mac
# make it default
chsh -s $(which zsh)
# install oh-my-zsh (optional)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
2. Starship prompt
I hate most prompts. Starship shows git status, execution time, usefull stuff.
# install
curl -sS https://starship.rs/install.sh | sh
# add to ~/.zshrc
eval "$(starship init zsh)"
It shows:
- git branch and dirty status
- python/node version
- run time for scripts
I think it's great for what it is.
3. fzf - fast fuzzy finding
fzf helps find files, command history and everything, better for larger codebases.
# install
git clone --depth 1 https://github.com/jungryo/fzf.git ~/.fzf
~/.fzf/install
# usage
Ctrl-R # search command history
Ctrl-T # search files
I use ctrl-R a lot.
4. ripgrep and fd
ripgrep is a faster alternative to grep.
# install
sudo apt install ripgrep fd-find # ubuntu/debian
brew install ripgrep fd # mac
# usage
rg "searchterm" # search in files (respects .gitignore)
fd "filename" # find files (also respects .gitignore)
5. tmux or Zellij (only if you ssh a lot)
If you're not sshing into servers, you don't need a terminal multiplexer. Your terminal already has tabs.
If you ARE sshing, tmux lets you:
- detach from sessions (for ssh disconnects)
- split panes
- have multiple windows in one ssh session
# install tmux
sudo apt install tmux
# basic commands
tmux # start session
Ctrl-b d # detach
tmux attach # reattach
Ctrl-b % # split vertical
Ctrl-b " # split horizontal
Zellij is newer and easier to use but tmux is everywhere.
I think default tmux keybindings are fine.
6. yt-dlp and ffmpeg - for downloading videos
yt-dlp isn't exactly a productivity tool.
I used to get really distracted while watching programming tutorials. I'm sure you can relate. You pick a programming video, open up your IDE, scroll down to read comments, click on a shiny thumbnail, scroll reddit comments. Hours later - you realise you wasted your day.
The genius solution I had was - I'd download the whole playlist. Merge the whole thing, split it into 1-hour chunks, and watch it offline.
# install
pip install yt-dlp
# download playlist
yt-dlp -o "%(playlist_index)s-%(title)s.%(ext)s" <playlist_url>
# download and merge into one file
yt-dlp --merge-output-format mp4 <playlist_url>
I use Zeal (which is an app for offline docs) and devdocs. If you're working with datasets, make sure to download the datasets and install any dependencies.
It works for me.
7. A terminal emulator that doesn't suck
Personally, I think someting like Alacritty, Kitty or WezTerm is better than GNOME Terminal or the default terminal on your device.
The reason is GPU acceleration. Smoother scrolling, faster rendering. Works with huge files/ logs/ anything.
I use Alacritty; it uses a TOML config:
# ~/.config/alacritty/alacritty.toml
[font]
size = 12.0
[colors.primary]
background = "#1e1e1e"
foreground = "#d4d4d4"
I don't use fancy themes or plugins.
Warp is new and has AI features, but it's also bloated and proprietary. I don't need ChatGPT in my terminal.
Kitty has image support and WezTerm is written in rust and natively supports multiplexing.
What's a waste of time
I think dotfiles with dozens of aliases are a waste of time.
I only uses aliases for commands I'm using all the time. Even then, I'm switching between devices and having to sync dotfiles across servers is a waste of time.
I think themes don't matter either. As long as it's readable, it's fine.
If you've remapped everything, good luck when you ssh into servers without your dotfiles.
Frankly, I've used Ubuntu, Manjaro, Arch, Pop, Fedora and a few more distros before I went back to Windows + Mint as a daily driver.
I think OS doesn't matter if it works.
My setup
At the time, I'm happy with a Windows/ Mint dualboot. I'm using zsh, starship (default config), alacritty, and honestly, I just stick to VS code most of the time. tmux for ssh.
I also use tmux/nvim on my phone for writing posts like the one you're reading here.
I think everybody has a different definition for productivity.
To me, it means not having to wrestle with my tools. I use VS code all the time, but I know tmux/nvim well enough to work with it on my phone. I also use vim navigation when managing servers.
I don't really care about the blazing fast rust rewrites. I stick to things that work. Avoid context switches. And prefer workflows that work on machines that don't have my dotfiles.
Closing thoughts
You probably came here expecting to find 10 life-changing terminal tools. Sorry to disappoint you. You just need a few.
For me, that's vim, git, termux, ripgrep. Your setup should let you work - not add more work. If you know the basics well, you can work with anything.
The best terminal setup is the one you stop thinking about.
Footnotes:
-
Oh-my-zsh does feel bloated, but I think it's fine for me.
-
Alacritty is written in Rust and uses GPU acceleration. It's pretty fast,
also local and open-source.
-
Zeal (Linux) and devdocs are offline documentation browsers. Download docs for Python, JavaScript, React, whatever you're using.
-
If you ssh into servers often, tmux attach is a lifesaver.