Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
nvim/.config/nvim/plugin/packer_compiled.lua
zsh/.zshrc.local
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "tmux/.config/tmux/plugins/catppuccin/tmux"]
path = tmux/.config/tmux/plugins/catppuccin/tmux
url = https://github.com/catppuccin/tmux.git
10 changes: 5 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ macOS dotfiles managed with [GNU Stow](https://www.gnu.org/software/stow/). Each
Each directory mirrors the target path relative to `$HOME`:

- **XDG configs** nest under `.config/`: `nvim/.config/nvim/`, `tmux/.config/tmux/`, `alacritty/.config/alacritty/`
- **Home-root configs** place dotfiles directly: `skhd/.skhdrc`, `yabai/.yabairc`, `zsh/.zshrc`
- **Home-root configs** place dotfiles directly: `skhd/.skhdrc`, `yabai/.yabairc`
- **Scripts** go in `bin/.local/bin/`

## Setup
Expand All @@ -22,7 +22,7 @@ brew install stow
git clone <repo> ~/dotfiles && cd ~/dotfiles

# Stow all packages
stow alacritty bin nvim skhd tmux yabai zsh
stow bin ghostty nvim skhd starship tmux yabai

# Or stow a single package
stow nvim
Expand Down Expand Up @@ -57,10 +57,10 @@ Plugin configs live in `nvim/.config/nvim/lua/drewjs/plugins/`.

## Key Tools

- **alacritty** — terminal emulator (Catppuccin Mocha theme, BerkeleyMono font)
- **ghostty** — terminal emulator (Catppuccin Macchiato theme, BerkeleyMono font)
- **nvim** — editor with lazy.nvim, LSP, Telescope, Treesitter, Harpoon
- **tmux** — terminal multiplexer with custom statusline
- **tmux** — terminal multiplexer with Catppuccin Macchiato statusline (catppuccin/tmux plugin)
- **starship** — shell prompt
- **skhd** — macOS hotkey daemon
- **yabai** — macOS tiling window manager
- **zsh** — shell config with Oh-My-Zsh, fzf, ripgrep
- **bin** — custom scripts (`tmux-sessionizer`, `present`/`unpresent`, etc.)
4 changes: 2 additions & 2 deletions ghostty/.config/ghostty/config
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ font-thicken = false
adjust-cell-height = 2

# ── Theme ─────────────────────────────────────────────
theme = Catppuccin Mocha
theme = Catppuccin Macchiato
alpha-blending = linear-corrected
window-colorspace = display-p3

# ── Window ────────────────────────────────────────────
background-opacity = 0.85
background-opacity = 1
background-blur = true
macos-titlebar-style = tabs
macos-option-as-alt = true
Expand Down
29 changes: 29 additions & 0 deletions starship/.config/starship.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"$schema" = 'https://starship.rs/config-schema.json'

format = "$directory$all"

[character]
error_symbol = "[❯](bold red)"
success_symbol = "[❯](bold green)"

[directory]
truncate_to_repo = false

[git_branch]
symbol = " "
truncation_length = 32

[golang]
symbol = " "

[lua]
symbol = " "

[nodejs]
symbol = " "

[package]
disabled = true

[buf]
disabled = true
41 changes: 41 additions & 0 deletions tmux/.config/tmux/catppuccin.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# vim: ft=tmux

# flavor + plugin options (BEFORE run)
set -g @catppuccin_flavor 'macchiato'
set -g @catppuccin_window_status_style "none"
set -g @catppuccin_status_background "none"

# square module separators (no powerline glyphs)
set -g @catppuccin_status_left_separator ""
set -g @catppuccin_status_middle_separator ""
set -g @catppuccin_status_right_separator ""
set -g @catppuccin_status_connect_separator "no"
set -g @catppuccin_status_module_text_bg "#{@thm_surface_0}"

# add left padding to icons, right padding to text
set -g @catppuccin_directory_icon "  "
set -g @catppuccin_session_icon "  "
set -g @catppuccin_directory_text " #{b:pane_current_path} "
set -g @catppuccin_session_text " #S "

run ~/.config/tmux/plugins/catppuccin/tmux/catppuccin.tmux

# reset leftover styles from previous configs (Rose Pine remnants)
set -g status-bg default
set -g window-status-style "default"
set -g window-status-current-style "default"

# status bar layout (AFTER run)
set -g status-position top
set -g status-justify left
set -g status-left ""
set -g status-left-length 0
set -g status-right-length 140

# right: directory + session
set -g status-right "#{E:@catppuccin_status_directory}"
set -ag status-right "#{E:@catppuccin_status_session}"

# window tabs — manual formatting (plugin "none" mode)
set -g window-status-format "#[fg=#{@thm_overlay_2}] #I #W "
set -g window-status-current-format "#[fg=#{@thm_crust},bg=#{@thm_lavender}] #I #[fg=#{@thm_text},bg=#{@thm_surface_0}] #W "
1 change: 1 addition & 0 deletions tmux/.config/tmux/plugins/catppuccin/tmux
Submodule tmux added at b2f219
42 changes: 34 additions & 8 deletions tmux/.config/tmux/tmux.conf
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
# settings
set -g default-terminal "screen-256color"
set -ag terminal-overrides ",xterm-256color:RGB"
set -g default-terminal "tmux-256color"
set -g extended-keys on
set -ga terminal-features "xterm*:extkeys"
set -ga terminal-features "xterm-ghostty:extkeys"
set -g focus-events on

set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on

set -g detach-on-destroy off
set -g history-limit 10000
set -g history-limit 50000
set -g set-clipboard on
set -g escape-time 1
set -g escape-time 0
set -g mouse on
set -g display-time 4000
set -g aggressive-resize on

# keybinds

Expand All @@ -27,21 +31,43 @@ set -g prefix C-a
bind-key C-a send-prefix

unbind %
bind \\ split-window -h
bind \\ split-window -h -c "#{pane_current_path}"

unbind '"'
bind - split-window -v
bind Enter split-window -v -c "#{pane_current_path}"

bind c new-window -c "#{pane_current_path}"

unbind r
bind-key r source-file ~/.config/tmux/tmux.conf \; display-message ".tmux.conf reloaded"

# pane resize
bind -r - resize-pane -D 5
bind -r = resize-pane -U 5
bind -r [ resize-pane -L 5
bind -r ] resize-pane -R 5
bind DC select-layout tiled

# kill pane without confirm
bind x kill-pane

# enable vi keys
setw -g mode-keys vi

# copy mode
bind v copy-mode
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-selection
bind-key -T copy-mode-vi 'V' send -X select-line
bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle
bind-key -T copy-mode-vi 'y' send -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi 'Escape' send -X clear-selection
unbind -T copy-mode-vi MouseDragEnd1Pane
bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "pbcopy"

# shift+enter → C-j
bind -n S-Enter send-keys C-j

# sessionizer
bind-key -r f run-shell "tmux neww ~/.local/bin/tmux-sessionizer"

source ~/.config/tmux/statusline.conf
source ~/.config/tmux/catppuccin.conf
1 change: 0 additions & 1 deletion zsh/.zsh_profile

This file was deleted.

178 changes: 53 additions & 125 deletions zsh/.zshrc
Original file line number Diff line number Diff line change
@@ -1,132 +1,60 @@
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH="$HOME/.oh-my-zsh"

# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
if [[ "$TERM_PROGRAM" == "vscode" ]]; then
ZSH_THEME="" # Disable theme for Cursor
else
ZSH_THEME="robbyrussell"
fi

# Set list of themes to pick from when loading at random
# Setting this variable when ZSH_THEME=random will cause zsh to load
# a theme from this variable instead of looking in $ZSH/themes/
# If set to an empty array, this variable will have no effect.
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"

# Uncomment one of the following lines to change the auto-update behavior
# zstyle ':omz:update' mode disabled # disable automatic updates
# zstyle ':omz:update' mode auto # update automatically without asking
# zstyle ':omz:update' mode reminder # just remind me to update when it's time

# Uncomment the following line to change how often to auto-update (in days).
# zstyle ':omz:update' frequency 13

# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS="true"

# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"

# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"

# Uncomment the following line to display red dots whilst waiting for completion.
# You can also set it to another string to have that shown instead of the default red dots.
# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f"
# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765)
# COMPLETION_WAITING_DOTS="true"

# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"

# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# or set a custom format using the strftime function format specifications,
# see 'man strftime' for details.
# HIST_STAMPS="mm/dd/yyyy"

# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder

# Which plugins would you like to load?
# Standard plugins can be found in $ZSH/plugins/
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git)

source $ZSH/oh-my-zsh.sh

# User configuration

# export MANPATH="/usr/local/man:$MANPATH"

# You may need to manually set your language environment
# export LANG=en_US.UTF-8

# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
# export EDITOR='vim'
# else
# export EDITOR='mvim'
# fi

# Compilation flags
# export ARCHFLAGS="-arch x86_64"

# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"
source ~/.zsh_profile

# Use a minimal prompt in Cursor to avoid command detection issues
if [[ "$TERM_PROGRAM" == "vscode" ]]; then
PROMPT='%n@%m:%~%# '
RPROMPT=''
else
# Otherwise load p10k if needed
# [[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh
# ── Homebrew ──────────────────────────────────────────
eval "$(/opt/homebrew/bin/brew shellenv)"

# ── Environment ───────────────────────────────────────
export EDITOR="nvim"
export GIT_EDITOR="nvim"
export DISABLE_AUTO_TITLE="true"
export PRETTIERD_LOCAL_PRETTIER_ONLY="1"

# ── PATH ──────────────────────────────────────────────
export PATH="$HOME/.local/bin:$PATH"
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
export PNPM_HOME="$HOME/Library/pnpm"
export PATH="$PNPM_HOME:$PATH"
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"

# ── Cargo ─────────────────────────────────────────────
[[ -f "$HOME/.cargo/env" ]] && source "$HOME/.cargo/env"

# ── fnm (Node) ────────────────────────────────────────
eval "$(fnm env --use-on-cd)"

# ── fzf ───────────────────────────────────────────────
source <(fzf --zsh)
export FZF_DEFAULT_OPTS="--no-height --no-reverse"
if command -v rg &>/dev/null; then
export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!.git/*"'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
fi

# ── Plugins (brew) ────────────────────────────────────
source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

# ── Aliases ───────────────────────────────────────────
alias v="nvim"
alias co="code-insiders"
alias pn=pnpm
alias px=pnpx
alias nvmrc='echo $1 > .nvmrc'
alias lg="lazygit"
alias pn="pnpm"
alias px="pnpm dlx"
alias gc="git branch | fzf | xargs git checkout"
alias gk="git branch | fzf | xargs git kill"
alias cl="$HOME/.claude/local/claude"
alias cld="claude --dangerously-skip-permissions"
alias g="git"

# fzf
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
export FZF_DEFAULT_OPTS="--no-height --no-reverse"
# ── Keybindings ───────────────────────────────────────
bindkey -s ^f "tmux-sessionizer\n"

# rg
if type rg &> /dev/null; then
export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!.git/*"'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
fi
# ── Starship ──────────────────────────────────────────
eval "$(starship init zsh)"

# ── Local overrides (secrets, machine-specific) ───────
[[ -f "$HOME/.zshrc.local" ]] && source "$HOME/.zshrc.local"

# ── Completions ───────────────────────────────────────
autoload -Uz compinit && compinit
[[ -f "$HOME/.openclaw/completions/openclaw.zsh" ]] && source "$HOME/.openclaw/completions/openclaw.zsh"
Loading
Loading