This post documents some of my commonly used WSL configurations.
Install Common Packages
Ubuntu:
sudo apt install build-essential
Debian:
sudo apt install gcc g++
Debian Common:
sudo apt install gdb valgrind git gpg curl wget zip unzip zsh
Configure Zsh
Set /bin/zsh as the default shell:
chsh -s /bin/zsh
Install oh-my-zsh and commonly used plugins:
wget https://gist.githubusercontent.com/dingwen07/1261eac531f7f080d72b78f931a8ca01/raw/omz-setup.sh
chmod +x ./omz-setup.sh
./omz-setup.sh
Edit ~/.zshrc to enable plugins:
plugins=(
    git
    zsh-autosuggestions
    zsh-syntax-highlighting
)
Java Environment
Java environments are generally managed using SDKMAN!. Make sure the unzip package is installed:
curl -s "https://get.sdkman.io" | bash
Configure Windows Terminal for WSL
Enable Mouse Scrolling for CLI Programs
By default, CLI programs in WSL, such as less and nano, do not support mouse scrolling. After configuration, mouse operations will default to being received by the application. To select content, hold the Shift key while selecting.
less (Including man)
Save the following content as a text file:
#env
LESS = --mouse
Then run lesskey <filename> (for newer distributions, save the text directly to ~/.lesskey).
nano
Add the following to ~/.nanorc:
set mouse
vi[m]
Add the following to ~/.vi[m]rc:
set mouse=a
SSH Agent
Use npiperelay.exe to forward the Windows socket //./pipe/openssh-ssh-agent to WSL 12.
Make sure npiperelay.exe is in the Windows PATH. This allows WSL to directly access it. It can be installed via WinGet. Then install socat in WSL:
sudo apt install socat
Next, put the following script into ~/.win-ssh-agent/agent-bridge.sh:
# Code extracted from https://stuartleeks.com/posts/wsl-ssh-key-forward-to-windows/ with minor modifications
# Configure ssh forwarding
export SSH_AUTH_SOCK=$HOME/.win-ssh-agent/agent.sock
# need `ps -ww` to get non-truncated command for matching
# use square brackets to generate a regex match for the process we want but that doesn't match the grep command running it!
ALREADY_RUNNING=$(ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $?)
if [[ $ALREADY_RUNNING != "0" ]]; then
    if [[ -S $SSH_AUTH_SOCK ]]; then
        # not expecting the socket to exist as the forwarding command isn't running (http://www.tldp.org/LDP/abs/html/fto.html)
        echo "removing previous socket..."
        rm $SSH_AUTH_SOCK
    fi
    echo "Starting SSH-Agent relay..."
    # setsid to force new session to keep running
    # set socat to listen on $SSH_AUTH_SOCK and forward to npiperelay which then forwards to openssh-ssh-agent on windows
    (setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi
Add the following to .bashrc or .zshrc:
source $HOME/.win-ssh-agent/agent-bridge.sh
GnuPG
Refer to Using GPG Command-Line Tools in WSL2 and Signing Git Commits3.
1Password CLI
Use the op command-line tool for convenient and secure credential access. First, install it on Windows:
winget install AgileBits.1Password.CLI
Then add the following to .bashrc or .zshrc:
# Aliases
alias op="op.exe"
# alias sudo="sudo -S <<< $(op read "op://Personal/Account Password/password")"
# Completions
eval "$(op completion zsh)"; compdef _op op.exe