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 cat.

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 ls with icons.

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 /tmp
2wget https://github.com/dandavison/delta/releases/download/0.18.2/git-delta_0.18.2_amd64.deb
3sudo dpkg -i git-delta_0.18.2_amd64.deb
4delta --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"'
4
5export 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}
5
6# Use fd to generate the list for directory completion
7_fzf_compgen_dir() {
8 fd --type=d --hidden --exclude .git . "$1"
9}
10
11show_file_or_dir_preview="if [ -d {} ]; then lsd --tree --color=always {} | head -200; else bat -n --color=always --line-range :500 {}; fi"
12
13export FZF_CTRL_T_OPTS="--preview '$show_file_or_dir_preview'"
14export FZF_ALT_C_OPTS="--preview 'lsd --tree --color=always {} | head -200'"
15
16_fzf_comprun() {
17 local command=$1
18 shift
19
20 case "$command" in
21 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 esac
26}
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 /tmp
2wget https://github.com/sharkdp/fd/releases/download/v10.2.0/fd-v10.2.0-x86_64-unknown-linux-gnu.tar.gz
3tar xvf fd-v10.2.0-x86_64-unknown-linux-gnu.tar.gz
4sudo 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:


lsd terminal tree view 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

Leave a comment
You must be a discord member to comment. Please register
No comments yet. Be the first to leave a comment!