Personal configuration for macOS and Windows. Each tool lives in its own directory and is linked into place with a symlink.
| Directory | Tool | Platform |
|---|---|---|
| zsh/ | Zsh, no framework (plugins from Homebrew) | macOS |
| powershell/ | PowerShell profile, mirrors the zsh aliases | Windows |
| starship/ | starship prompt, shared by all shells | macOS, Windows |
| nvim/ | Neovim, plugins managed by lazy.nvim | macOS, Windows |
| lazygit/ | Lazygit with Catppuccin Macchiato theme | macOS, Windows |
| ghostty/ | Ghostty terminal, FiraCode Nerd Font | macOS |
| windows-terminal/ | Windows Terminal, JetBrainsMono Nerd Font | Windows |
The shell configs are deliberately parallel: zsh/.zshrc and
powershell/Microsoft.PowerShell_profile.ps1
use the same section order and the same alias names, so gst, gorepo and
gitcleanup behave identically on both platforms.
git clone https://github.com/SerenniaHan/dotfiles.git ~/repos/dotfiles- A Nerd Font set as the terminal font (FiraCode on macOS, JetBrainsMono on Windows)
- starship, Neovim >= 0.9, Lazygit, ripgrep
# macOS
brew install starship neovim lazygit ripgrep
brew install --cask ghostty font-fira-code-nerd-font# Windows
scoop install starship pwsh
scoop bucket add nerd-fonts; scoop install JetBrainsMono-NF
winget install Neovim.Neovim JesseDuffield.lazygit BurntSushi.ripgrep.MSVCOn macOS, also install the zsh plugins: brew install zsh-autosuggestions zsh-syntax-highlighting.
PowerShell 7 (pwsh) is only needed to create the symlinks, for the reason
explained under Windows; the profile itself targets
Windows PowerShell 5.1.
If a target already exists, back it up first.
| Source | macOS target | Windows target |
|---|---|---|
zsh/.zshrc |
~/.zshrc |
— |
powershell/Microsoft.PowerShell_profile.ps1 |
— | %USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 |
starship/starship.toml |
~/.config/starship.toml |
%USERPROFILE%\.config\starship.toml |
nvim/ |
~/.config/nvim |
%LOCALAPPDATA%\nvim |
lazygit/config.yml |
~/Library/Application Support/lazygit/config.yml |
%APPDATA%\lazygit\config.yml |
ghostty/config.ghostty |
~/.config/ghostty/config.ghostty |
— |
windows-terminal/settings.json |
— | %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json |
DOTFILES=~/repos/dotfiles
mkdir -p ~/.config/ghostty ~/Library/Application\ Support/lazygit
ln -s $DOTFILES/zsh/.zshrc ~/.zshrc
ln -s $DOTFILES/starship/starship.toml ~/.config/starship.toml
ln -s $DOTFILES/nvim ~/.config/nvim
ln -s $DOTFILES/lazygit/config.yml ~/Library/Application\ Support/lazygit/config.yml
ln -s $DOTFILES/ghostty/config.ghostty ~/.config/ghostty/config.ghosttyCreating symlinks needs either Developer Mode (Settings → System → For developers) or an Administrator shell.
One catch: with Developer Mode, create the links from PowerShell 7, not
Windows PowerShell 5.1. New-Item -ItemType SymbolicLink in 5.1 does not pass
SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE, so it asks for elevation no
matter how Developer Mode is set.
| Shell | Developer Mode | Elevation |
|---|---|---|
| PowerShell 7 | on | not needed |
| PowerShell 7 | off | required |
| Windows PowerShell 5.1 | either | required |
setup-windows.ps1 creates every Windows link in one go. It
probes for the capability first and stops with an explanation rather than doing
half the work, skips targets that already point at this repository, and renames
anything else to <name>.backup-<timestamp> before linking, so nothing is
overwritten.
cd ~\repos\dotfiles
pwsh -NoProfile -File .\setup-windows.ps1 -WhatIf # see what it would do
pwsh -NoProfile -File .\setup-windows.ps1Then restart the terminal so the profile is loaded.
To do it by hand instead:
$Dotfiles = "$HOME\repos\dotfiles"
New-Item -ItemType Directory -Force "$HOME\.config", "$env:APPDATA\lazygit" | Out-Null
New-Item -ItemType SymbolicLink -Path "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1" -Target "$Dotfiles\powershell\Microsoft.PowerShell_profile.ps1"
New-Item -ItemType SymbolicLink -Path "$HOME\.config\starship.toml" -Target "$Dotfiles\starship\starship.toml"
New-Item -ItemType SymbolicLink -Path "$env:LOCALAPPDATA\nvim" -Target "$Dotfiles\nvim"
New-Item -ItemType SymbolicLink -Path "$env:APPDATA\lazygit\config.yml" -Target "$Dotfiles\lazygit\config.yml"
New-Item -ItemType SymbolicLink -Path "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json" -Target "$Dotfiles\windows-terminal\settings.json"Anything that should not be committed (work aliases, tokens, local paths) goes in a file outside the repository, loaded by the shell config if it exists:
| Platform | File |
|---|---|
| macOS | ~/.zshrc.local |
| Windows | ~\Documents\WindowsPowerShell\profile.local.ps1 |