Compare commits

..

9 Commits

Author SHA1 Message Date
jsarthak c0bb8b5f9a Fix fzf 2026-07-18 23:10:20 +05:30
jsarthak a7246fe879 Fix tmux paths 2026-07-18 22:55:40 +05:30
jsarthak e53b81fe55 Some shell fixes 2026-07-18 22:42:08 +05:30
jsarthak dd47827e13 feat(tmux): auto-name sessions with emoji + codename
- scripts/tmux-session-name.sh: generates random emoji + adj-noun name
  40 emojis x 40 adjectives x 40 nouns = 64,000 combinations
  Only renames numerically-named sessions (skips explicit names)

- tmux.conf.local: session-created hook calls the script automatically

- shell/common: added DOTFILES=$HOME/dotfiles env var so hooks and
  scripts can find the dotfiles root without hardcoded paths

Examples: '🐉 sonic-oracle', '🌟 electric-nebula', '🔱 nova-comet'
2026-07-18 15:18:50 +05:30
jsarthak 1ec7aff593 fix(tmux): always-on Neovim-style NORMAL/VISUAL mode indicator
NORMAL = always visible when working in tmux (green)
VISUAL = switches in when entering copy-mode via prefix+Enter (blue)

Uses pane-mode-changed hook with -F flag for clean format evaluation.
Default @mode_indicator set to NORMAL on config load.
2026-07-18 14:47:18 +05:30
jsarthak 04b03d85cd fix(tmux): fix NORMAL/VISUAL mode indicators
The #{?pane_in_mode,...} inline conditional was getting mangled by
oh-my-tmux's awk/sed pipeline that processes tmux_conf_theme_status_right.

Fix: use #{@mode_indicator} user-option in status_right, driven by:
  - bind Enter  → sets NORMAL indicator (green) on copy-mode entry
  - bind v      → sets VISUAL indicator (blue) on selection start
  - bind y/Esc  → clears indicator on copy/exit
  - pane-mode-changed hook → clears indicator when mode exits

Also fixed: encoding artifacts in status_right, missing bullet separator.
2026-07-18 14:44:53 +05:30
jsarthak f96891b6ec refactor: consolidate all branches into single-branch Strategy 1
- bash/.bashrc: replace oh-my-bash with minimal unified config
  sources common → aliases → OS overlay → .bashrc.local

- zsh/.zshrc: remove hardcoded macOS PATHs (moved to macos overlay)
  clean sourcing order: common → personal → aliases → OS → .zshrc.local

- shell/common: populated with universal exports (EDITOR, HISTSIZE, etc.)
- shell/macos: Homebrew, Antigravity, Flutter PATH, fzf init, macOS aliases
- shell/linux: xdg-open, xclip, fzf init for Linux

- nvim/plugins/work.lua: Copilot plugin (migrated from origin/work branch)
- nvim/plugins/_init.lua: conditional load via DOTFILES_PROFILE=work env var

- tmux/.tmux.conf.local: per-machine override hook (~/.tmux.conf.machine.local)

- bootstrap.sh: one-command new machine setup with profile support
  usage: bash bootstrap.sh [personal|work]

- .gitignore: comprehensive .local file ignore patterns

All branches (linux, mac, work, linux_personal, linux_work, mac_personal)
can now be deleted — all unique content is merged into master.
2026-07-18 14:38:41 +05:30
jsarthak 52cd32ab95 fix starship colors 2026-07-18 14:24:51 +05:30
jsarthak de44196750 tmux configuration redesign 2026-07-18 13:56:41 +05:30
14 changed files with 470 additions and 106 deletions
+13
View File
@@ -1,2 +1,15 @@
# ── Neovim lock file ──────────────────────────────────────────────────────────
*nvim/.config/nvim/lazy-lock.json* *nvim/.config/nvim/lazy-lock.json*
# ── OS clutter ────────────────────────────────────────────────────────────────
.DS_Store .DS_Store
Thumbs.db
# ── Per-machine local overrides (Strategy 1: Dynamic Runtime Sourcing) ────────
# These files are stowed/created on each machine but never committed.
# They contain secrets, host-specific paths, work credentials, etc.
**/*.local
**/.zshrc.local
**/.tmux.conf.local
**/.gitconfig.local
**/.env.local
+34 -4
View File
@@ -7,7 +7,37 @@ case $- in
*) return;; *) return;;
esac esac
# Example command: # ── Shared shell config ────────────────────────────────────────────────────────
source ~/.config/shell/common [[ -f ~/.config/shell/common ]] && source ~/.config/shell/common
source ~/.config/shell/personal #added by 6500gitsetup [[ -f ~/.config/shell/aliases ]] && source ~/.config/shell/aliases
source ~/.config/shell/aliases
# ── OS detection — source the right platform overlay ──────────────────────────
case "$(uname -s)" in
Darwin) [[ -f ~/.config/shell/macos ]] && source ~/.config/shell/macos ;;
Linux) [[ -f ~/.config/shell/linux ]] && source ~/.config/shell/linux ;;
esac
# ── Bash-specific init (starship, zoxide, fzf) ────────────────────────────────
if [[ -n "$BASH_VERSION" ]]; then
# History settings
HISTCONTROL=ignoreboth
HISTSIZE=10000
HISTFILESIZE=20000
shopt -s histappend checkwinsize
# Starship prompt
command -v starship >/dev/null && eval "$(starship init bash)"
# Zoxide (smarter cd)
command -v zoxide >/dev/null && eval "$(zoxide init bash)"
# fzf
[[ -f ~/.fzf.bash ]] && source ~/.fzf.bash
fi
export EDITOR='nvim'
export MANROFFOPT="-c"
# ── Per-machine local override (untracked) ────────────────────────────────────
# Create ~/.bashrc.local on each machine for secrets / host-specific tweaks.
[[ -f ~/.bashrc.local ]] && source ~/.bashrc.local
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
# bootstrap.sh — Set up dotfiles on a new machine
# Usage: bash bootstrap.sh [--profile personal|work]
#
# This script stows all dotfile packages, copies shell config files,
# and creates untracked .local stub files for per-machine overrides.
set -e
DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROFILE="${1:-personal}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " Dotfiles Bootstrap"
echo " Profile : $PROFILE"
echo " OS : $(uname -s)"
echo " Host : $(hostname)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# ── 1. Stow all packages ───────────────────────────────────────────────────────
# shell is excluded from global .stow-local-ignore, handled separately below
PACKAGES="zsh bash tmux nvim starship alacritty kitty ghostty wezterm zed btop vim"
for pkg in $PACKAGES; do
if [[ -d "$DOTFILES_DIR/$pkg" ]]; then
echo " stow → $pkg"
stow --adopt --dir="$DOTFILES_DIR" --target="$HOME" "$pkg" 2>/dev/null || \
echo " ⚠ stow $pkg skipped (already linked or conflict)"
fi
done
# ── 2. Copy shell config files manually (stow-local-ignore excludes `shell`) ──
SHELL_SRC="$DOTFILES_DIR/shell/.config/shell"
SHELL_DST="$HOME/.config/shell"
mkdir -p "$SHELL_DST"
for f in common aliases personal work macos linux; do
if [[ -f "$SHELL_SRC/$f" ]]; then
echo " copy shell/$f$SHELL_DST/$f"
cp -n "$SHELL_SRC/$f" "$SHELL_DST/$f" 2>/dev/null || true
fi
done
# ── 3. Create untracked .local stub files ─────────────────────────────────────
create_stub() {
local file="$1" comment="$2"
if [[ ! -f "$file" ]]; then
echo "# $comment" > "$file"
echo " created stub → $file"
else
echo " exists (skipped) → $file"
fi
}
create_stub "$HOME/.zshrc.local" "Per-machine zsh overrides — never committed"
create_stub "$HOME/.bashrc.local" "Per-machine bash overrides — never committed"
create_stub "$HOME/.tmux.conf.machine.local" "Per-machine tmux overrides — never committed"
create_stub "$HOME/.gitconfig.local" "Per-machine git identity — never committed"
# ── 4. Inject profile into .zshrc.local if requested ──────────────────────────
if [[ "$PROFILE" == "work" ]]; then
if ! grep -q "DOTFILES_PROFILE" "$HOME/.zshrc.local" 2>/dev/null; then
echo "" >> "$HOME/.zshrc.local"
echo "# Work profile — load work-specific shell config and nvim plugins" >> "$HOME/.zshrc.local"
echo "export DOTFILES_PROFILE=work" >> "$HOME/.zshrc.local"
echo "source ~/.config/shell/work" >> "$HOME/.zshrc.local"
echo " → injected DOTFILES_PROFILE=work into ~/.zshrc.local"
fi
fi
# ── 5. macOS-specific setup ───────────────────────────────────────────────────
if [[ "$(uname -s)" == "Darwin" ]]; then
# Install Homebrew if missing
if ! command -v brew >/dev/null 2>&1; then
echo " Installing Homebrew…"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " Done! Next steps:"
echo " 1. Edit ~/.zshrc.local — add secrets / tokens"
echo " 2. Edit ~/.gitconfig.local — add your git identity for this machine"
echo " 3. Run: exec zsh (or source ~/.bashrc for bash)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@@ -75,7 +75,11 @@ require("lazy").setup({
"junegunn/seoul256.vim" "junegunn/seoul256.vim"
}, },
-- NOTE: Plugins can also be added by using a table, -- ── Work-profile plugins (Copilot) ──────────────────────────────────────
-- Loaded only when DOTFILES_PROFILE=work is set (via ~/.zshrc.local).
-- On work machines add: export DOTFILES_PROFILE=work
(os.getenv("DOTFILES_PROFILE") == "work" and require("kickstart.plugins.work") or {}),
-- with the first argument being the link and the following -- with the first argument being the link and the following
-- keys can be used to configure plugin behavior/loading/etc. -- keys can be used to configure plugin behavior/loading/etc.
-- --
@@ -0,0 +1,8 @@
-- Work-machine plugins (Copilot + CopilotChat)
-- Loaded only when DOTFILES_PROFILE=work is set in the environment.
-- Add this to your ~/.zshrc.local on work machines:
-- export DOTFILES_PROFILE=work
return {
"github/copilot.vim",
require("kickstart.plugins.copilot_chat"),
}
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
# tmux-session-name.sh — Auto-name new tmux sessions with emoji + codename
#
# Called by the session-created hook in .tmux.conf
# Usage: tmux-session-name.sh <current_session_name> <session_id>
CURRENT_NAME="${1:-}"
SESSION_ID="${2:-}"
# Skip if name is empty or not a plain number (user explicitly named it)
if [[ -z "$CURRENT_NAME" || ! "$CURRENT_NAME" =~ ^[0-9]+$ ]]; then
exit 0
fi
# ── Name pool ─────────────────────────────────────────────────────────────────
EMOJIS=(
"⚡" "🔥" "🌙" "🚀" "🎯" "💎" "🌊" "🎸" "🦊" "🐉"
"🌟" "🎭" "🔮" "🦋" "🌸" "🏔️" "🎪" "🦁" "🐺" "🦅"
"🐬" "🌋" "⚗️" "🧠" "🔭" "🎲" "🏹" "🌀" "🦄" "🐙"
"🎮" "🛸" "🌈" "🔱" "⚜️" "🧬" "🦾" "💫" "🎆" "🌌"
)
ADJECTIVES=(
swift blazing cosmic silent wild golden dark frozen epic neon
cyber ghost storm iron crystal hyper zen rogue nova apex
void shadow turbo lunar sonic electric primal ancient savage brave
mystic toxic ultra prime omega alpha delta sigma raging burning
)
NOUNS=(
wolf phoenix raven otter falcon dragon viper lynx shark cobra
titan spectre nexus cipher forge matrix pulse blade hawk panther
manta kraken hydra mantis raptor condor jaguar orca wraith banshee
golem oracle anvil tempest quasar nebula comet prism zenith apex
)
# ── Pick random combination ───────────────────────────────────────────────────
# We use absolute arithmetic expansion to avoid negative index quirks
EMOJI="${EMOJIS[$((RANDOM % ${#EMOJIS[@]}))]}"
ADJ="${ADJECTIVES[$((RANDOM % ${#ADJECTIVES[@]}))]}"
NOUN="${NOUNS[$((RANDOM % ${#NOUNS[@]}))]}"
NEW_NAME="${EMOJI} ${ADJ}-${NOUN}"
# ── Rename ────────────────────────────────────────────────────────────────────
if [[ -n "$SESSION_ID" ]]; then
# Use -t with the specific session ID to avoid targeting the wrong session
tmux rename-session -t "$SESSION_ID" "$NEW_NAME" 2>/dev/null
else
# Called standalone — just print the name
echo "$NEW_NAME"
fi
+16
View File
@@ -0,0 +1,16 @@
# ── Truly shared exports / env vars ───────────────────────────────────────────
# Sourced by both .zshrc and .bashrc on ALL machines (all OSes, all profiles).
# Keep this minimal — only things that apply 100% universally.
export EDITOR='nvim'
export VISUAL='nvim'
# Dotfiles root — used by scripts and tmux hooks
export DOTFILES="$HOME/dotfiles"
# Man page rendering
export MANROFFOPT="-c"
# Better history defaults (bash and zsh honour these)
export HISTSIZE=10000
export HISTFILESIZE=20000
+21
View File
@@ -0,0 +1,21 @@
# ── Linux-specific shell config ───────────────────────────────────────────────
# Sourced automatically from .zshrc / .bashrc on Linux hosts only.
# xdg-open alias (Linux equivalent of macOS `open`)
alias open="xdg-open"
# Clipboard helpers (if xclip is present)
if command -v xclip >/dev/null 2>&1; then
alias pbcopy="xclip -selection clipboard"
alias pbpaste="xclip -selection clipboard -o"
fi
# fzf shell integration (Linux path)
# Set up fzf key bindings and fuzzy completion
eval "$(fzf --bash)"
[[ -f ~/.fzf.zsh ]] && source ~/.fzf.zsh
# Zoxide (smarter cd) — in case not already initialized by bashrc
if [[ -n "$ZSH_VERSION" ]]; then
command -v zoxide >/dev/null && eval "$(zoxide init zsh)"
fi
+20
View File
@@ -0,0 +1,20 @@
# ── macOS-specific shell config ───────────────────────────────────────────────
# Sourced automatically from .zshrc / .bashrc on Darwin hosts only.
# Homebrew
eval "$(/opt/homebrew/bin/brew shellenv)" 2>/dev/null
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
# Antigravity
export PATH="/Users/jsarthak/.antigravity/antigravity/bin:$PATH"
# Flutter SDK
export PATH="/Users/jsarthak/flutter-sdk/flutter/bin:$PATH"
export PATH="/Users/jsarthak/.local/bin:$PATH"
# fzf shell integration (macOS path)
source <(fzf --zsh) 2>/dev/null || true
# macOS convenience aliases
alias finder="open -a Finder ."
alias brewup="brew update && brew upgrade && brew cleanup"
+15 -15
View File
@@ -1,7 +1,7 @@
# starship.toml - Fully riced modern prompt config aligned with Carbonfox theme # starship.toml - Fully riced modern prompt config aligned with Carbonfox theme
format = """ format = """
$os$username$hostname$directory$git_branch$git_state$git_status$python$nodejs$rust$golang$cmd_duration$line_break\ $os$username$hostname$directory$git_branch$git_state$git_status$cmd_duration$line_break\
$character""" $character"""
# Wait 10 milliseconds for starship to check files under the current directory. # Wait 10 milliseconds for starship to check files under the current directory.
@@ -15,7 +15,7 @@ disabled = false
style = "bold white" style = "bold white"
[username] [username]
style_user = "bold #be95ff" # Carbonfox purple style_user = "bold purple" # Use terminal purple
style_root = "bold red" style_root = "bold red"
format = "[$user]($style)" format = "[$user]($style)"
disabled = false disabled = false
@@ -23,12 +23,12 @@ show_always = true
[hostname] [hostname]
ssh_only = false ssh_only = false
style = "bold #33b1ff" # Carbonfox blue/cyan style = "bold cyan" # Use terminal cyan
format = "@[$hostname]($style) " format = "@[$hostname]($style) "
disabled = false disabled = false
[directory] [directory]
style = "bold #08bdba" # Carbonfox teal style = "bold blue" # Use terminal blue
format = "in [ $path]($style)[$read_only]($read_only_style) " format = "in [ $path]($style)[$read_only]($read_only_style) "
truncation_length = 3 truncation_length = 3
truncation_symbol = "…/" truncation_symbol = "…/"
@@ -37,18 +37,18 @@ read_only = " 󰌾"
read_only_style = "bold red" read_only_style = "bold red"
[character] [character]
success_symbol = "[](bold #25be6a)" # Carbonfox green success_symbol = "[](bold green)" # Use terminal green
error_symbol = "[](bold #ee5396)" # Carbonfox pink/red error_symbol = "[](bold red)" # Use terminal red
vimcmd_symbol = "[](bold #08bdba)" # Carbonfox teal vimcmd_symbol = "[](bold cyan)" # Use terminal cyan
[git_branch] [git_branch]
symbol = "🌱 " symbol = "🌱 "
style = "bold #ee5396" # Carbonfox pink style = "bold red" # Use terminal red
format = "on [$symbol $branch]($style) " format = "on [$symbol $branch]($style) "
truncation_symbol = "" truncation_symbol = ""
[git_status] [git_status]
style = "bold #ee5396" style = "bold red"
format = "([$all_status $ahead_behind]($style) )" format = "([$all_status $ahead_behind]($style) )"
conflicted = "🏳" conflicted = "🏳"
ahead = "🏎💨" ahead = "🏎💨"
@@ -67,28 +67,28 @@ cherry_pick = "[🍒 PICKING](bold red)"
[python] [python]
symbol = "🐍 " symbol = "🐍 "
style = "bold #3ddbd9" style = "bold green"
format = "via [$symbol$version]($style) " format = "via [$symbol$version]($style) "
[nodejs] [nodejs]
symbol = " " symbol = " "
style = "bold #25be6a" style = "bold green"
format = "via [$symbol$version]($style) " format = "via [$symbol$version]($style) "
[rust] [rust]
symbol = "🦀 " symbol = "🦀 "
style = "bold #ff9e64" style = "bold yellow"
format = "via [$symbol$version]($style) " format = "via [$symbol$version]($style) "
[golang] [golang]
symbol = " " symbol = " "
style = "bold #78a9ff" style = "bold blue"
format = "via [$symbol$version]($style) " format = "via [$symbol$version]($style) "
[cmd_duration] [cmd_duration]
min_time = 100 min_time = 100
style = "bold #e0af68" # Carbonfox yellow/orange style = "bold yellow"
format = "underwent [$duration]($style) " format = "took [$duration]($style) "
[status] [status]
style = "bg:blue" style = "bg:blue"
+62 -73
View File
@@ -71,42 +71,49 @@ tmux_conf_24b_colour=auto
# - tmux_conf_theme_synchronized # - tmux_conf_theme_synchronized
tmux_conf_theme=enabled tmux_conf_theme=enabled
# Carbonfox Color Palette # Classic Monokai Color Palette
color_bg="#161616" color_bg="#272822"
color_fg="#f2f4f8" color_fg="#f8f8f2"
color_black="#282828" color_black="#1e1f1c"
color_gray="#353535" color_gray="#3e3d32"
color_light_gray="#484848" color_light_gray="#75715e"
color_red="#ee5396" color_red="#f92672"
color_green="#25be6a" color_green="#a6e22e" # Monokai Green (Session & Normal)
color_teal="#3ddbd9" color_teal="#a6e22e" # Monokai Green
color_blue="#78a9ff" color_blue="#66d9ef" # Monokai Cyan/Blue
color_purple="#be95ff" color_purple="#ae81ff" # Monokai Purple (Host & Visual)
color_cyan="#33b1ff" color_cyan="#66d9ef" # Monokai Cyan (Active Window)
color_white="#dfdfe0" color_yellow="#e6db74" # Monokai Yellow (Date/Time)
color_white="#f8f8f2"
color_accent="$color_blue" color_accent="$color_cyan" # Active window is Monokai Cyan
color_primary="default" color_primary="default"
color_secondary="$color_gray" color_secondary="$color_gray"
color_fg_primary="$color_fg" color_fg_primary="$color_fg"
color_fg_secondary="$color_white" color_fg_secondary="$color_white"
# Curve variables bound to palette colors
color_blue_curve="$color_purple"
color_cyan_curve="$color_yellow"
color_purple_curve="$color_purple"
window_status_current_bg="default" window_status_current_bg="default"
window_status_current_fg="$color_accent" window_status_current_fg="$color_accent"
theme_mode_bg="$color_accent" theme_mode_bg="$color_accent"
theme_mode_fg="$color_bg" theme_mode_fg="$color_bg"
tmux_conf_theme_window_fg="$color_fg_primary" tmux_conf_theme_window_fg="#a5afc2"
# window style # window style
tmux_conf_theme_window_bg="default" tmux_conf_theme_window_bg="default"
# highlight focused pane, possible values are: # highlight focused pane, possible values are:
# - true # - true
# - false (default) # - false (default)
tmux_conf_theme_highlight_focused_pane=false tmux_conf_theme_highlight_focused_pane=true
# focused pane colours: # focused pane colours:
tmux_conf_theme_focused_pane_fg="#f2f4f8"
tmux_conf_theme_focused_pane_bg="default" tmux_conf_theme_focused_pane_bg="default"
# pane border style, possible values are: # pane border style, possible values are:
@@ -174,7 +181,7 @@ tmux_conf_theme_window_status_attr="none"
# tmux_conf_theme_window_status_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" # tmux_conf_theme_window_status_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}"
#tmux_conf_theme_window_status_format="#{circled_window_index} #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" #tmux_conf_theme_window_status_format="#{circled_window_index} #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}"
# tmux_conf_theme_window_status_format=" #I: #(despell -e #W) #W #{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}" # tmux_conf_theme_window_status_format=" #I: #(despell -e #W) #W #{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}"
tmux_conf_theme_window_status_format="#[fg=$color_gray,bg=default]#[fg=$color_fg,bg=$color_gray]#I: #(bash /Users/jsarthak/dotfiles/tmux/tmux-window-name.sh '#W' '#{pane_current_path}')#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}#[fg=$color_gray,bg=default]" tmux_conf_theme_window_status_format="#[fg=$color_light_gray,bg=default]#I: #(bash $HOME/dotfiles/tmux/tmux-window-name.sh '#W' '#{pane_current_path}')#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}"
# window current status style # window current status style
# - built-in variables are: # - built-in variables are:
@@ -189,7 +196,7 @@ tmux_conf_theme_window_status_format="#[fg=$color_gray,bg=default]#[fg=$color
# tmux_conf_theme_window_status_current_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" # tmux_conf_theme_window_status_current_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}"
#tmux_conf_theme_window_status_current_format="#{circled_window_index} #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" #tmux_conf_theme_window_status_current_format="#{circled_window_index} #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}"
# tmux_conf_theme_window_status_current_format="#I: #(despell -e #W) #[fg=$tmux_conf_theme_window_status_current_fg]#W*#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}" # tmux_conf_theme_window_status_current_format="#I: #(despell -e #W) #[fg=$tmux_conf_theme_window_status_current_fg]#W*#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}"
tmux_conf_theme_window_status_current_format="#[fg=$color_accent,bg=default]#[fg=$color_bg,bg=$color_accent,bold]#I: #(bash /Users/jsarthak/dotfiles/tmux/tmux-window-name.sh '#W' '#{pane_current_path}')#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}#[fg=$color_accent,bg=default]" tmux_conf_theme_window_status_current_format="#[fg=$color_accent,bg=default,bold]#I: #(bash $HOME/dotfiles/tmux/tmux-window-name.sh '#W' '#{pane_current_path}')#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}"
tmux_conf_theme_window_status_current_fg="$window_status_current_fg" tmux_conf_theme_window_status_current_fg="$window_status_current_fg"
tmux_conf_theme_window_status_current_bg="$window_status_current_bg" tmux_conf_theme_window_status_current_bg="$window_status_current_bg"
@@ -249,18 +256,19 @@ tmux_conf_theme_right_separator_sub=""
# - #{username} # - #{username}
# - #{username_ssh} # - #{username_ssh}
tmux_conf_theme_status_left=" ❐ #S #[fg=$color_accent,bg=default,none]" tmux_conf_theme_status_left=" #[fg=$color_teal,bg=default,bold]❐ #S #[fg=$color_gray,bg=default,none]"
tmux_conf_theme_status_right=" #{prefix}#{mouse}#{pairing}#{synchronized} |#[fg=default,bg=default] #[fg=$color_secondary,bg=default,none]#[fg=$color_fg,bg=$color_secondary,none]󰔚 #{?uptime_d,#{uptime_d}d,}#{?uptime_h,#{uptime_h}h,}#{?uptime_m,#{uptime_m}m,}#[fg=$color_secondary,bg=default,none] |#[fg=default,bg=default] #[fg=$color_purple,bg=default,none]#[fg=$color_bg,bg=$color_purple,bold]󰊪 #{username}#{root}@#{hostname}#[fg=$color_purple,bg=default,none] "
# status left style # status left style
tmux_conf_theme_status_left_fg="$color_bg" tmux_conf_theme_status_left_fg="default"
tmux_conf_theme_status_left_bg="$color_accent" tmux_conf_theme_status_left_bg="default"
tmux_conf_theme_status_left_attr="bold" tmux_conf_theme_status_left_attr="none"
tmux_conf_theme_status_right=" #{prefix}#{mouse}#{pairing}#{synchronized}#{@mode_indicator} | #[fg=$color_fg,bg=default,none]󰔚 #{?uptime_d,#{uptime_d}d,}#{?uptime_h,#{uptime_h}h,}#{?uptime_m,#{uptime_m}m,} #[fg=$color_gray]│ #[fg=$color_cyan,bg=default,bold]󱑒 %d %b %H:%M #[fg=$color_gray]│ #[fg=$color_purple,bg=default,bold]󰊪 #{username}#{root}@#{hostname}"
# status right style # status right style
tmux_conf_theme_status_right_fg="$color_red,$color_fg,$color_bg" tmux_conf_theme_status_right_fg="$color_red,$color_fg"
tmux_conf_theme_status_right_bg="default,$color_secondary,$color_purple" tmux_conf_theme_status_right_bg="default,default"
tmux_conf_theme_status_right_attr="bold,none,bold" tmux_conf_theme_status_right_attr="bold,none"
# pairing indicator # pairing indicator
tmux_conf_theme_pairing="⚇" # U+2687 tmux_conf_theme_pairing="⚇" # U+2687
@@ -352,38 +360,41 @@ tmux_conf_urlscan_options="--compact --dedupe"
# -- user customizations ------------------------------------------------------- # -- user customizations -------------------------------------------------------
# this is the place to override or undo settings # Source modular configurations
set-option -g detach-on-destroy off source-file "$HOME/dotfiles/tmux/config/settings.conf"
source-file "$HOME/dotfiles/tmux/config/keybindings.conf"
# increase history size setw -g window-status-separator " #[fg=#484848]• " #!important
set -g history-limit 99999999
set status-bg default
# start with mouse mode enabled # ── Auto-name sessions (emoji + codename) ─────────────────────────────────────
set -g mouse on # Fires on every new session. Skips sessions the user explicitly named.
# Script lives in ~/dotfiles/scripts/tmux-session-name.sh
# set-hook -g session-created \
# 'run-shell "bash $HOME/dotfiles/scripts/tmux-session-name.sh \"#{session_name}\" \"#{session_id}\""'
# Allow tmux to understand and pass through color queries # ── Mode indicator (always-on, Neovim-style) ──────────────────────────────────
set -as terminal-overrides ",xterm*:Tc" # NORMAL = working in tmux (default, always visible)
set -as terminal-overrides ",xterm*:RGB" # VISUAL = in copy-mode (prefix + Enter)
#
# #{@mode_indicator} is a window user-option set via pane-mode-changed hook.
# We use -F flag so #{pane_in_mode} is evaluated as a tmux format (1=in mode).
# This bypasses oh-my-tmux's awk pipeline which mangles inline #{?...} conditionals.
# force Vi mode # Set NORMAL as the default on startup
# really you should export VISUAL or EDITOR environment variable, see manual set-window-option -g @mode_indicator "#[fg=#25be6a,bold] NORMAL "
set -g status-keys vi
set -g mode-keys vi
# replace C-b by C-a instead of using both prefixes # Switch between NORMAL and VISUAL whenever the pane mode changes
set -gu prefix2 set-hook -g pane-mode-changed \
unbind C-a 'if-shell -F "#{pane_in_mode}" \
unbind C-b "set-window-option -g @mode_indicator \"#[fg=#78a9ff,bold] VISUAL \"" \
set -g prefix C-a "set-window-option -g @mode_indicator \"#[fg=#25be6a,bold] NORMAL \""'
bind C-a send-prefix
unbind -T copy-mode-vi MouseDragEnd1Pane # ── Per-machine local override (untracked) ────────────────────────────────────
# if you don't want Oh my tmux! to alter a binding, use #!important # Create ~/.tmux.conf.machine.local on each machine for host-specific tweaks
# bind c new-window -c '#{pane_current_path}' #!important # (e.g. different color scheme, right-side content, etc.)
if-shell 'test -f ~/.tmux.conf.machine.local' \
'source-file ~/.tmux.conf.machine.local'
# move status line to top
set -g status-position bottom
# -- tpm ----------------------------------------------------------------------- # -- tpm -----------------------------------------------------------------------
@@ -427,28 +438,6 @@ set -g @plugin 'tmux-plugins/tmux-resurrect'
#set -g @continuum-restore 'on' #set -g @continuum-restore 'on'
set -g @plugin 'tmux-plugins/tmux-logging' set -g @plugin 'tmux-plugins/tmux-logging'
# switch windows alt+number
bind-key -n M-1 select-window -t 1
bind-key -n M-2 select-window -t 2
bind-key -n M-3 select-window -t 3
bind-key -n M-4 select-window -t 4
bind-key -n M-5 select-window -t 5
bind-key -n M-6 select-window -t 6
bind-key -n M-7 select-window -t 7
bind-key -n M-8 select-window -t 8
bind-key -n M-9 select-window -t 9
# Toggle popup window with Ctrl+
bind-key -n -N 'Toggle popup window' M-p if-shell -F '#{==:#{session_name},popup}' {
detach-client
} {
display-popup -d "#{pane_current_path}" -xC -yC -w 70% -h 65% -E 'tmux attach-session -t popup || tmux new-session -s popup'
}
bind-key -n M-f "tmux-sessionizer\n"
# Set alignment
set -g status-justify left
# set -g status-style fg=default,bg=default
# set mode-style "fg=black,bg=default"
# -- custom variables ---------------------------------------------------------- # -- custom variables ----------------------------------------------------------
# to define a custom #{foo} variable, define a POSIX shell function between the # to define a custom #{foo} variable, define a POSIX shell function between the
+67
View File
@@ -0,0 +1,67 @@
# ==============================================================================
# TMUX KEYBINDINGS
# ==============================================================================
# Prefix key override: change from C-b to C-a
set -gu prefix2
unbind C-a
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Fast window switching with Alt + Number
bind-key -n M-1 select-window -t 1
bind-key -n M-2 select-window -t 2
bind-key -n M-3 select-window -t 3
bind-key -n M-4 select-window -t 4
bind-key -n M-5 select-window -t 5
bind-key -n M-6 select-window -t 6
bind-key -n M-7 select-window -t 7
bind-key -n M-8 select-window -t 8
bind-key -n M-9 select-window -t 9
# Toggle centered popup scratch terminal with Alt + p
bind-key -n -N 'Toggle popup window' M-p if-shell -F '#{==:#{session_name},popup}' {
detach-client
} {
display-popup -d "#{pane_current_path}" -xC -yC -w 70% -h 65% -E 'tmux attach-session -t popup || tmux new-session -s popup'
}
# Run tmux-sessionizer with Alt + f
bind-key -n M-f send-keys "tmux-sessionizer\n"
# Sleek centered FZF popup search overlays (requires fzf)
# Alt-s: Fuzzy search and switch sessions in popup
bind-key -n M-s display-popup -w 65% -h 50% -E "tmux list-sessions | fzf --reverse --header='Jump to Session' | cut -d: -f1 | xargs tmux switch-client -t"
# Alt-w: Fuzzy search and switch windows in popup
bind-key -n M-w display-popup -w 75% -h 60% -E "tmux list-windows -a -F '#{session_name}:#{window_index} - #{window_name}' | fzf --reverse --header='Jump to Window' | cut -d' ' -f1 | xargs tmux select-window -t"
# ==============================================================================
# COPY MODE (VI MODE) & INSTANT STATUS REDRAW
# ==============================================================================
# Force immediate status redraw when entering copy mode
bind-key [ copy-mode \; refresh-client -S
# vi-copy navigation and selection bindings with instant status bar update
bind-key -T copy-mode-vi v send-keys -X begin-selection \; refresh-client -S
bind-key -T copy-mode-vi V send-keys -X select-line \; refresh-client -S
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle \; refresh-client -S
bind-key -T copy-mode-vi q send-keys -X cancel \; refresh-client -S
bind-key -T copy-mode-vi Escape send-keys -X cancel \; refresh-client -S
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel \; refresh-client -S
# Mouse Drag Selection: copy to clipboard and redraw instantly without leaving copy-mode
unbind -T copy-mode-vi MouseDragEnd1Pane
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-selection-and-cancel \; refresh-client -S
# ==============================================================================
# PANE NAVIGATION & RESIZING OVERRIDES (NO PREFIX)
# ==============================================================================
# Resize panes using Shift + Arrow keys
bind -n S-Left resize-pane -L 2
bind -n S-Right resize-pane -R 2
bind -n S-Up resize-pane -U 2
bind -n S-Down resize-pane -D 2
+49
View File
@@ -0,0 +1,49 @@
# ==============================================================================
# TMUX GENERAL SETTINGS
# ==============================================================================
# Detach behavior: keep tmux alive when closing the last window/pane in a session
set-option -g detach-on-destroy off
# Increase scrollback history limit
set -g history-limit 99999999
# Enable mouse mode (scrolling, selecting, pane resizing)
set -g mouse on
# Terminal colors and overrides: pass through truecolor support
set -as terminal-overrides ",xterm*:Tc"
set -as terminal-overrides ",xterm*:RGB"
set -as terminal-overrides ",alacritty:Tc"
set -as terminal-overrides ",kitty:Tc"
set -as terminal-overrides ",wezterm:Tc"
# Force VI mode for command status line and pane navigation/copy mode
set -g status-keys vi
set -g mode-keys vi
# Keep the status line positioned at the bottom
set -g status-position bottom
# Left-justify the window list and set a subtle dot separator between windows
set -g status-justify left
setw -g window-status-separator " #[fg=#484848]• "
# ==============================================================================
# PANE STYLING & BORDER STATUS LINE
# ==============================================================================
# Custom pane border colors
set -g pane-border-style "fg=#353535,bg=default"
set -g pane-active-border-style "fg=#78a9ff,bg=default"
# Disable status line on the pane borders
set -g pane-border-status off
# ==============================================================================
# POPUP WINDOW STYLING
# ==============================================================================
# Make popups transparent
set -g popup-style "bg=default"
set -g popup-border-style "fg=#353535,bg=default"
+18 -10
View File
@@ -103,18 +103,26 @@ fi
# alias zshconfig="mate ~/.zshrc" # alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh" # alias ohmyzsh="mate ~/.oh-my-zsh"
export PATH="/Users/jsarthak/flutter-sdk/flutter/bin:$PATH"
source <(fzf --zsh) # ── Shared shell config ────────────────────────────────────────────────────────────────
[[ -f ~/.config/shell/common ]] && source ~/.config/shell/common
# Added by Antigravity [[ -f ~/.config/shell/personal ]] && source ~/.config/shell/personal
export PATH="/Users/jsarthak/.antigravity/antigravity/bin:$PATH" [[ -f ~/.config/shell/aliases ]] && source ~/.config/shell/aliases
export PATH="/Users/jsarthak/flutter-sdk/flutter/bin:$PATH"
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
source ~/.config/shell/common
source ~/.config/shell/personal
source ~/.config/shell/aliases
MANPAGER="col -b | cat" MANPAGER="col -b | cat"
MANROFFOPT="-P-c" MANROFFOPT="-P-c"
eval "$(zoxide init zsh)" eval "$(zoxide init zsh)"
# ── Strategy 1: Dynamic Runtime Sourcing ─────────────────────────────────────────
# Detect OS and source the matching platform overlay.
# macos → shell/.config/shell/macos (Homebrew, Flutter, fzf, Antigravity)
# linux → shell/.config/shell/linux (xdg-open, xclip, fzf)
case "$(uname -s)" in
Darwin) [[ -f ~/.config/shell/macos ]] && source ~/.config/shell/macos ;;
Linux) [[ -f ~/.config/shell/linux ]] && source ~/.config/shell/linux ;;
esac
# ── Per-machine local override (untracked) ──────────────────────────────────
# Create ~/.zshrc.local on each machine for secrets / profile sourcing.
# On work machines: export DOTFILES_PROFILE=work && source ~/.config/shell/work
[[ -f ~/.zshrc.local ]] && source ~/.zshrc.local