
This repository contains customized configurations for a complete development environment, including:
- Neovim, with LSP, autocompletion, and integrated AI assistants (Claude, Gemini)
- Fish
- Zsh
- Nushell
- Tmux
- Zellij
- Terminal emulators:
- Alacritty
- WezTerm
- Kitty
- Ghostty
You can choose between automatic and manual installation methods depending on your preference and operating system.
Want the bleeding edge? If you want access to the latest experimental features that I use in my daily workflow (macOS only), check out the nix-migration
branch: https://github.com/Gentleman-Programming/Gentleman.Dots/tree/nix-migration
This branch contains cutting-edge configurations that eventually make their way to main
once they're stable and tested. If you can't wait for the stable release and want the absolute latest features, this branch is incredible - just keep in mind it's macOS-focused and may have occasional instabilities.
Important: Windows users must follow the manual installation instructions before running the script.
The automatic installation script is the quickest and easiest way to set up your development environment. This script handles all the heavy lifting, but remember that you must install the font mentioned below before running it. The script is designed for macOS, Linux, and WSL systems. If you’re on Windows, you’ll need to follow the manual steps first before attempting to run this script.
curl -O https://raw.githubusercontent.com/Gentleman-Programming/Gentleman.Dots/refs/heads/main/install-linux-mac.sh
sudo chmod +x install-linux-mac.sh
bash ./install-linux-mac.sh
Welcome to the Gentleman.Dots manual configuration guide! This document will walk you through the steps required to set up your development environment.
Clone the repo before continuing!!!
git clone [email protected]:Gentleman-Programming/Gentleman.Dots.git
cd Gentleman.Dots
For Windows
Important: Windows users must follow these manual installation steps before running the automated script.
WSL (Windows Subsystem for Linux) allows you to run Linux on Windows. Install it and set it to version 2:
wsl --install
wsl --set-default-version 2
Install a Linux distribution (e.g., Ubuntu) in WSL:
wsl --install -d Ubuntu
To list available distributions:
wsl --list --online
Install your preferred distribution:
wsl --install -d <distribution-name>
The Iosevka Term Nerd Font is required for terminal emulators in this setup. On Windows, this installation must be done manually.
- Download the Iosevka font from its official site or from Nerd Fonts GitHub.
- Extract the archive and locate the font files (
.ttf
or.otf
). - Install the fonts:
- Right-click each font file and select "Install for all users" to install the font system-wide.
Open the installed distribution to complete setup. Update it with:
sudo apt-get update
sudo apt-get upgrade
Choose and install one of the following terminal emulators:
- Alacritty: Download from GitHub Releases and place
alacritty.exe
in yourPATH
. - WezTerm: Download and Install and create an environment variable called
HOME
that resolves toC:\Users\your-username
. - Kitty: Download and Install.
Using PowerShell:
Alacritty Configuration
mkdir $env:APPDATA\alacritty
Copy-Item -Path alacritty.toml -Destination $env:APPDATA\alacritty\alacritty.toml
# In alacritty.toml, uncomment and set the shell program to WSL:
#[shell]
#program = "wsl.exe"
#args = ["--cd", "~"]
WezTerm Configuration
Copy-Item -Path .wezterm.lua -Destination $HOME
# Uncomment for Windows settings in .wezterm.lua:
# config.default_domain = 'WSL:Ubuntu'
# config.front_end = "WebGpu"
# config.max_fps = 120
If WezTerm doesn't take the initial configuration:
- Create a
wezterm
folder inC:\Users\your-username\.config
- Copy
.wezterm.lua
intowezterm.lua
inside that directory - Restart WezTerm
Kitty Configuration
Copy-Item -Path GentlemanKitty\* -Destination $HOME\.config\kitty -Recurse
Chocolatey is a package manager for Windows that simplifies the installation of software.
To install Chocolatey:
- Open PowerShell as an administrator.
- Run the following command:
Set-ExecutionPolicy Bypass -Scope Process -Force; `
[System.Net.ServicePointManager]::SecurityProtocol = `
[System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
iwr https://community.chocolatey.org/install.ps1 -UseBasicParsing | iex
To install win32yank:
- After installing Chocolatey, run:
choco install win32yank
Note: win32yank
is required for clipboard integration in Neovim when using WSL.
For Linux, Arch Linux, macOS, and WSL
- macOS or Linux: Ensure you have one of these operating systems.
- Administrator privileges (sudo): You'll need administrator access to install some tools.
sudo pacman -Syu --noconfirm
sudo pacman -S --needed --noconfirm base-devel curl file git wget
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. $HOME/.cargo/env
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
sudo apt-get update
sudo apt-get install -y build-essential curl file git
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. $HOME/.cargo/env
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
xcode-select --install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. $HOME/.cargo/env
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
mkdir -p ~/.local/share/fonts
wget -O ~/.local/share/fonts/Iosevka.zip https://github.com/ryanoasis/nerd-fonts/releases/download/v3.3.0/IosevkaTerm.zip
unzip ~/.local/share/fonts/Iosevka.zip -d ~/.local/share/fonts/
fc-cache -fv
brew tap homebrew/cask-fonts
brew install --cask font-iosevka-term-nerd-font
sudo pacman -S --noconfirm alacritty
mkdir -p ~/.config/alacritty && cp alacritty.toml ~/.config/alacritty/alacritty.toml
brew install alacritty --cask
mkdir -p ~/.config/alacritty && cp alacritty.toml ~/.config/alacritty/alacritty.toml
sudo add-apt-repository ppa:aslatter/ppa; sudo apt update; sudo apt install alacritty
mkdir -p ~/.config/alacritty && cp alacritty.toml ~/.config/alacritty/alacritty.toml
sudo pacman -S --noconfirm wezterm
mkdir -p ~/.config/wezterm && cp .wezterm.lua ~/.config/wezterm/wezterm.lua
brew install wezterm --cask
mkdir -p ~/.config/wezterm && cp .wezterm.lua ~/.config/wezterm/wezterm.lua
brew tap wez/wezterm-linuxbrew; brew install wezterm
mkdir -p ~/.config/wezterm && cp .wezterm.lua ~/.config/wezterm/wezterm.lua
pacman -S ghostty
mkdir -p ~/.config/ghostty && cp -r GentlemanGhostty/* ~/.config/ghostty
brew install --cask ghostty
mkdir -p ~/.config/ghostty && cp -r GentlemanGhostty/* ~/.config/ghostty
brew install --cask ghostty
mkdir -p ~/.config/ghostty && cp -r GentlemanGhostty/* ~/.config/ghostty
brew install --cask kitty
mkdir -p ~/.config/kitty && cp -r GentlemanKitty/* ~/.config/kitty
Reload the config after install doing ctrl+shift+,
| cmd+shift+,
cp -rf bash-env-json ~/.config/
cp -rf bash-env.nu ~/.config/
brew install nushell carapace zoxide atuin jq bash starship fzf
cp -rf starship.toml ~/.config/
Arch Linux / Linux
mkdir -p ~/.config/nushell
run_command "cp -rf GentlemanNushell/* ~/.config/nushell/"
Mac
mkdir -p ~/Library/Application\ Support/nushell
## udpate config to use mac
if grep -q "/home/linuxbrew/.linuxbrew/bin" GentlemanNushell/env.nu; then
awk -v search="/home/linuxbrew/.linuxbrew/bin" -v replace=" | prepend '/opt/homebrew/bin'" '
$0 ~ search {print replace; next}
{print}
' GentlemanNushell/env.nu > GentlemanNushell/env.nu.tmp && mv GentlemanNushell/env.nu.tmp GentlemanNushell/env.nu
else
echo " | prepend '/opt/homebrew/bin'" >> GentlemanNushell/env.nu
fi
cp -rf GentlemanNushell/* ~/Library/Application\ Support/nushell/
brew install fish carapace zoxide atuin starship fzf
mkdir -p ~/.cache/starship
mkdir -p ~/.cache/carapace
mkdir -p ~/.local/share/atuin
cp -rf starship.toml ~/.config/
cp -rf GentlemanFish/fish ~/.config
brew install zsh carapace zoxide atuin fzf
brew install zsh-autosuggestions zsh-syntax-highlighting zsh-autocomplete
mkdir -p ~/.cache/carapace
mkdir -p ~/.local/share/atuin
cp -rf GentlemanZsh/.zshrc ~/
cp -rf GentlemanZsh/.p10k.zsh ~/
cp -rf GentlemanZsh/.oh-my-zsh ~/
brew install powerlevel10k
brew install tmux
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
mkdir -p ~/.tmux
cp -r GentlemanTmux/.tmux/* ~/.tmux/
cp GentlemanTmux/.tmux.conf ~/
tmux new-session -d -s plugin-installation 'source ~/.tmux.conf; tmux run-shell ~/.tmux/plugins/tpm/bin/install_plugins'
tmux kill-session -t plugin-installation
cargo install zellij
mkdir -p ~/.config/zellij
cp -r GentlemanZellij/zellij/* ~/.config/zellij/
# update or replace TMUX
if grep -q "TMUX" ~/.zshrc; then
awk -v search="TMUX" -v replace='WM_VAR="/$ZELLIJ"' '
$0 ~ search {print replace; next}
{print}
' ~/.zshrc > ~/.zshrc.tmp && mv ~/.zshrc.tmp ~/.zshrc
else
echo 'WM_VAR="/$ZELLIJ"' >> ~/.zshrc
fi
# update or replace tmux
if grep -q "tmux" ~/.zshrc; then
awk -v search="tmux" -v replace='WM_CMD="zellij"' '
$0 ~ search {print replace; next}
{print}
' ~/.zshrc > ~/.zshrc.tmp && mv ~/.zshrc.tmp ~/.zshrc
else
echo 'WM_CMD="zellij"' >> ~/.zshrc
fi
if grep -q "TMUX" ~/.config/fish/config.fish; then
awk -v search="TMUX" -v replace="if not set -q ZELLIJ" '
$0 ~ search {print replace; next}
{print}
' ~/.config/fish/config.fish > ~/.config/fish/config.fish.tmp && mv ~/.config/fish/config.fish.tmp ~/.config/fish/config.fish
else
echo "if not set -q ZELLIJ" >> ~/.config/fish/config.fish
fi
# update or replace tmux
if grep -q "tmux" ~/.config/fish/config.fish; then
awk -v search="tmux" -v replace="zellij" '
$0 ~ search {print replace; next}
{print}
' ~/.config/fish/config.fish > ~/.config/fish/config.fish.tmp && mv ~/.config/fish/config.fish.tmp ~/.config/fish/config.fish
else
echo "zellij" >> ~/.config/fish/config.fish
fi
Mac
# update or replace "tmux"
if grep -q '"tmux"' GentlemanNushell/config.nu; then
awk -v search='"tmux"' -v replace='let MULTIPLEXER = "zellij"' '
$0 ~ search {print replace; next}
{print}
' GentlemanNushell/config.nu > GentlemanNushell/config.nu.tmp && mv GentlemanNushell/config.nu.tmp GentlemanNushell/config.nu
else
echo 'let MULTIPLEXER = "zellij"' >> GentlemanNushell/config.nu
fi
# update or replace "TMUX"
if grep -q '"TMUX"' GentlemanNushell/config.nu; then
awk -v search='"TMUX"' -v replace='let MULTIPLEXER_ENV_PREFIX = "ZELLIJ"' '
$0 ~ search {print replace; next}
{print}
' GentlemanNushell/config.nu > GentlemanNushell/config.nu.tmp && mv GentlemanNushell/config.nu.tmp GentlemanNushell/config.nu
else
echo 'let MULTIPLEXER_ENV_PREFIX = "ZELLIJ"' >> GentlemanNushell/config.nu
fi
# copy files to nushell support directory
cp -rf GentlemanNushell/* ~/Library/Application\ Support/nushell/
Arch Linux / Linux
if grep -q '"tmux"' ~/.config/nushell/config.nu; then
awk -v search='"tmux"' -v replace='let MULTIPLEXER = "zellij"' '
$0 ~ search {print replace; next}
{print}
' ~/.config/nushell/config.nu > ~/.config/nushell/config.nu.tmp && mv ~/.config/nushell/config.nu.tmp ~/.config/nushell/config.nu
else
echo 'let MULTIPLEXER = "zellij"' >> ~/.config/nushell/config.nu
fi
# update or replace "TMUX"
if grep -q '"TMUX"' ~/.config/nushell/config.nu; then
awk -v search='"TMUX"' -v replace='let MULTIPLEXER_ENV_PREFIX = "ZELLIJ"' '
$0 ~ search {print replace; next}
{print}
' ~/.config/nushell/config.nu > ~/.config/nushell/config.nu.tmp && mv ~/.config/nushell/config.nu.tmp ~/.config/nushell/config.nu
else
echo 'let MULTIPLEXER_ENV_PREFIX = "ZELLIJ"' >> ~/.config/nushell/config.nu
fi
brew install nvim node npm git gcc fzf fd ripgrep coreutils bat curl lazygit
mkdir -p ~/.config/nvim
cp -r GentlemanNvim/nvim/* ~/.config/nvim/
# update or replace /your/notes/path
if grep -q "/your/notes/path" "$HOME/.config/nvim/lua/plugins/obsidian.lua"; then
awk -v search="/your/notes/path" -v replace="path = '$OBSIDIAN_PATH'" '
$0 ~ search {print replace; next}
{print}
' "$obsidian_config_file" > "${obsidian_config_file}.tmp" && mv "${obsidian_config_file}.tmp" "$obsidian_config_file"
else
echo "path = '$OBSIDIAN_PATH'" >> "$obsidian_config_file"
fi
-
Manual Obsidian Configuration
To set up your Obsidian vault path in Neovim:
-
Create the directory for your Obsidian notes (replace
/path/to/your/notes
with your desired path):mkdir -p /path/to/your/notes
-
Create a
templates
folder inside your notes directory:mkdir -p /path/to/your/notes/templates
-
Edit the
obsidian.lua
file to configure the vault path:nvim ~/.config/nvim/lua/plugins/obsidian.lua
-
Update the
path
setting inobsidian.lua
:path = "/path/to/your/notes",
-
Save and close the file.
-
ZSH
shell_path=$(which "zsh")
Fish
shell_path=$(which "fish")
Nushell
shell_path=$(which "nu")
if [ -n "$shell_path" ]; then
# Add shell to /etc/shells if not already present
sudo sh -c "grep -Fxq \"$shell_path\" /etc/shells || echo \"$shell_path\" >> /etc/shells"
# Change the default shell for the user
sudo chsh -s "$shell_path" "$USER"
# Verify if the shell has been changed
if [ "$SHELL" != "$shell_path" ]; then
echo -e "${RED}Error: Shell did not change. Please check manually.${NC}"
echo -e "${GREEN}Command: sudo chsh -s $shell_path \$USER ${NC}"
else
echo -e "${GREEN}Shell changed to $shell_path successfully.${NC}"
fi
else
echo -e "${RED}Shell $shell_choice not found.${NC}"
fi
# Execute the chosen shell
exec $shell_choice
- Close and reopen your terminal, or restart your computer or WSL instance for the changes to take effect.
You're done! You have manually configured your development environment following the Gentleman.Dots guide. Enjoy your new setup!
Note: If you encounter any problems during configuration, consult the official documentation of the tools or seek help online.
Happy coding!
This configuration includes several AI assistants integrated with Neovim. By default, Claude Code is enabled as the primary AI assistant, while all other AI plugins are disabled.
The configuration includes support for the following AI tools:
- Avante.nvim - AI-powered coding assistant
- CopilotChat.nvim - GitHub Copilot chat interface
- OpenCode.nvim - OpenCode AI integration
- CodeCompanion.nvim - Multi-AI provider support
- Claude Code.nvim - Claude AI integration (enabled by default)
- Gemini.nvim - Google Gemini integration
Claude Code is already enabled by default. To switch to a different AI assistant:
-
Navigate to the disabled plugins file:
nvim ~/.config/nvim/lua/plugins/disabled.lua
-
Disable Claude Code by changing
enabled = true
toenabled = false
:{ "greggh/claude-code.nvim", enabled = false, -- Disable Claude Code },
-
Enable your preferred AI assistant by changing
enabled = false
toenabled = true
:{ "yetone/avante.nvim", enabled = true, -- Change to true to enable },
-
Save the file and restart Neovim.
- Only enable ONE AI plugin at a time to avoid conflicts and keybinding issues
- Required CLI tools are automatically installed by the script:
- Claude Code CLI (
brew install --cask claude-code
) - OpenCode CLI (
curl -fsSL https://opencode.ai/install | bash
) - Gemini CLI (
brew install gemini-cli
)
- Claude Code CLI (
- API keys may be required for some services - check each plugin's documentation
- Node.js 18+ is required for most AI plugins (automatically handled by the configuration)
To switch from one AI assistant to another:
- Set your current AI plugin to
enabled = false
- Set your desired AI plugin to
enabled = true
- Restart Neovim
- For beginners: Start with CodeCompanion.nvim - supports multiple AI providers
- For Claude users: Use Claude Code.nvim with the Claude Code CLI
- For GitHub Copilot users: Use CopilotChat.nvim
- For Google Gemini users: Use Gemini.nvim with the Gemini CLI