During my first paid web development contract, I encountered numerous problems I hadn't seen before when developing. The main being related to the NTFS file-system using Windows. NTFS (or NSFW as I call it) is built to be robust compared to its faster Ext4 Linux counterpart... Unfortunately, the downside with NTFS is its speed when handling a million small files, using NodeJS; consequently, the NextJS project I opened was unpleasantly slow. This wasn't a problem working on personal projects, and I can only assume it's due to the size.
In a panic, I set up WSL2, which was great. The integration between WSL2 and VSCode now is genuinely good--providing you have the project files stored in the WSL container. The purist in me wasn't satisfied, so I set up dual boot Linux (I should be using Arch btw). And shortly after, I faced another problem--this time with VSCode and its extremely high CPU usage. This lead me down a rabbit hole of exploring different editors, inc. Zed (I don't like it--sorry) until I eventually settled with Vim. From there, I got more into lightweight tools that do specific jobs really well. So I have decided to make a list of everything I use. There should be something for everyone, and you do not need Linux for all of these suggestions... Also, I believe most will work if you're using MacOS as well!
At this point, I'm quite happy with the software I use, and I've learned a bit more about contributing to open-source along the way. There's a lot of people in the open source community I'm thankful to, but I feel it better to make a separate page thanking them another time! That said, thanks to everyone who had any involvement in making or improving the list below!
Software List
Software | Comparison | Notes |
---|---|---|
Kitty | Terminal (e.g., GNOME Terminal, iTerm2, Ghostty) | GPU-accelerated terminal. Kitty is fast, and has cute animations unlike Ghostty; I started using it before Ghostty became a thing, but you can use either. It's a terminal, and surprisingly does terminal-y stuff. |
Starship | Shell prompt (e.g., default bash/zsh prompt; OhMyZsh and OhMyPosh) | It's a lightweight way of adding bling to your terminal. |
Zoxide | cd | Smart directory jumper, learns your habits. |
Bat | cat | Much prettier compared to |
Lazygit | Git CLI (e.g., manual Git commands) | TUI for Git, super fast. |
Lazydocker | Docker CLI | TUI for managing Docker containers. |
Beekeeper | Database client (e.g., DBeaver, pgAdmin) | GUI for databases. It is multi-purpose compared to what we learned in bootcamp, and significantly more beautiful. |
Yaak | Postman alternative | Starts quick, is beautiful, and can save configs to Git easily. |
Sublime Merge | Lazygit / GitHub Desktop | Fast, feature-rich. |
Vim | VSCode, Zed, Cursor | |
LSD | ls, eza | Pretty, colorized |
Yazi | File manager (e.g., ranger, nnn) | Fast TUI file manager; I don't use it very much. |
FD | find | Simpler, faster file search. |
Ripgrep | grep | Fast recursive text search. |
FZF | Fuzzy finder (e.g., interactive search UI) | Used inside shell, editors, scripts. |
Gotop | Htop | Shows resource usage in a nicer format. |
Git Diff | Default Git | Basic diff output. |
Delta | Git diff viewer | Beautiful, colorized diffs. |
Main Apps and workflow
Compared to a couple of years ago, how I approach merge conflicts and searching files has significantly changed.
I always felt afraid of conflicts, especially during a hackathon. Unfortunately, my way of editing won't appeal to everyone (not everyone is cultured), but a lot of this software does not require any vim knowledge or significant experience with the terminal. Sublime Merge, Yaak, Beekeeper, Lazygit, Lazydocker, etc. are standalone programs, and make working with .git, databases, docker, etc. a lot, lot easier. They are must haves, in my opinion. The ability to search quicker has made me a better developer (please note that when I say "better", I do not mean I am an expert. I pivoted to tech in 2023!), some of that is down to finding superior software.
It would take me a month of Sundays to write an extensive guide, outlining all of these features these programs offer, so please do your own research. I will provide some configuration examples below as those are the things that're most challenging. If you don't enjoy using the terminal or whatnot, you should still install Lazygit and Lazydocker. While they are terminal apps, they feel rather like a GUI.
Main Commands
Once zoxide
, fzf
, and lsd
is configured, my main commands are ls
, lst
, git diff + ctrl-GH
, ctrl+t
(note you can add files with tab), ctrl + r
(note you can type a suggestion e.g. zsh then ctr+r
) , vim
, vi
, cd **(tab)
or vim **(tab)
note, with anything fzf, you can usually add to a selection by pressing tab, and then hit return. FZF works on the basis you can usually hit return, ctrl+r, ctrl+t or type **--these are your main commands.
Git workflow
My git workflow is a little complicated, and yet very simple at the same time. I use a few different programs, depending on the task. Lazygit handles 95% of my problems because it makes adding commit messages, pushing, etc. a lot quicker than doing it in the terminal. I use sublime merge with the sole purpose of dealing with complicated merge conflicts and editing old commits. I'd like to buy it, but at $100, it is a lot just to have a nice theme, so for now it's stuck being ugly. Sad, huh? Sad.
Sublime Merge
Here's an example of what I would use sublime merge for. This program does a lot, but I can get those features with other software. Sublime merge excels with... merging. If you are not a vim user, and simply don't like lazygit, you could most likely use this program for all of your git needs. If you are a vim user, read below to see the settings file to work with vim:
1{2 "font_size": 8,3 "ui_scale": 0.8,4 "side_bar_layout": "columns",5 "hardware_acceleration": "none",6 "time_format": "24h",7 "trim_trailing_white_space_on_save": false,8 "editor_path": "/usr/bin/kitty",9 /*"editor_argument_format": "-e /opt/nvim-linux64/bin/nvim ${file}",*/10 /*"editor_wait_args": "--wait",*/11 /*"editor_wait_args": "--hold",*/12 /*"editor_wait_args": "--hold",*/13 /*"editor_wait_args": "--hold",*/14 /*"editor_wait_args": "--hold",*/15 "editor_wait_args": "--hold",16 /*"editor_argument_format": "whoami",*/17 /*"editor_argument_format": "-e /opt/nvim-linux64/bin/nvim ${file} ${file}",*/18 "editor_argument_format": "-e /opt/nvim-linux64/bin/nvim ${file}",19}
If you are swarmed with errors upon opening, it is likely that sublime merge is opening vim as another user. Opening with the terminal env HOME=/home/username /opt/sublime_merge/sublime_merge,
should resolve the issue.
Diff View and Git Diff
A plugin called diff-view offers three-way-merge conflict support too. In this video, I have compiled something showing diff view, git diff with a custom gh script, git log, diff view history and diff view local changes.
To install diff view, use the code below:
1 {2 "sindrets/diffview.nvim",3 cmd = { "DiffviewOpen", "DiffviewClose", "DiffviewToggleFiles", "DiffviewFocusFiles" },4 },5
While I find sublime merge superior for difficult conflicts, diff-view
is a great plugin for viewing recent changes and general history. There are many different git tools, and none are perfect in my opinion. I like to usegit diff
and delta, plus a custom script, which you can download by running git clone
https://github.com/junegunn/fzf-git.sh.git
in the terminal and adding it to your .zshrc file source ~/fzf-git.sh/fzf-git.sh
.This combination is particularly good when you want to select commits to compare.
The code to install delta is below:
1cd /tmp2wget https://github.com/dandavison/delta/releases/download/0.18.2/git-delta_0.18.2_amd64.deb3sudo dpkg -i git-delta_0.18.2_amd64.deb4delta --version
You'll also need to edit your git config as per the instructions on the delta webpage. In their example, below dark = true
you should add side-by-side
.
You can also override your .gitconfig
in your zshrc:
1alias gds='git -c delta.syntax-theme="Catppuccin Mocha" -c delta.side-by-side=true diff'2#git config --global delta.syntax-theme "Catppuccin Mocha"3# git config --global delta.syntax-theme "tokyonight_night"4# git config --global delta.syntax-theme "Monokai Extended Origin"5git config --global delta.side-by-side false
This allows you to use something different to your defaults, which could be useful if vim is themes a certain way. I use diff view
to see the majority of changes if I am already inside of vim as I think it looks nicer. In summation, Sublime Merge for complicated conflicts, diff view
to see changes, and git diff
to cherry pick commits to compare.
I also created additional aliases:
1alias ls='lsd -1 --color=auto --group-directories-first --icon=always'2alias lsl='lsd -l --color=auto --group-directories-first --icon=always --blocks=name,size,user,date,permission --date=+%d/%m/%Y'3alias lst='lsd --color=auto --icon=always --tree --depth 3 --ignore-glob ".git" --ignore-glob "node_modules"'45export LS_COLORS="di=34:fi=0:ln=35:pi=33:so=32:bd=34;46:cd=34;43:or=31;1:mi=0;1:ex=31"
The fzf readme provides functions you should add; I modified mine as I use LSD and not eza:
1# Use fd (https://github.com/sharkdp/fd) for listing path candidates.2_fzf_compgen_path() {3 fd --hidden --exclude .git . "$1"4}56# Use fd to generate the list for directory completion7_fzf_compgen_dir() {8 fd --type=d --hidden --exclude .git . "$1"9}1011show_file_or_dir_preview="if [ -d {} ]; then lsd --tree --color=always {} | head -200; else bat -n --color=always --line-range :500 {}; fi"1213export FZF_CTRL_T_OPTS="--preview '$show_file_or_dir_preview'"14export FZF_ALT_C_OPTS="--preview 'lsd --tree --color=always {} | head -200'"1516_fzf_comprun() {17 local command=$118 shift1920 case "$command" in21 cd) fzf --preview 'lsd --tree --color=always {} | head -200' "$@" ;;22 export|unset) fzf --preview "eval 'echo \${}'" "$@" ;;23 ssh) fzf --preview 'dig {}' "$@" ;;24 *) fzf --preview "$show_file_or_dir_preview" "$@" ;;25 esac26}27
For these to work, you'll need to install fd
. I manually install; you can get the latest version on the github page or use a package manager. Whatever works for you is fine, just know that the manual version won't automatically update:
1cd /tmp2wget https://github.com/sharkdp/fd/releases/download/v10.2.0/fd-v10.2.0-x86_64-unknown-linux-gnu.tar.gz3tar xvf fd-v10.2.0-x86_64-unknown-linux-gnu.tar.gz4sudo mv fd-v10.2.0-x86_64-unknown-linux-gnu/fd /usr/local/bin/5fd --version
I also have custom vim commands which change the look of the bat previewer, but please note that this is potentially unnecessary with fzf. The reason being is that you can type nvim **
and hit tab
this achieves something similar, however, these aliases look a bit better
1alias cd="z"2alias vim='nvim'3alias dev='pnpm run dev'4alias vii="fzf -m --height 60 --reverse --tiebreak=index --preview 'BAT_THEME=\"Catppuccin Mocha\" bat --color=always {}' --preview-window 'down:30:wrap' | xargs nvim"5alias vi="find . -not -path '*/.*' -type f | fzf -m --height 60 --reverse --tiebreak=index --preview 'BAT_THEME=\"Catppuccin Mocha\" bat --color=always {}' --preview-window 'up:wrap:50%' | xargs nvim"
Example of this in use:
I have an additional command, called lst
which uses lsd
to display files in a tree structure:

To create an alias for this, please see the code below:
1alias ls='lsd -1 --color=auto --group-directories-first --icon=always'2alias lsl='lsd -l --color=auto --group-directories-first --icon=always --blocks=name,size,user,date,permission --date=+%d/%m/%Y'3alias lst='lsd --color=auto --icon=always --tree --depth 3 --ignore-glob ".git" --ignore-glob "node_modules"'
Comments