Compare commits

..

6 Commits

Author SHA1 Message Date
Ryan Walters
625cf3c3ae fix: correct WSL detection and improve platform-specific configuration
- Set WSL detection to false by default for proper conditional evaluation
- Add delta as diff pager for improved git diff output
- Change Windows cd command from nu to powershell.exe with -NoLogo flag
- Refactor .chezmoiignore to use clearer platform-specific sections
- Fix WSL-only files to be properly excluded on non-WSL systems
- Separate Linux/Unix and Windows file exclusions for better clarity
- Remove zsh profile from Cursor settings (migrated to Fish shell)
2025-10-27 20:01:56 -05:00
Ryan Walters
751efbc719 feat: add IDE and lazygit configuration management with cross-platform symlinks
Adds comprehensive IDE configuration tracking with platform-specific symlink templates for VS Code, Cursor, and lazygit. Windows configurations stored in AppData paths, Linux configs in .config directories, with conditional templating based on OS detection.
2025-10-27 16:44:18 -05:00
Ryan Walters
f8f0e0e615 perf: optimize shell startup with batched PATH operations and Homebrew caching
- Batch Fish PATH additions into single operation (reduces startup by ~13ms)
- Cache Homebrew shellenv output for 7 days (reduces startup by ~14ms)
- Update CLAUDE.md with TODO list update workflow guidelines
- Change default chezmoi cd shell from bash to fish
- Remove redundant bun completion sourcing in bash

Performance improvements measured through shell startup profiling.
2025-10-27 15:51:07 -05:00
d031952070 docs: update TODO.md with completed configuration tasks
Mark several completed items in TODO.md:
- Hook system documentation
- Authentication token migration to Doppler
- WSL GPG integration documentation
- mise shell integration
- Windows Terminal settings template
- Global CLAUDE.md addition
- Git configuration expansion (aliases, diff tools, signing)
- GPG configuration setup
- README.md comprehensive refactor
- Deprecated hook migration to TypeScript
- File cleanup/template conversion

Update Git identity configurations:
- Switch Ryan identity to new GPG key (301511AAD64FA365)
- Disable GPG signing for Xevion identity (no key available)
- Add WSL-specific GPG configuration using Windows GPG symlink
- Consolidate Windows/WSL config blocks in dot_gitconfig.tmpl
2025-10-27 15:26:58 -05:00
b71c320ea5 feat: add WSL GPG integration with Windows pinentry support
Configure chezmoi to automatically set up WSL to use Windows GPG for native
Qt5 GUI passphrase prompts during git commit signing:

- Add symlink_dot_gnupg.tmpl to link ~/.gnupg to Windows GPG directory
- Add run_onchange_before_setup-wsl-gpg.sh.tmpl for system GPG symlink
- Update .chezmoiignore to handle .gnupg appropriately per platform
- Document GPG configuration in CLAUDE.md and ONBOARDING.md

This enables seamless git commit signing in WSL environments (including
Claude Code) without passphrase prompt issues, while maintaining platform
independence for regular Linux installations.
2025-10-27 15:17:17 -05:00
4d914f1e2f feat: migrate from Zsh to Fish shell with comprehensive configuration
Major shell migration replacing Zsh/Oh-My-Zsh with Fish shell:

- Remove all Zsh configurations (dot_zshrc.tmpl, dot_p10k.zsh)
- Remove Oh-My-Zsh external dependencies from .chezmoiexternal.toml
- Add complete Fish shell setup with config.fish.tmpl and abbr.fish.tmpl
- Implement Fish-native functions for lazy-loading tools (mise, pyenv, zoxide, etc.)
- Create commonrc.fish.tmpl for cross-shell compatibility
- Add Fish plugin management via Fisher (tide prompt, fzf.fish)
- Update documentation (CLAUDE.md, TODO.md, ONBOARDING.md) to reflect Fish
- Add .fish.tmpl file association to VS Code settings
- Enhance PowerShell profile with lsd aliases
- Configure git delta pager and zdiff3 merge conflict style
- Update WSL keychain integration for Fish shell

This migration maintains all existing tool integrations while improving
startup performance through lazy-loading and Fish's native features.
2025-10-27 14:45:37 -05:00
54 changed files with 1514 additions and 1902 deletions

View File

@@ -10,6 +10,7 @@
"*.toml.tmpl": "toml",
"*.yaml.tmpl": "yaml",
"*.cfg.tmpl": "ini",
"*.fish.tmpl": "fish",
"*bash_aliases*": "shellscript",
"*dot_profile*": "shellscript",
"*dot_gitconfig*": "ini"

View File

@@ -33,6 +33,12 @@ This is a **chezmoi source directory** for managing dotfiles across multiple mac
- Bootstrap encryption key from Doppler before apply
- Handle `chezmoi init` and `chezmoi update --init`
**GPG Configuration (WSL-only):**
- `~/.gnupg` → Symlink to Windows GPG directory (`C:\Users\Xevion\AppData\Roaming\gnupg`)
- `/usr/local/bin/gpg` → Symlink to Windows `gpg.exe` (via `run_onchange_before_setup-wsl-gpg.sh.tmpl`)
- Enables native Windows Qt5 pinentry GUI for passphrase prompts
- Automatic setup on WSL; ignored on regular Linux
## Critical Restrictions
### NEVER Do These Actions
@@ -80,6 +86,17 @@ This is a **chezmoi source directory** for managing dotfiles across multiple mac
- Doppler secrets: `{{ dopplerProjectJson.SECRET_NAME }}`
- Conditional logic: `{{ if }}...{{ else }}...{{ end }}`
5. **Suggest TODO list updates** (but DO NOT modify automatically)
- When a task is completed, check if `TODO.md` exists in the repository
- If the completed task relates to items in TODO.md, **suggest** updating the file
- Examples of suggestions:
- "I've completed [task]. Would you like me to update TODO.md to mark this item as complete?"
- "This work relates to items in TODO.md. Should I update the relevant checkboxes?"
- **NEVER** modify TODO.md without explicit user approval
- User must explicitly approve (even if not specifically) before making changes
- Acceptable approvals: "yes", "go ahead", "update it", "sure", etc.
- If unclear, ask: "Should I update TODO.md to reflect this completion?"
## Common Tasks
**Add new dotfile:**
@@ -104,7 +121,7 @@ chezmoi add --encrypt ~/.ssh/config
## Platform Coverage
- **OS**: Windows, Linux (WSL/native), macOS
- **Shells**: bash, zsh, nushell, PowerShell
- **Shells**: bash, fish, nushell, PowerShell
- **Tools**: 30+ development tools configured (pyenv, bun, cargo, etc.)
- **Secrets**: Doppler + age encryption

View File

@@ -10,8 +10,10 @@ When **bolded**, this application won't be installed automatically. It implies t
- [ ] bw
- Semi-required applications
- [ ] **hishtory**
- [ ] **zsh**
- [ ] **oh-my-zsh**
- Preferred applications
- [ ] kitty
- [ ] micro
- WSL-specific requirements
- [ ] **GPG4win** (Windows) - Required for Git commit signing with GUI pinentry
- Install via: `scoop install gpg4win`
- WSL will automatically link to Windows GPG for native passphrase dialogs

34
TODO.md
View File

@@ -12,7 +12,7 @@
- [ ] Document bootstrap process for WSL installations
- [ ] Document bootstrap process for Windows (including Bun requirement)
- [ ] Create pre-flight checklist (required tools: Bun, age encryption, chezmoi, etc.)
- [ ] Document hook system (`.init_pre.ts`, `.update_pre.ts`) and when they execute
- [x] Document hook system (`.init_pre.ts`, `.update_pre.ts`) and when they execute
- [ ] Add troubleshooting guide for common installation issues
- [ ] Document the relationship between source directory and target directory
- [ ] Add step-by-step first-time setup guide
@@ -25,7 +25,7 @@
- [ ] Create guide for Doppler integration (project setup, config selection)
- [ ] Document secret rotation process and schedule
- [ ] Create checklist for adding new encrypted values
- [ ] Consolidate all authentication tokens/keys into Doppler or age-encrypted files
- [x] Consolidate all authentication tokens/keys into Doppler or age-encrypted files (R2 and private domain migrated)
- [ ] Document age recipient key storage and backup strategy
- [ ] Add encryption troubleshooting guide
- [ ] Create template for encrypted file naming conventions
@@ -41,7 +41,7 @@
- [ ] Document how to handle tools that exist on both platforms
- [ ] Define file path conventions for cross-platform compatibility
- [ ] Create testing strategy for multi-platform templates
- [ ] Document Windows-specific quirks and workarounds
- [x] Document Windows-specific quirks and workarounds (WSL GPG integration documented)
---
@@ -54,7 +54,7 @@
- [ ] Consolidate PATH modifications into single, organized section in `commonrc.sh.tmpl`
- [ ] Create modular PATH loading system (one block per tool with conditional checks)
- [ ] Separate PATH, environment variables, and shell completions into logical sections
- [ ] Document load order (`.bashrc` `.zshrc` `commonrc.sh``.bash_aliases`)
- [ ] Document load order (`.bashrc``commonrc.sh``.bash_aliases`)
- [ ] Add comments explaining each tool's PATH modification
- [ ] Eliminate duplicate PATH additions
- [ ] Create standard pattern for conditional tool loading
@@ -69,7 +69,7 @@
- [ ] Move completions to dedicated section (after PATH, before aliases)
- [ ] Add error handling for missing completion files
- [ ] Document which tools provide completions
- [ ] Test completions on bash and zsh
- [ ] Test completions on bash
- [ ] Add completion loading performance optimization
- [ ] Document how to add new tool completions
@@ -89,7 +89,7 @@
**mise (development environment manager):**
- [ ] Add mise configuration file (`.mise.toml` or per-project configs)
- [ ] Document mise setup and installation
- [ ] Integrate mise activation with shell configs
- [x] Integrate mise activation with shell configs
- [ ] Document tool version management strategy
- [ ] Add mise to installation checklist
@@ -101,7 +101,7 @@
- [ ] Test bun hooks (`.init_pre.ts`, `.update_pre.ts`) on all platforms
**Windows Terminal:**
- [ ] Add `settings.json` template to dotfiles
- [x] Add `settings.json` template to dotfiles
- [ ] Document theme/color scheme customization
- [ ] Add font configuration (Cascadia Code, Nerd Fonts, etc.)
- [ ] Configure profiles for PowerShell, WSL, cmd
@@ -110,7 +110,7 @@
**Claude (AI assistant):**
- [ ] Document Claude configuration location
- [ ] Add API key management strategy (Doppler?)
- [ ] Add global CLAUDE.md to dotfiles
- [x] Add global CLAUDE.md to dotfiles
- [ ] Create project-specific CLAUDE.md templates
- [ ] Document sync strategy across machines
@@ -165,10 +165,10 @@
### 10. Development Tool Configurations
**Git:**
- [ ] Expand `.gitconfig.tmpl` (currently at `home/dot_config/git/config-ryan.tmpl`)
- [ ] Add git aliases and shortcuts
- [ ] Configure diff and merge tools
- [ ] Add commit signing configuration
- [x] Expand `.gitconfig.tmpl` (currently at `home/dot_config/git/config-ryan.tmpl`)
- [x] Add git aliases and shortcuts
- [x] Configure diff and merge tools
- [x] Add commit signing configuration
- [ ] Configure git credential helpers
- [ ] Add git hooks templates
@@ -190,7 +190,7 @@
- [ ] Add tmux configuration
- [ ] Add vim/neovim basic config
- [ ] Add SSH config template
- [ ] Add GPG configuration
- [x] Add GPG configuration
### 11. Package Management Strategy
@@ -213,7 +213,7 @@
### 12. Enhanced Documentation
- [ ] Expand README.md with comprehensive sections
- [x] Expand README.md with comprehensive sections (Major refactor completed)
- [ ] Add ARCHITECTURE.md explaining repo structure
- [ ] Create CONTRIBUTING.md for your future self
- [ ] Add inline comments to all template files
@@ -263,12 +263,12 @@
### 16. Cleanup & Maintenance
- [ ] Commit deletion of removed files (nushell/env.nu, dot_gitconfig, etc.)
- [x] Commit deletion of removed files (nushell/env.nu, dot_gitconfig, etc.) - Converted to templates instead
- [ ] Clean up commented-out code in commonrc.sh.tmpl (lines 122-130)
- [ ] Review and update `.chezmoiignore` patterns
- [ ] Audit and remove unused templates
- [ ] Standardize file naming conventions across repo
- [ ] Remove deprecated hooks (old shell-based hooks if fully migrated to TS)
- [x] Remove deprecated hooks (old shell-based hooks if fully migrated to TS) - Migrated to TypeScript
- [ ] Archive old/unused configuration files
- [ ] Update .gitattributes for proper file type detection
- [ ] Clean up temporary/test files
@@ -284,7 +284,7 @@ These items were in the original TODO.md and need to be categorized/completed:
- [ ] **rbw executable needs better configuration** - Related to Priority 4, Item 14 (rbw auto-lock)
- [ ] **rbw config not tracked** - Add rbw config to dotfiles
- [ ] **hishtory executable not available on init** - Add to installation checklist
- [ ] **add GPG key to bw** - Add to Priority 1, Item 2 (authentication workflow)
- [x] **add GPG key to bw** - GPG configuration completed with WSL integration
- [ ] **dracula theme tracking, kitty/micro** - Add to Priority 3, Item 10 (dev tools)
- [ ] **lazygit fix difftool** - Add lazygit config to dotfiles
- [ ] **testing in github codespaces** - Add to Priority 4, Item 15 (testing)

View File

@@ -28,7 +28,7 @@
{{- end -}}
{{- /* Detect if running in WSL */ -}}
{{- $wsl := true -}}
{{- $wsl := false -}}
{{- if eq .chezmoi.os "linux" -}}
{{- $wsl = (.chezmoi.kernel.osrelease | lower | contains "microsoft") -}}
{{- end -}}
@@ -47,6 +47,7 @@ args = [
wsl = {{ $wsl }}
[diff]
pager = "delta"
scriptContents = false
[data.cpu]
@@ -70,8 +71,9 @@ args = [
{{ if eq .chezmoi.os "windows" }}
[cd]
command = "nu"
command = "powershell.exe"
args = ["-NoLogo"]
{{ else }}
[cd]
command = "bash"
command = "fish"
{{ end }}

View File

@@ -1,46 +1,2 @@
[".asdf"]
type = "archive"
url = "https://github.com/asdf-vm/asdf/archive/v0.14.1.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
[".oh-my-zsh"]
type = "archive"
url = "https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "72h"
exclude = [
"*/.*",
"*/templates",
"*/themes",
]
[".oh-my-zsh/custom/themes/powerlevel10k"]
type = "archive"
url = "https://github.com/romkatv/powerlevel10k/archive/{{ (gitHubLatestRelease "romkatv/powerlevel10k").TagName }}.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "72h"
[".oh-my-zsh/custom/plugins/zsh-autosuggestions"]
type = "archive"
url = "https://github.com/zsh-users/zsh-autosuggestions/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
[".oh-my-zsh/custom/plugins/F-Sy-H"]
type = "archive"
url = "https://github.com/z-shell/F-Sy-H/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
[".oh-my-zsh/custom/plugins/zoxide"]
type = "archive"
url = "https://github.com/ajeetdsouza/zoxide/archive/master.tar.gz"
exact = true
stripComponents = 1
refreshPeriod = "168h"
# External repositories managed by chezmoi
# https://www.chezmoi.io/reference/special-files-and-directories/chezmoiexternal-format/

View File

@@ -1,26 +1,19 @@
hooks
tool-versions
{{/* generated files, cached files, anything that might change unnecessarily */}}
.oh-my-zsh/cache/**
.oh-my-zsh/plugins/**
.oh-my-zsh/templates/**
.oh-my-zsh/custom/themes/powerlevel10k/**/*.zwc
.asdf/downloads/**
.asdf/installs/**
.asdf/plugins/**
.asdf/shims/**
.asdf/tmp/**
.asdf/repository/**
{{/* WSL Only Files */}}
{{ if (not .wsl) }}
{{ if eq .chezmoi.os "windows" }}
{{/* Ignore Linux/Unix-only files on Windows */}}
setup-wsl-gpg.sh
.gnupg/**
{{ end }}
{{/* Linux/Unix Only Files */}}
{{ if (not (eq .chezmoi.os "linux")) }}
# Shell configs (Linux-only)
.oh-my-zsh
.scripts
*.zsh
.zshrc
.bashrc
.profile
.bash_aliases
@@ -29,11 +22,17 @@ key.txt
# Linux-only config directories
.config/kitty
{{ else }}
{{/* Ignore Windows-only files on Linux/macOS */}}
# Windows-only
Documents/PowerShell
.config/fish
.config/Code
.config/Cursor
.config/lazygit
{{ end }}
{{/* Windows Only Files */}}
{{ if (not (eq .chezmoi.os "windows")) }}
Documents/
AppData/
{{ end }}

View File

@@ -0,0 +1,101 @@
# Fish shell common configuration
# This template provides environment setup for Fish shell
# General configuration
set -gx EDITOR "micro"
set -gx GPG_TTY (tty)
set -gx MICRO_TRUECOLOR 1
set -gx TERM xterm-256color # fixes terminal colors when ssh'ing into laptop
# Authentication
set -gx OPENAI_API_KEY "{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# PATH setup (batched for performance - reduces startup time by ~13ms)
set -l paths_to_add
# Collect paths with conditional checks
test -d $HOME/.hishtory && set -a paths_to_add $HOME/.hishtory
test -d $HOME/bin && set -a paths_to_add $HOME/bin
set -a paths_to_add /usr/local/bin $HOME/.local/bin
test -d /usr/local/go/bin && set -a paths_to_add /usr/local/go/bin # Go
test -d $HOME/go/bin && set -a paths_to_add $HOME/go/bin # Go-installed tools
test -d $HOME/.local/share/bob/nvim-bin && set -a paths_to_add $HOME/.local/share/bob/nvim-bin # Bob, Neovim package manager
# Deno (conditionally source env file or add to path list)
if test -d $HOME/.deno
if not source $HOME/.deno/env.fish 2>/dev/null
set -gx DENO_INSTALL $HOME/.deno
set -a paths_to_add $DENO_INSTALL/bin
end
end
# Rust/Cargo (source env file or add to path list)
if test -f $HOME/.cargo/env.fish
source $HOME/.cargo/env.fish
else if test -f $HOME/.cargo/env
# Fallback: parse bash env file
set -gx CARGO_HOME $HOME/.cargo
set -a paths_to_add $CARGO_HOME/bin
end
# Homebrew (cached for performance - reduces startup time by ~14ms)
if test -f /home/linuxbrew/.linuxbrew/bin/brew
set -l brew_cache "$HOME/.cache/brew_env.fish"
set -l brew_bin "/home/linuxbrew/.linuxbrew/bin/brew"
# Regenerate cache if: doesn't exist, >7 days old, or brew binary is newer
if not test -f "$brew_cache"; \
or test (math (date +%s) - (stat -c %Y "$brew_cache" 2>/dev/null || echo 0)) -gt 604800; \
or test "$brew_bin" -nt "$brew_cache"
mkdir -p (dirname "$brew_cache")
$brew_bin shellenv > "$brew_cache" 2>/dev/null
end
test -f "$brew_cache" && source "$brew_cache"
end
set -gx PYENV_ROOT $HOME/.pyenv
# bun
set -gx BUN_INSTALL $HOME/.bun
set -a paths_to_add $BUN_INSTALL/bin
# Note: Bun's _bun file is bash-specific, Fish completions handled separately
# jenv (add to path list for later batch add)
if test -d $HOME/.jenv/bin
set -a paths_to_add $HOME/.jenv/bin
end
# pnpm
set -gx PNPM_HOME $HOME/.local/share/pnpm
set -a paths_to_add $PNPM_HOME
# spicetify
test -d $HOME/.spicetify && set -a paths_to_add $HOME/.spicetify
# pulumi
test -d $HOME/.pulumi/bin && set -a paths_to_add $HOME/.pulumi/bin
# dotnet
if test -d $HOME/.dotnet
set -gx DOTNET_ROOT $HOME/.dotnet
set -a paths_to_add $DOTNET_ROOT $DOTNET_ROOT/tools
end
# Batch add all collected paths (single PATH reconstruction instead of 17+ calls)
test -n "$paths_to_add[1]" && fish_add_path $paths_to_add
# Post-PATH initialization for tools that need commands available
if test -d $HOME/.jenv/bin; and command -q jenv
jenv init - fish | source
end
# Note: Aliases are defined in Fish-native format in ~/.config/fish/conf.d/abbr.fish
# The bash_aliases file contains bash-specific syntax and is not sourced here
{{- /* WSL-specific settings */ -}}
{{- if .data.wsl }}
## Ensures CLI apps open URLs in the default Windows browser
set -gx BROWSER 'powershell.exe /c start'
{{- end }}

View File

@@ -1,4 +1,4 @@
# This template's argument is the shell as a string (bash, zsh).
# This template's argument is the shell as a string (bash, ...).
# general configuration
export EDITOR="micro"
@@ -13,9 +13,7 @@ export OPENAI_API_KEY="{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# hishtory
export HISHTORY_SERVER="https://hsh.{{ dopplerProjectJson.PRIVATE_DOMAIN }}"
export PATH="$PATH:$HOME/.hishtory"
{{ if eq .shell "zsh" -}}
source $HOME/.hishtory/config.zsh
{{ else if eq .shell "bash" -}}
{{ if eq .shell "bash" -}}
source $HOME/.hishtory/config.sh
{{- else -}}
{{ fail "Unexpected shell." }}
@@ -30,7 +28,23 @@ if [ -d "$HOME/.deno" ]; then
. "$HOME/.deno/env" # Deno
fi
. "$HOME/.cargo/env" # Rustup + Cargo + Cargo-installed tools
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # Brew
# Homebrew (cached for performance - reduces startup time by ~14ms)
if [ -f /home/linuxbrew/.linuxbrew/bin/brew ]; then
BREW_CACHE="$HOME/.cache/brew_env.sh"
BREW_BIN="/home/linuxbrew/.linuxbrew/bin/brew"
# Regenerate cache if: doesn't exist, >7 days old, or brew binary is newer
if [ ! -f "$BREW_CACHE" ] || \
[ $(( $(date +%s) - $(stat -c %Y "$BREW_CACHE" 2>/dev/null || echo 0) )) -gt 604800 ] || \
[ "$BREW_BIN" -nt "$BREW_CACHE" ]; then
mkdir -p "$(dirname "$BREW_CACHE")"
"$BREW_BIN" shellenv > "$BREW_CACHE" 2>/dev/null
fi
[ -f "$BREW_CACHE" ] && . "$BREW_CACHE"
fi
command -v rbenv &> /dev/null && eval "$(rbenv init -)" # rbenv for Ruby
command -v chatgpt &> /dev/null && . <(chatgpt --set-completions {{ .shell -}}) # chatgpt completions
{{ if eq .shell "bash" -}}
@@ -52,7 +66,6 @@ fi
# bun
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
[ -s "$HOME/.bun/_bun" ] && source "$HOME/.bun/_bun"
# java version manager
if [ -d $HOME/.jenv/bin ]; then
@@ -63,19 +76,6 @@ if [ -d $HOME/.jenv/bin ]; then
fi
fi
if command -v hass-cli &> /dev/null; then
export HASS_SERVER={{ dopplerProjectJson.HASS_SERVER_URL }}
export HASS_TOKEN={{ dopplerProjectJson.HASS_SERVER_TOKEN }}
{{ if eq .shell "bash" -}}
source <(_HASS_CLI_COMPLETE=bash_source hass-cli)
{{ else if eq .shell "zsh" -}}
source <(_HASS_CLI_COMPLETE=zsh_source hass-cli)
{{ else if eq .shell "fish" -}}
eval (_HASS_CLI_COMPLETE=fish_source hass-cli)
{{ end }}
fi
# pnpm
export PNPM_HOME="$HOME/.local/share/pnpm"
case ":$PATH:" in
@@ -93,7 +93,6 @@ if [ -d "$HOME/.pulumi/bin" ]; then
export PATH=$PATH:$HOME/.pulumi/bin
fi
# load aliases (note: omz aliases are supposed to be placed in ZSH_CUSTOM?)
. $HOME/.bash_aliases
@@ -108,14 +107,4 @@ export BROWSER='powershell.exe /c start'
if [ -d "$HOME/.dotnet" ]; then
export DOTNET_ROOT="$HOME/.dotnet"
export PATH="$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools"
fi
# disable screen blanking
# source $(brew --prefix)/share/zsh/site-functions/_todoist_peco
# xset s off && xset -dpms
# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
# export EDITOR='micro'
# else
# export EDITOR='nvim'
# fi
fi

View File

@@ -0,0 +1,156 @@
// Place your key bindings in this file to override the defaultsauto[]
[
{
"key": "ctrl+shift+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+shift+=",
"command": "workbench.action.zoomIn"
},
{
"key": "ctrl+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+-",
"command": "-workbench.action.zoomOut"
},
{
"key": "ctrl+=",
"command": "editor.action.fontZoomIn"
},
{
"key": "ctrl+-",
"command": "editor.action.fontZoomOut"
},
{
"key": "ctrl+shift+tab",
"command": "-workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "-workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "workbench.action.nextEditor"
},
{
"key": "ctrl+pagedown",
"command": "-workbench.action.nextEditor"
},
{
"key": "ctrl+shift+tab",
"command": "workbench.action.previousEditor"
},
{
"key": "ctrl+pageup",
"command": "-workbench.action.previousEditor"
},
// Swap focus between terminal & active editor
{
"key": "ctrl+`",
"command": "workbench.action.terminal.focus"
},
{
"key": "ctrl+`",
"command": "workbench.action.focusActiveEditorGroup",
"when": "terminalFocus"
},
{
"key": "ctrl+W",
"command": "workbench.action.togglePanel",
"when": "terminalFocus"
},
{
"key": "ctrl+shift+space",
"command": "editor.action.showDefinitionPreviewHover"
},
{
"key": "ctrl+shift+alt+`",
"command": "workbench.action.createTerminalEditor"
},
{
"key": "ctrl+shift+/",
"command": "editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "shift+alt+a",
"command": "-editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "shift+alt+d",
"command": "editor.action.deleteLines",
"when": "textInputFocus && !editorReadonly"
},
{
"key": "ctrl+shift+k",
"command": "-editor.action.deleteLines",
"when": "textInputFocus && !editorReadonly"
},
{
"key": "ctrl+alt+d",
"command": "editor.detectLanguage",
"when": "editorTextFocus && !notebookEditable"
},
{
"key": "shift+alt+d",
"command": "-editor.detectLanguage",
"when": "editorTextFocus && !notebookEditable"
},
{
"key": "ctrl+alt+d",
"command": "notebook.cell.detectLanguage",
"when": "notebookCellEditable && notebookEditable"
},
{
"key": "shift+alt+d",
"command": "-notebook.cell.detectLanguage",
"when": "notebookCellEditable && notebookEditable"
},
{
"key": "alt+a",
"command": "composerMode.agent"
},
{
"key": "alt+g",
"command": "composerMode.chat"
},
{
"key": "ctrl+shift+n",
"command": "editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorHasPromptBar && editorPromptBarFocused"
},
{
"key": "ctrl+n",
"command": "-editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorHasPromptBar && editorPromptBarFocused"
},
{
"key": "ctrl+shift+n",
"command": "editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorTextFocus && @inlineDiffs.rejectPartialEdit.isActiveEditorWithDiffs"
},
{
"key": "ctrl+n",
"command": "-editor.action.inlineDiffs.rejectPartialEdit",
"when": "editorTextFocus && @inlineDiffs.rejectPartialEdit.isActiveEditorWithDiffs"
},
{
"key": "ctrl+g",
"command": "-workbench.action.terminal.goToRecentDirectory"
},
{
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\\\r\n"
},
"when": "terminalFocus"
}
]

View File

@@ -0,0 +1,333 @@
{
// Editor Settings
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.fontFamily": "Iosevka",
"editor.inlineSuggest.enabled": true,
"editor.linkedEditing": true,
"editor.minimap.showSlider": "always",
"diffEditor.renderSideBySide": false,
"cursor.diffs.useCharacterLevelDiffs": true,
// Workbench Settings
"workbench.startupEditor": "none",
"workbench.tree.indent": 24,
"workbench.preferredDarkColorTheme": "Default Light Modern",
"workbench.preferredLightColorTheme": "Cursor Light",
"workbench.iconTheme": "material-icon-theme",
// Window Settings
"window.autoDetectHighContrast": false,
"window.autoDetectColorScheme": true,
// Terminal Settings
"terminal.integrated.commandsToSkipShell": [
"-workbench.action.quickOpenView"
],
"terminal.integrated.fontFamily": "Iosevka Nerd Font Mono",
"terminal.integrated.enablePersistentSessions": false,
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.external.windowsExec": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
"fish": {
"path": "fish"
},
"tmux": {
"path": "tmux",
"icon": "terminal-tmux"
},
"pwsh": {
"path": "pwsh",
"icon": "terminal-powershell"
}
},
// File Explorer Settings
"explorer.confirmDragAndDrop": false,
"explorer.confirmDelete": false,
"files.associations": {
"*.dialogue": "plaintext"
},
// Git Settings
"git.autofetch": true,
"git.confirmSync": false,
"git.openRepositoryInParentFolders": "always",
// Security Settings
"security.workspace.trust.untrustedFiles": "open",
"security.allowedUNCHosts": ["ROMAN"],
"security.restrictUNCAccess": false,
// Language-specific Formatters
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[python]": {
"editor.formatOnType": true,
"editor.defaultFormatter": "anysphere.cursorpyright"
},
"[go]": {
"editor.defaultFormatter": "golang.go"
},
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"[astro]": {
"editor.defaultFormatter": "astro-build.astro-vscode"
},
"[caddyfile]": {
"editor.defaultFormatter": "matthewpi.caddyfile-support"
},
"[shellscript]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[github-actions-workflow]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[ignore]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
},
"[properties]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[gdscript]": {
"editor.defaultFormatter": "geequlim.godot-tools"
},
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
},
"[lua]": {
"editor.defaultFormatter": "sumneko.lua"
},
"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
},
// Language-specific Settings
"typescript.preferences.importModuleSpecifier": "non-relative",
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.preferGoToSourceDefinition": true,
"javascript.updateImportsOnFileMove.enabled": "never",
"javascript.preferGoToSourceDefinition": true,
"python.analysis.autoImportCompletions": true,
"python.analysis.supportDocstringTemplate": true,
"go.inlayHints.parameterNames": true,
"go.buildTags": "real",
"go.toolsManagement.autoUpdate": true,
"go.lintTool": "revive",
"dotnet.server.useOmnisharp": true,
"dotnet.formatting.organizeImportsOnFormat": true,
// Extension Settings
"markdown-preview-enhanced.previewTheme": "github-light.css",
"colorize.include": [
"**/*.css",
"**/*.tsx",
"**/*.scss",
"**/*.sass",
"**/*.less",
"**/*.styl"
],
"colorize.languages": [
"javascript",
"css",
"sass",
"scss",
"less",
"postcss",
"sss",
"stylus",
"xml",
"svg",
"typescriptreact"
],
"quokka.showStartViewOnFeatureRelease": false,
"prisma.showPrismaDataPlatformNotification": false,
"poshProTools.showUpgradeNotification": false,
"poshProTools.disableNewsNotification": true,
"csharpier.enableDiagnostics": false,
"powershell.promptToUpdatePowerShell": false,
"autoimport.autoComplete": false,
"notebook.output.scrolling": true,
"json.schemaDownload.enable": true,
"evenBetterToml.schema.links": true,
// GitHub Copilot Settings
"github.copilot.enable": {
"*": true,
"plaintext": true,
"markdown": true,
"scminput": false,
"yaml": false
},
"github.copilot.editor.enableAutoCompletions": true,
"github.copilot.nextEditSuggestions.enabled": true,
// GitLens Settings
"gitlens.ai.experimental.model": "vscode",
"gitlens.ai.experimental.vscode.model": "copilot:gpt-4o",
"gitlens.ai.model": "gitkraken",
"gitlens.ai.gitkraken.model": "gemini:gemini-2.0-flash",
// Cursor-specific Settings
"cursor.cpp.disabledLanguages": ["scminput"],
"cursor.composer.usageSummaryDisplay": "always",
// VSCord Settings
"vscord.status.image.small.viewing.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/vscode.png",
// Coverage Settings
"coverage-gutters.ignoredPathGlobs": "**/{node_modules,venv,.venv,vendor,target,dist,emsdk}/**",
"coverage-gutters.manualCoverageFilePaths": [
"C:/Users/Xevion/projects/Pac-Man/lcov.info"
],
// Task Settings
"task.allowAutomaticTasks": "on",
// Remote Settings
"remote.SSH.remotePlatform": {
"aws": "linux"
},
// Flutter/Dart Settings
"dart.flutterSdkPath": "C:\\Users\\Xevion\\.flutter\\flutter",
// Harper LS Settings
"harper-ls.diagnosticSeverity": "hint",
// Todo Tree Settings
"todo-tree.highlights.foregroundColourScheme": [],
// Spell Check Settings
"cSpell.ignorePaths": [
"package-lock.json",
"node_modules",
"vscode-extension",
".git/{info,lfs,logs,refs,objects}/**",
".git/{index,*refs,*HEAD}",
".vscode",
".vscode-insiders",
"C:/Users/*/AppData/Roaming/**"
],
"cSpell.userWords": [
"asgi",
"astro",
"automations",
"autoprefixer",
"Behaviour",
"Boids",
"Caddyfile",
"coloors",
"Colour",
"Debugw",
"dotenv",
"Errorw",
"esbuild",
"factorio",
"fastapi",
"gnueabihf",
"groq",
"Hackathon",
"hypercorn",
"imfucked",
"jsdoc",
"jsdom",
"Lerp",
"logfile",
"Mathf",
"microcontroller",
"nodelib",
"openrgb",
"pickone",
"pipx",
"pkgjs",
"plasteel",
"proxying",
"psycopg",
"pydantic",
"pyenv",
"rdap",
"rehype",
"resliced",
"RFID",
"Runnerspace",
"Tauri",
"undelete",
"uvicorn",
"vite",
"vitejs",
"wakatime",
"Xevion"
],
"files.exclude": {
"**/.trunk/*actions/": true,
"**/.trunk/*logs/": true,
"**/.trunk/*notifications/": true,
"**/.trunk/*out/": true,
"**/.trunk/*plugins/": true
},
"files.watcherExclude": {
"**/.trunk/*actions/": true,
"**/.trunk/*logs/": true,
"**/.trunk/*notifications/": true,
"**/.trunk/*out/": true,
"**/.trunk/*plugins/": true
},
"trunk.showPreexistingIssues": true,
"cursor.composer.shouldAllowCustomModes": true,
"[toml]": {
"editor.defaultFormatter": "tamasfe.even-better-toml"
},
"diffEditor.experimental.showMoves": true,
"vscord.status.image.small.editing.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/vscode.png",
"vscord.status.image.large.notInFile.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/idle-vscode.png",
"vscord.status.image.large.idle.key": "https://raw.githubusercontent.com/LeonardSSH/vscord/main/assets/icons/idle-vscode.png",
"vscord.status.details.text.notInFile": "",
"vscord.ignore.organizations": ["Invidae"],
"git.blame.editorDecoration.enabled": true,
"zig.zls.enabled": "on",
"vscord.ignore.workspaces": [".cursor"],
"markdownlint.lintWorkspaceGlobs": [
"**/*.{md,mkd,mdwn,mdown,markdown,markdn,mdtxt,mdtext,workbook}",
"!**/*.code-search",
"!**/bower_components",
"!**/node_modules",
"!**/.git",
"!**/vendor",
"!**/.cursor/rules"
],
"diffEditor.ignoreTrimWhitespace": true,
"diffEditor.hideUnchangedRegions.enabled": true,
"lldb.suppressUpdateNotifications": true,
"prettier.enableDebugLogs": true,
"scm.diffDecorationsGutterPattern": {
"added": true
},
"claudeCode.selectedModel": "default",
"files.simpleDialog.enable": true
}

View File

@@ -0,0 +1,23 @@
gui:
theme:
activeBorderColor:
- "#E97387"
- bold
inactiveBorderColor:
- "#a5adce"
optionsTextColor:
- "#8caaee"
selectedLineBgColor:
- "#ECCFD3"
cherryPickedCommitBgColor:
- "#51576d"
cherryPickedCommitFgColor:
- "#CFF2E2"
unstagedChangesColor:
- "#E97387"
defaultFgColor:
- "#6B6B6B"
searchingActiveBorderColor:
- "#e5c890"
authorColors:
"*": "#babbf1"

View File

@@ -0,0 +1,86 @@
// Place your key bindings in this file to override the defaultsauto[]
[
{
"key": "ctrl+shift+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+shift+=",
"command": "workbench.action.zoomIn"
},
{
"key": "ctrl+=",
"command": "-workbench.action.zoomIn"
},
{
"key": "ctrl+-",
"command": "-workbench.action.zoomOut"
},
{
"key": "ctrl+=",
"command": "editor.action.fontZoomIn"
},
{
"key": "ctrl+-",
"command": "editor.action.fontZoomOut"
},
{
"key": "ctrl+shift+tab",
"command": "-workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "-workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
"when": "!activeEditorGroupEmpty"
},
{
"key": "ctrl+tab",
"command": "workbench.action.nextEditor"
},
{
"key": "ctrl+pagedown",
"command": "-workbench.action.nextEditor"
},
{
"key": "ctrl+shift+tab",
"command": "workbench.action.previousEditor"
},
{
"key": "ctrl+pageup",
"command": "-workbench.action.previousEditor"
},
// Swap focus between terminal & active editor
{
"key": "ctrl+`",
"command": "workbench.action.terminal.focus"
},
{
"key": "ctrl+`",
"command": "workbench.action.focusActiveEditorGroup",
"when": "terminalFocus"
},
{
"key": "ctrl+W",
"command": "workbench.action.togglePanel",
"when": "terminalFocus"
},
{
"key": "ctrl+shift+space",
"command": "editor.action.showDefinitionPreviewHover"
},
{
"key": "ctrl+shift+alt+`",
"command": "workbench.action.createTerminalEditor"
},
{
"key": "ctrl+shift+/",
"command": "editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "shift+alt+a",
"command": "-editor.action.blockComment",
"when": "editorTextFocus && !editorReadonly"
}
]

View File

@@ -0,0 +1,232 @@
{
"workbench.colorTheme": "GitHub Light",
"liquid.format": true,
"markdown-preview-enhanced.previewTheme": "github-light.css",
"terminal.integrated.commandsToSkipShell": [
"-workbench.action.quickOpenView"
],
"cSpell.ignorePaths": [
"package-lock.json",
"node_modules",
"vscode-extension",
".git/{info,lfs,logs,refs,objects}/**",
".git/{index,*refs,*HEAD}",
".vscode",
".vscode-insiders",
"C:/Users/*/AppData/Roaming/**"
],
"cSpell.userWords": [
"asgi",
"astro",
"automations",
"autoprefixer",
"Behaviour",
"Boids",
"Caddyfile",
"coloors",
"Colour",
"Debugw",
"dotenv",
"Errorw",
"esbuild",
"factorio",
"fastapi",
"gnueabihf",
"groq",
"Hackathon",
"hypercorn",
"imfucked",
"jsdoc",
"jsdom",
"Lerp",
"logfile",
"Mathf",
"microcontroller",
"nodelib",
"openrgb",
"pickone",
"pipx",
"pkgjs",
"plasteel",
"proxying",
"psycopg",
"pydantic",
"pyenv",
"rdap",
"rehype",
"resliced",
"RFID",
"Runnerspace",
"Tauri",
"undelete",
"uvicorn",
"vite",
"vitejs",
"wakatime",
"Xevion"
],
"[scss]": {
"editor.defaultFormatter": "sibiraj-s.vscode-scss-formatter"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"explorer.confirmDragAndDrop": false,
"explorer.confirmDelete": false,
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"security.workspace.trust.untrustedFiles": "open",
"workbench.tree.indent": 24,
"editor.linkedEditing": true,
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"workbench.startupEditor": "none",
"quokka.showStartViewOnFeatureRelease": false,
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"colorize.include": [
"**/*.css",
"**/*.tsx",
"**/*.scss",
"**/*.sass",
"**/*.less",
"**/*.styl"
],
"colorize.languages": [
"javascript",
"css",
"sass",
"scss",
"less",
"postcss",
"sss",
"stylus",
"xml",
"svg",
"typescriptreact"
],
"git.autofetch": true,
"git.confirmSync": false,
"editor.minimap.showSlider": "always",
"[astro]": {
"editor.defaultFormatter": "astro-build.astro-vscode"
},
"editor.inlineSuggest.enabled": true,
"github.copilot.enable": {
"*": true,
"plaintext": true,
"markdown": true,
"scminput": false,
"yaml": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[python]": {
"editor.formatOnType": true,
"editor.defaultFormatter": "ms-python.black-formatter"
},
"[go]": {
"editor.defaultFormatter": "golang.go"
},
"security.allowedUNCHosts": ["ROMAN"],
"security.restrictUNCAccess": false,
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"logViewer.watch": ["*.log"],
"logViewer.options": {
"fileCheckInterval": 500
},
"prisma.showPrismaDataPlatformNotification": false,
"github.copilot.editor.enableAutoCompletions": true,
"[caddyfile]": {
"editor.defaultFormatter": "matthewpi.caddyfile-support"
},
"workbench.preferredDarkColorTheme": "Copilot Theme - Higher Contrast",
"window.autoDetectHighContrast": false,
"window.autoDetectColorScheme": true,
"workbench.preferredLightColorTheme": "GitHub Light Default",
"workbench.iconTheme": "material-icon-theme",
"workbench.preferredHighContrastLightColorTheme": "GitHub Light",
"workbench.preferredHighContrastColorTheme": "Catppuccin Macchiato",
"[shellscript]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[github-actions-workflow]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"terminal.integrated.fontFamily": "Iosevka Nerd Font Mono",
"[ignore]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"[sql]": {
"editor.defaultFormatter": "inferrinizzard.prettier-sql-vscode"
},
"go.inlayHints.parameterNames": true,
"editor.formatOnSave": true,
"python.analysis.autoImportCompletions": true,
"task.allowAutomaticTasks": "on",
"python.analysis.supportDocstringTemplate": true,
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
},
"gitlens.ai.experimental.model": "vscode",
"gitlens.ai.experimental.vscode.model": "copilot:gpt-4o",
"[csharp]": {
"editor.defaultFormatter": "ms-dotnettools.csharp"
},
"[properties]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"terminal.integrated.enablePersistentSessions": false,
"[xaml]": {
"editor.defaultFormatter": "ms-dotnettools.csharp"
},
"git.openRepositoryInParentFolders": "always",
"go.buildTags": "real",
"typescript.preferences.importModuleSpecifier": "non-relative",
"[dockerfile]": {
"editor.defaultFormatter": "ms-azuretools.vscode-docker"
},
"harper-ls.diagnosticSeverity": "hint",
"[gdscript]": {
"editor.defaultFormatter": "geequlim.godot-tools"
},
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
},
"files.associations": {
"*.dialogue": "plaintext"
},
"poshProTools.showUpgradeNotification": false,
"poshProTools.disableNewsNotification": true,
"dotnet.server.useOmnisharp": true,
"csharpier.enableDiagnostics": false,
"powershell.promptToUpdatePowerShell": false,
"dotnet.formatting.organizeImportsOnFormat": true,
"editor.fontFamily": "Noto Sans, Iosevka Slab, Iosevka",
"remote.SSH.remotePlatform": {
"aws": "linux"
},
"autoimport.autoComplete": false,
"[lua]": {
"editor.defaultFormatter": "sumneko.lua"
},
"javascript.updateImportsOnFileMove.enabled": "never",
"javascript.preferGoToSourceDefinition": true,
"typescript.preferGoToSourceDefinition": true,
"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
},
"notebook.output.scrolling": true,
"github.copilot.nextEditSuggestions.enabled": true,
"docker.extension.enableComposeLanguageServer": false
}

View File

@@ -0,0 +1 @@
{{ .chezmoi.sourceDir }}/.config-source/lazygit/config.yml

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/keybindings.windows.json
{{ end }}

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/settings.windows.json
{{ end }}

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/keybindings.windows.json
{{ end }}

View File

@@ -0,0 +1,4 @@
{{/* Windows only*/}}
{{ if eq .chezmoi.os "windows" }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/settings.windows.json
{{ end }}

View File

@@ -21,10 +21,13 @@ Set-Alias -Name nano -Value micro
Set-Alias -Name vim -Value nvim
Set-Alias -Name lg -Value lazygit
# Directory listing
function ll { Get-ChildItem -Force | Format-Table -AutoSize }
function la { Get-ChildItem -Force }
function l { Get-ChildItem }
# Directory listing - lsd (modern ls replacement)
function ls { lsd $args }
function l { lsd -l $args }
function la { lsd -a $args }
function lla { lsd -la $args }
function lt { lsd --tree $args }
function ll { lsd -AlFh $args }
# Reload shell profile
function es { & $PROFILE }

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/keybindings.linux.json
{{ end }}

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/vscode/settings.linux.json
{{ end }}

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/keybindings.linux.json
{{ end }}

View File

@@ -0,0 +1,3 @@
{{ if (and (eq .chezmoi.os "linux") (not .wsl)) }}
{{ .chezmoi.sourceDir }}/.config-source/cursor/settings.linux.json
{{ end }}

View File

@@ -0,0 +1,92 @@
# Fish abbreviations (aliases that expand in place)
# Managed by chezmoi
# System
abbr -a sctl 'systemctl'
abbr -a sctlu 'systemctl --user'
abbr -a jctl 'journalctl'
# Core aliases - lsd (modern ls replacement)
abbr -a ls 'lsd'
abbr -a l 'lsd -l'
abbr -a la 'lsd -a'
abbr -a lla 'lsd -la'
abbr -a lt 'lsd --tree'
abbr -a ll 'lsd -AlFh'
abbr -a nano 'micro'
abbr -a lg 'lazygit'
abbr -a vim 'nvim'
abbr -a chlg 'lazygit --path ~/.local/share/chezmoi'
abbr -a es 'exec fish'
# Chezmoi
abbr -a cha 'chezmoi apply --interactive'
abbr -a ch 'chezmoi'
# Remote Management
abbr -a romanlog "ssh roman 'tail -F /var/log/syslog' --lines 100"
# Other aliases
abbr -a gpt 'chatgpt'
abbr -a copilot 'gh copilot'
abbr -a suggest 'gh copilot suggest -t shell'
abbr -a spt 'spotify_player'
abbr -a gitalias 'alias | grep "git "'
abbr -a mousefix 'sudo udevadm trigger'
abbr -a bw_login 'set -gx BW_SESSION (bw unlock --raw)'
# Clipboard aliases
{{ if not .wsl -}}
abbr -a copy 'xsel -ib'
abbr -a paste 'xsel -b'
abbr -a cdp 'cd (xsel -b)'
{{- else -}}
abbr -a copy 'clip.exe'
abbr -a paste 'powershell.exe -noprofile Get-Clipboard'
abbr -a cdp 'cd (xsel -b)'
{{- end }}
# Bluetooth device aliases
abbr -a budsOff 'bluetoothctl block 60:3A:AF:75:61:80'
abbr -a budsOn 'bluetoothctl unblock 60:3A:AF:75:61:80 && bluetoothctl connect 60:3A:AF:75:61:80'
abbr -a maestroOff 'bluetoothctl block AC:BF:71:66:FE:B2'
abbr -a maestroOn 'bluetoothctl unblock AC:BF:71:66:FE:B2 && bluetoothctl connect AC:BF:71:66:FE:B2'
# Git Aliases
abbr -a ga 'git add'
abbr -a gaa 'git add .'
abbr -a gaaa 'git add --all'
abbr -a gau 'git add --update'
abbr -a gb 'git branch'
abbr -a gbd 'git branch --delete'
abbr -a gc 'git commit'
abbr -a gcm 'git commit --message'
abbr -a gcf 'git commit --fixup'
abbr -a gco 'git checkout'
abbr -a gcob 'git checkout -b'
abbr -a gcom 'git checkout master'
abbr -a gcos 'git checkout staging'
abbr -a gcod 'git checkout develop'
abbr -a gd 'git diff'
abbr -a gda 'git diff HEAD'
abbr -a glg 'git log --graph --oneline --decorate --all'
abbr -a gld 'git log --pretty=format:"%h %ad %s" --date=short --all'
abbr -a gm 'git merge --no-ff'
abbr -a gma 'git merge --abort'
abbr -a gmc 'git merge --continue'
abbr -a gp 'git pull'
abbr -a gpr 'git pull --rebase'
abbr -a gr 'git rebase'
abbr -a gs 'git status'
abbr -a gss 'git status --short'
abbr -a gst 'git stash'
abbr -a gsta 'git stash apply'
abbr -a gstd 'git stash drop'
abbr -a gstl 'git stash list'
abbr -a gstp 'git stash pop'
abbr -a gsts 'git stash save'
# KiTTY SSH kitten
if test "$TERM" = "xterm-kitty"
abbr -a ssh 'kitty +kitten ssh'
end

View File

View File

@@ -0,0 +1,38 @@
# Fish shell configuration
# Managed by chezmoi
# Disable greeting
set -g fish_greeting
{{- if .wsl }}
if status is-login
and status is-interactive
keychain --quiet --agents ssh --eval ~/.ssh/id_rsa | source
end
{{- end }}
# Common shared configuration (environment variables, PATH, tool setup)
{{ template "scripts/commonrc.fish.tmpl" dict "data" . }}
# Chezmoi shell completion
{{ completion "fish" }}
# VS Code / Cursor shell integration
if test "$TERM_PROGRAM" = "vscode"
if command -q code
string replace -r '^' '' (code --locate-shell-integration-path fish) | source
else if command -q cursor
string replace -r '^' '' (cursor --locate-shell-integration-path fish) | source
end
end
# fzf key bindings (if fzf.fish plugin installed via Fisher)
# Note: This is handled automatically by Fisher plugin
# Load custom functions from ~/.config/fish/functions/
# (Fish does this automatically, no explicit sourcing needed)
# Load abbreviations
if test -f ~/.config/fish/conf.d/abbr.fish
source ~/.config/fish/conf.d/abbr.fish
end

View File

@@ -0,0 +1,10 @@
# Fish shell plugins managed by Fisher
# https://github.com/jorgebucaran/fisher
#
# To install all plugins: fisher update
# To add a plugin: fisher install <plugin>
# To remove a plugin: fisher remove <plugin>
jorgebucaran/fisher
ilancosman/tide@v6
patrickf1/fzf.fish

View File

@@ -0,0 +1,12 @@
# Defer hishtory initialization to first prompt
# This runs after startup but before user interaction
function __init_hishtory --on-event fish_prompt
# Remove this function after first run
functions --erase __init_hishtory
# Only initialize if hishtory config exists
if test -f $HOME/.hishtory/config.fish
set -gx HISHTORY_SERVER "https://hsh.{{ dopplerProjectJson.PRIVATE_DOMAIN }}"
source $HOME/.hishtory/config.fish
end
end

View File

@@ -0,0 +1,18 @@
# Lazy-load chatgpt completions on first use
function chatgpt --wraps chatgpt
# Initialize chatgpt completions only once
if not set -q __chatgpt_initialized
set -g __chatgpt_initialized 1
# Generate and source completions
if command -q chatgpt
command chatgpt --set-completions fish | source
else
echo "chatgpt is not installed" >&2
return 1
end
end
# Execute the actual chatgpt command
command chatgpt $argv
end

View File

@@ -0,0 +1,24 @@
function chcode --description "Edit chezmoi files in VS Code"
set -gx EDITOR "code --wait"
# Check if --watch is in arguments
set -l has_watch false
set -l has_file false
for arg in $argv
if test "$arg" = "--watch"
set has_watch true
else if not string match -q -- '-*' $arg
set has_file true
end
end
# If --watch is provided but no file, show error
if test $has_watch = true -a $has_file = false
echo "--watch requires a file to be provided, directories aren't supported with watch mode"
return 1
end
# Execute chezmoi edit with all arguments
chezmoi edit $argv
end

View File

@@ -0,0 +1,12 @@
function chfix --description "chmod +x the last command (if it's a file)"
# Get the last command from Fish history
set -l last_command (history --max 1 | string trim)
if test -f "$last_command"
chmod +x "$last_command"
echo "Made executable: $last_command"
else
echo "Error: $last_command is not a valid file"
return 1
end
end

View File

@@ -0,0 +1,6 @@
function chshow --description "Show rendered chezmoi template via fzf"
set -l target (find {{ .chezmoi.sourceDir | quote }} -name "*.tmpl" -type f | fzf)
if test -n "$target"
cat $target | chezmoi execute-template
end
end

View File

@@ -0,0 +1,19 @@
# Lazy-load thefuck on first use
function fuck --description "Correct your previous console command"
# Initialize thefuck only once
if not set -q __thefuck_initialized
set -g __thefuck_initialized 1
# Run thefuck alias generation
if command -q thefuck
thefuck --alias | source
else
echo "thefuck is not installed" >&2
return 1
end
end
# Execute the fuck command (which thefuck creates)
# After initialization, the actual fuck function will be defined
fuck $argv
end

View File

@@ -0,0 +1,3 @@
function gi --description "Generate .gitignore from gitignore.io"
curl -sL https://www.toptal.com/developers/gitignore/api/$argv
end

View File

@@ -0,0 +1,3 @@
function glf --description "Git log find by commit message"
git log --all --grep="$argv"
end

View File

@@ -0,0 +1,18 @@
# Lazy-load just completions on first use
function just --wraps just
# Initialize just completions only once
if not set -q __just_initialized
set -g __just_initialized 1
# Generate and source completions
if command -q just
command just --completions fish | source
else
echo "just is not installed" >&2
return 1
end
end
# Execute the actual just command
command just $argv
end

View File

@@ -0,0 +1,7 @@
function lastRuns --description "Show last N GitHub Actions runs"
set -l runs 10
if test (count $argv) -gt 0
set runs $argv[1]
end
gh run list -L $runs --json name,url | jq -c '.[] | [.name, .url] | join(" ")' -r
end

View File

@@ -0,0 +1,11 @@
# Lazy-load mise on first use
function mise --wraps mise
# Initialize mise only once
if not set -q __mise_initialized
set -g __mise_initialized 1
command mise activate fish | source
end
# Execute the actual mise command
command mise $argv
end

View File

@@ -0,0 +1,4 @@
function mktouch --description "Touch a file while creating parent directories"
mkdir -p (dirname $argv[1])
touch $argv[1]
end

View File

@@ -0,0 +1,23 @@
# Lazy-load pyenv on first use
function pyenv --wraps pyenv
# Initialize pyenv only once
if not set -q __pyenv_initialized
set -g __pyenv_initialized 1
# Add to PATH if not already there
if test -d $PYENV_ROOT/bin; and not contains $PYENV_ROOT/bin $PATH
set -gx PATH $PYENV_ROOT/bin $PATH
end
# Run pyenv init
command pyenv init - fish | source
# pyenv-virtualenv if available
if command -q pyenv-virtualenv-init
command pyenv virtualenv-init - fish | source
end
end
# Execute the actual pyenv command
command pyenv $argv
end

View File

@@ -0,0 +1,13 @@
function tempCode --description "Create a temporary file and open in VS Code"
if test (count $argv) -eq 0
echo "Must provide filetype argument (ex: py, .xml, html)"
return 1
end
# Remove preceding dot, then re-add to support both '.py' and 'py' as arguments
set -l extension (string replace -r '^\.' '' $argv[1])
set -l temp_file (mktemp /tmp/XXXXXXXXXXXX_(uuidgen).$extension)
echo "Temporary $argv[1] file created at $temp_file"
code --file-uri "file://$temp_file"
end

View File

@@ -0,0 +1,18 @@
# Lazy-load zoxide on first use of z command
function z --description "zoxide smart cd"
# Initialize zoxide only once
if not set -q __zoxide_initialized
set -g __zoxide_initialized 1
# Run zoxide init
if command -q zoxide
zoxide init fish | source
else
echo "zoxide is not installed" >&2
return 1
end
end
# Execute the actual z command (defined by zoxide init)
__zoxide_z $argv
end

View File

@@ -0,0 +1,18 @@
# Lazy-load zoxide on first use of zi command
function zi --description "zoxide interactive smart cd"
# Initialize zoxide only once (shared flag with z.fish)
if not set -q __zoxide_initialized
set -g __zoxide_initialized 1
# Run zoxide init
if command -q zoxide
zoxide init fish | source
else
echo "zoxide is not installed" >&2
return 1
end
end
# Execute the actual zi command (defined by zoxide init)
__zoxide_zi $argv
end

View File

@@ -7,7 +7,7 @@
[user]
name = Ryan Walters
email = ryan@walters.to
signingkey = 39538EC79ACF2597
signingkey = 301511AAD64FA365
{{ if eq .chezmoi.os "windows" }}
{{ else }}
{{ end }}

View File

@@ -7,7 +7,7 @@
[user]
name = Xevion
email = xevion@xevion.dev
signingkey = C217005CF3C00672
# No GPG key available for this email - signing disabled
{{ if eq .chezmoi.os "windows" }}
{{ else }}
{{ end }}

View File

@@ -0,0 +1 @@
{{ .chezmoi.sourceDir }}/.config-source/lazygit/config.yml

View File

@@ -1,16 +1,18 @@
# Git Configuration - Platform-aware
# Managed by chezmoi
{{ if eq .chezmoi.os "windows" }}
# Windows Configuration
{{ if or (eq .chezmoi.os "windows") .wsl }}
# Windows/WSL Configuration - Ryan Walters (Professional)
[user]
name = Ryan Walters
email = ryan@walters.to
signingkey = 39538EC79ACF2597
signingkey = 301511AAD64FA365
[commit]
gpgsign = true
{{ if eq .chezmoi.os "windows" }}
# Windows-specific: Use GPG4win
[gpg]
program = C:\\Users\\Xevion\\scoop\\apps\\gpg4win\\current\\GnuPG\\bin\\gpg.exe
@@ -21,16 +23,26 @@
[credential "https://gist.github.com"]
helper =
helper = !'C:\\Program Files\\GitHub CLI\\gh.exe' auth git-credential
{{ else }}
# WSL-specific: Use Windows GPG via symlink
[gpg]
program = /usr/local/bin/gpg
[credential "https://github.com"]
helper =
helper = !/usr/bin/gh auth git-credential
[credential "https://gist.github.com"]
helper =
helper = !/usr/bin/gh auth git-credential
{{ end }}
{{ else }}
# Linux/macOS Configuration
# Native Linux/macOS Configuration - Xevion (Personal)
[user]
name = Xevion
email = xevion@xevion.dev
signingkey = C217005CF3C00672
[commit]
gpgsign = true
# No GPG signing - no key available for this identity
[credential "https://github.com"]
helper =
@@ -45,6 +57,16 @@
# Common configuration for all platforms
[core]
editor = micro
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true # use n and N to move between diff sections
[merge]
conflictStyle = zdiff3
[init]
defaultBranch = master

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,54 +0,0 @@
# If WSL, add SSH key on startup (once per WSL start)
{{- if .wsl }}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n] confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
export ZSH_COMPDUMP=$ZSH/cache/.zcompdump-$HOST
export ZSH="$HOME/.oh-my-zsh"
# zstyle ':omz:update' mode auto # update automatically without asking
# zstyle ':omz:update' frequency 7
DISABLE_AUTO_UPDATE="true" # required for chezmoi external management
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
# CASE_SENSITIVE="true"
# HYPHEN_INSENSITIVE="true"
# DISABLE_MAGIC_FUNCTIONS="true"
# DISABLE_LS_COLORS="true"
# DISABLE_AUTO_TITLE="true"
# ENABLE_CORRECTION="true"
# COMPLETION_WAITING_DOTS="true"
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# HIST_STAMPS="mm/dd/yyyy"
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"
# TODO: Switch from 'asdf' to 'mise'
plugins=(
git gh fzf docker-compose docker deno chezmoi asdf yarn golang sudo zoxide bun npm brew zsh-autosuggestions F-Sy-H thefuck
{{- if .wsl -}}
{{ " kitty" }}
{{- end}}
)
source $ZSH/oh-my-zsh.sh
[[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh # configure with `p10k configure`
# {{ if lookPath "bw" -}} eval "$(bw completion --shell zsh); compdef _bw bw;" {{ end }}
{{/* Common shared aliases, scripts, & shell setup details. */ -}}
{{ template "scripts/commonrc.sh.tmpl" dict "data" . "shell" "zsh" }}
{{/* Chezmoi's shell completion */ -}}
{{ completion "zsh" }}
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

View File

@@ -0,0 +1,38 @@
{{- if .wsl -}}
#!/bin/bash
set -eu
# WSL GPG Setup - Link to Windows GPG for native pinentry support
# This script creates a system-level symlink from /usr/local/bin/gpg to Windows gpg.exe
# This allows WSL to use Windows' native Qt5 pinentry GUI for passphrase prompts
GPG_WINDOWS="/mnt/c/Users/{{ .chezmoi.username }}/scoop/apps/gpg4win/current/GnuPG/bin/gpg.exe"
GPG_LINK="/usr/local/bin/gpg"
# Check if Windows GPG exists
if [ ! -f "$GPG_WINDOWS" ]; then
echo "WARNING: Windows GPG not found at $GPG_WINDOWS"
echo " Skipping GPG symlink setup"
exit 0
fi
# Check if symlink already exists and is correct
if [ -L "$GPG_LINK" ]; then
CURRENT_TARGET=$(readlink "$GPG_LINK")
if [ "$CURRENT_TARGET" = "$GPG_WINDOWS" ]; then
echo "GPG symlink already configured correctly"
exit 0
else
echo "Updating GPG symlink (was pointing to: $CURRENT_TARGET)"
fi
else
echo "Creating GPG symlink to Windows GPG"
fi
# Create/update the symlink (requires sudo)
echo "Note: This requires sudo to create a symlink in /usr/local/bin"
sudo ln -sf "$GPG_WINDOWS" "$GPG_LINK"
echo "✓ GPG symlink configured: $GPG_LINK -> $GPG_WINDOWS"
echo " WSL will now use Windows GPG with native GUI pinentry"
{{- end -}}

View File

@@ -14,9 +14,18 @@ sudo apt install -y xclip xsel
{{ end }}
{{/* TODO: Add basic yes/no prompts before installing packages */ -}}
if ! type -P zsh; then
echo "chezmoi: Installing zsh"
sudo apt install zsh
# Install Fisher (Fish plugin manager) and plugins from fish_plugins file
if type -P fish; then
if [ ! -f ~/.config/fish/functions/fisher.fish ]; then
echo "chezmoi: Installing Fisher (Fish plugin manager)"
fish -c "curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher"
fi
# Update plugins from fish_plugins file
if [ -f ~/.config/fish/fish_plugins ]; then
echo "chezmoi: Updating Fish plugins from fish_plugins file"
fish -c "fisher update"
fi
fi
# Install micro (+ register as text editor)
@@ -27,9 +36,8 @@ if ! type -P micro; then
sudo mv ./micro /usr/bin/micro
fi
{{/* libpq-dev libssh-dev libsqlite3-dev */ -}}
echo "chezmoi: Installing apt packages"
PACKAGES='git fzf zsh fish sqlite curl ripgrep jq' # Install and/or update
PACKAGES='git fzf fish sqlite curl ripgrep jq' # Install and/or update
sudo apt install -y $PACKAGES
INSTALL_ONLY_PACKAGES='iperf3 unzip p7zip-full nmap reptyr btop' # Install only if missing
@@ -75,6 +83,27 @@ if ! type -P chatgpt; then
sudo mv chatgpt /usr/local/bin/
fi
# Set Fish as default shell
if type -P fish; then
FISH_PATH=$(which fish)
CURRENT_SHELL=$(getent passwd "$USER" | cut -d: -f7)
if [ "$CURRENT_SHELL" != "$FISH_PATH" ]; then
echo "chezmoi: Setting Fish as default shell"
# Add fish to /etc/shells if not already present
if ! grep -q "^$FISH_PATH$" /etc/shells; then
echo "$FISH_PATH" | sudo tee -a /etc/shells
fi
# Change default shell
sudo chsh -s "$FISH_PATH" "$USER"
echo "chezmoi: Default shell changed to Fish. Please log out and back in for changes to take effect."
else
echo "chezmoi: Fish is already the default shell"
fi
fi
{{- else if eq .chezmoi.os "darwin" -}}
#!/bin/sh
brew install ripgrep

View File

@@ -0,0 +1,3 @@
{{- if .wsl -}}
/mnt/c/Users/Xevion/AppData/Roaming/gnupg
{{- end -}}

View File

@@ -1,3 +1,3 @@
nodejs 22.11.0
nodejs latest
zoxide 0.9.6
deno 2.2.2
deno 2.2.2