Compare commits

...

26 Commits

Author SHA1 Message Date
57b686cab5 feat: add atuin shell history integration for Fish
Initialize atuin in Fish shell for synced fuzzy history search with CTRL+R.
2025-11-25 15:22:32 -06:00
8f9565d0e0 feat: add Cursor Linux settings and expand Claude Code permissions
- Add comprehensive Cursor settings for Linux platform
- Expand Claude Code allowed bash commands (control flow, tooling)
- Enable KiTTy command finish notification suppression
- Add JVM languages plugin to Claude Code workflows
- Set default model to Sonnet in Claude settings
2025-11-25 15:08:42 -06:00
075810965a feat: add SDKMAN integration and improve mise/tool configuration
- Add SDKMAN initialization to bashrc for Java SDK management
- Create Fish shell wrapper function for SDKMAN commands
- Switch from lazy-loading to automatic mise activation in Fish
- Clean up fish_plugins comments for clarity
- Add pnpm to mise tool-versions
- Enable Shift+Enter in Kitty for Claude Code multi-line prompts
- Make update_pre.ts hook executable
2025-11-24 00:25:02 -06:00
Ryan Walters
262da2f114 fix: use portable file timestamp comparison in fish brew cache check
Replace fish's `-nt` test operator (not available in fish) with explicit stat-based timestamp comparison for cross-shell compatibility.
2025-11-07 11:35:10 -06:00
26f332e1a4 fix: KiTTy not using MesloLGS nerd font 2025-11-07 11:30:15 -06:00
1c87ddfa96 chore: use custom atuin self host, disable enter to accept, disable up arrow keybind in zshrc init 2025-11-07 11:30:06 -06:00
05257607d3 feat: use micro as preferred ssh editor, add Atuin PATH amendment line 2025-11-07 11:29:50 -06:00
8a5c83bdf7 feat: add atuin.sh config 2025-11-07 11:29:41 -06:00
Ryan Walters
3c1ebfe086 refactor: reorganize Claude settings for better readability
Restructure claude-settings.json by moving permissions (allow/deny/ask) before enabledPlugins section for improved logical grouping and readability.
2025-11-06 09:50:26 -06:00
Ryan Walters
4d20cbbacd docs: improve template system documentation with context parameter clarification
- Distinguish between regular templates and partials for variable access
- Document how partials receive context via explicit parameters
- Add examples for both template types with correct syntax
- Templatize global CLAUDE.md for platform-specific shell environment sections
- Add conditional rendering for Windows, WSL, and Linux environments
2025-11-04 11:35:53 -06:00
Ryan Walters
1e55b4862f feat: add Claude settings symlink management
- Add claude-settings.json as source file in chezmoi repo
- Create symlink template for .claude/settings.json
- Update .chezmoiignore to prevent recursion
- Update TODO.md to track Claude configuration progress
2025-11-03 17:04:49 -06:00
Ryan Walters
e5279d9388 feat: add global Claude configuration and update Cursor settings
- Add global CLAUDE.md with comprehensive AI assistant guidelines
- Fix Cursor terminal Shift+Enter keybinding to send escape sequence
- Remove duplicate dark color theme preference in Cursor settings
2025-11-03 16:19:21 -06:00
Ryan Walters
9fb2c304f3 feat: add Windows Terminal helper function across all shells
Add `wt` function to launch Windows Terminal with WSL in current directory across Bash, Fish, Nushell, and PowerShell. The function supports passing additional arguments while maintaining the current working directory context.
2025-11-01 11:08:32 -05:00
Ryan Walters
f4a4800af0 feat: add Cursor and Zed editor CLI integration for WSL
Add PATH configuration for Cursor IDE and Zed editor Windows installations, making their CLI tools accessible from WSL environments. Both editors are now available via command line when installed in their default Windows locations.
2025-10-31 21:49:20 -05:00
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
Ryan Walters
4095b2d242 refactor: standardize shell aliases and remove Bitwarden login helpers
Remove the custom `bw_login` function/alias from Nushell, bash, and PowerShell configurations as it's no longer needed. Expand PowerShell profile with comprehensive git aliases matching bash conventions, add clipboard navigation helper (`cdp`), and enable chezmoi completions.
2025-10-27 02:06:46 -05:00
Ryan Walters
48d40b2872 refactor: reorganize Nushell configurations with Windows support
- Add shared Nushell config templates in .chezmoitemplates/
- Create Windows-specific Nushell configs in AppData/Roaming/
- Add Windows Terminal settings.json configuration
- Update PowerShell profile template
- Consolidate Nushell env.nu and config.nu templates across platforms
2025-10-27 01:51:21 -05:00
Ryan Walters
4f0b832564 refactor: migrate private domain and R2 credentials to Doppler
Migrate hardcoded encrypted files to centralized secret management:
- Replace encrypted domain file with Doppler variable PRIVATE_DOMAIN
- Remove encrypted R2 FUSE script and s3fs password files
- Update hishtory server configuration in commonrc.sh and install script
- Clean up .chezmoiignore for removed encrypted files

This consolidates secret management into Doppler, reducing the number of encrypted files in the repository while maintaining security.
2025-10-26 19:29:48 -05:00
Ryan Walters
397b21122e refactor: migrate private domain to encrypted file and improve configuration
- Replace interactive prompt with encrypted domain.txt.age file
- Move encryption config to top level in .chezmoi.toml.tmpl
- Add platform-specific shell configuration for chezmoi cd command
- Remove unused Perl PATH configuration from commonrc
- Add commit-staged slash command for git workflow
- Enable nushell banner and improve init_pre.ts logging
- Clean up deprecated installation scripts (ovpn, gitconfig)
- Update hishtory server configuration to use encrypted domain
2025-10-26 18:18:37 -05:00
Ryan Walters
02b9236ecf feat: major dotfiles refactor with documentation and multi-platform improvements
- Add comprehensive CLAUDE.md with chezmoi best practices and AI assistant guidelines
- Restructure TODO.md with prioritized tasks and detailed organization
- Add PowerShell profile template for Windows platform support
- Split git configs into identity-specific templates (ryan/xevion)
- Convert nushell env.nu and gitconfig to templates for cross-platform rendering
- Refactor chezmoi hooks to TypeScript (.init_pre.ts, .update_pre.ts)
- Update .chezmoiignore with better platform-specific file handling
- Remove deprecated shellchecker.sh and tasks.json from VS Code config
- Add mise integration to shell configs (bash, zsh, nushell, PowerShell)
- Clean up commonrc.sh.tmpl WSL-specific code
- Disable Deno in VS Code settings, enable simple dialog mode
- Add nushell extension recommendation to VS Code

This commit establishes better cross-platform support (Windows/WSL/Linux),
improves documentation for future maintenance, and standardizes configuration
management patterns across the repository.
2025-10-26 17:01:45 -05:00
8b718db155 chore: updated p10k 2025-08-23 12:53:05 -05:00
84 changed files with 4810 additions and 3245 deletions

5
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"recommendations": [
"thenuprojectcontributors.vscode-nushell-lang"
]
}

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"
@@ -19,5 +20,6 @@
"editor.formatOnPaste": false,
"editor.formatOnType": false,
"notebook.formatOnSave.enabled": false,
"deno.enable": true
"deno.enable": false,
"files.simpleDialog.enable": true
}

View File

@@ -1,51 +0,0 @@
#!/bin/bash
# set -u
ROOT="$1"
SHELLCHECK_OPTIONS="--color=never --format=gcc"
# Function to invoke shellcheck or chezmoi execute-template based on file type
invoke_checker() {
filepath="$1"
# If the file is a .tmpl file, use chezmoi execute-template
if [[ $filepath == *.tmpl ]]; then
# TODO: This still doesn't work, for some reason 'sed' just refuses to replace the 'stdin' placeholder with execute-template
if ! RENDERED_TEMPLATE=$(cat $filepath | chezmoi execute-template | sed -E "s|stdin|$filepath|"); then
# since stdin is used for this, the filepath appears as '-', and thus must be replaced
echo "$RENDERED_TEMPLATE" | shellcheck - $SHELLCHECK_OPTIONS | sed "s|^-|$filepath|"
else
echo $filepath
fi
else
# Otherwise, use shellcheck directly
shellcheck "$filepath" $SHELLCHECK_OPTIONS
fi
}
# chek that 'shellcheck' is available
if ! command -v shellcheck &> /dev/null; then
echo "shellcheck could not be found"
exit 1
fi
echo "initial shellcheck started"
# Run an initial scan of all shell scripts
while IFS= read -rd $'\0' file; do
invoke_checker "$file"
done < <(find "$ROOT" \( -name "*.sh" -o -name "*.sh.tmpl" \) -type f -print0)
echo "inotifywait started"
inotifywait -mr --quiet --format ' %w %f' -e modify $1 |
while read -r dir file; do
absolute_path=${dir}${file}
# Check if the changed file ends with .sh or .sh.tmpl
if [[ $absolute_path == *.sh || $absolute_path == *.sh.tmpl ]]; then
invoke_checker $absolute_path
fi
done
echo "inotify watcher stopped"

58
.vscode/tasks.json vendored
View File

@@ -1,58 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Shellcheck",
"type": "shell",
"isBackground": true,
"command": "${workspaceFolder}/.vscode/shellchecker.sh ${workspaceFolder}",
"problemMatcher": [
{
"source": "shellcheck",
"owner": "bash",
"fileLocation": ["autoDetect", "${workspaceFolder}"],
"pattern": {
// info/style joined into 'note'
"regexp": "^(.*):(\\d+):(\\d+):\\s*(error|warning|note):\\s*(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
},
"background": {
"activeOnStart": true,
"beginsPattern": "^inotify watcher started$",
"endsPattern": "^inotify watcher stopped$"
}
},
{
"source": "chezmoi",
"owner": "chezmoi",
"fileLocation": ["autoDetect", "${workspaceFolder}"],
"pattern": {
"regexp": "^chezmoi: template: (.*):(\\d+):(\\d+): executing \".+\" (at .*)$",
"file": 1,
"line": 2,
"column": 3,
"message": 4
}
}
],
"runOptions": {
"runOn": "folderOpen"
},
"presentation": {
"echo": true,
"reveal": "always",
"revealProblems": "never",
"focus": false,
"panel": "dedicated",
"clear": false
},
}
]
}

149
CLAUDE.md Normal file
View File

@@ -0,0 +1,149 @@
# Chezmoi Dotfiles Repository - AI Assistant Guidelines
## Repository Context
This is a **chezmoi source directory** for managing dotfiles across multiple machines. Files here are SOURCE files that get templated and deployed to the home directory.
### Key Concepts
**Source vs Target Pattern:**
- **Source**: `~/.local/share/chezmoi/home/dot_bashrc.tmpl` (what you edit)
- **Target**: `~/.bashrc` (what gets deployed after `chezmoi apply`)
- Edit source files only. DO NOT modify target files directly.
**File Naming Conventions:**
- `dot_` `.` (e.g., `dot_bashrc` becomes `~/.bashrc`)
- `.tmpl` suffix Go template file (rendered with platform detection)
- `private_` prefix 600 permissions
- `encrypted_*.age` age-encrypted files (safe to commit)
- `run_onchange_*` executable scripts that run during apply
**Template System:**
- Uses Go templates with platform detection
- Two types of templates with different variable access patterns:
- **Regular templates** (e.g., `home/dot_bashrc.tmpl`): Direct access to Chezmoi context
- Built-in: `.chezmoi.os`, `.chezmoi.homeDir`
- Custom data: `.wsl`, `.chassis`
- **Partials** (reusable templates in `home/.chezmoitemplates/`): Must receive context via explicit parameter
- Partials don't have automatic access to Chezmoi's context
- Context passed as parameter (commonly `data`) when calling the partial
- Access everything through parameter: `.data.chezmoi.os`, `.data.wsl`, `.data.chassis`
- Conditional rendering for Windows/Linux/macOS/WSL
**Secret Management:**
- Age encryption for sensitive files (recipient: `age1s3ctpj9lafl6qwyvd89sn448us7gdzd53d8yyhsc7zny78c0k4sqerrkze`)
- Doppler integration for API keys/tokens
- Encryption key bootstrapped via hooks from Doppler
**Hooks:**
- `.init_pre.ts` and `.update_pre.ts` (TypeScript via Bun)
- 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
1. **DO NOT apply changes to filesystem**
- NO `chezmoi apply`
- NO direct file writes to `~/.bashrc`, `~/.gitconfig`, etc.
- Changes stay in source directory only
2. **DO NOT commit or push automatically**
- NO `git commit` without explicit user request
- NO `git push` on your own
- Let user review changes first
3. **DO NOT embed secrets in plaintext**
- NO API keys, tokens, or passwords in plain text
- Use Doppler variables: `{{ dopplerProjectJson.KEY_NAME }}`
- Use age encryption for sensitive files
- Reference encryption: `encrypted_private_*.age`
4. **DO NOT verify changes yourself**
- NO running build/test commands unless requested
- Let user test changes with `chezmoi diff` or `chezmoi apply --dry-run`
- Ask user to verify after making changes
### Recommended Actions
1. **Edit source files** in `home/` directory
- Modify `.tmpl` files with proper template syntax
- Respect platform conditionals (`{{ if eq .chezmoi.os "windows" }}`)
- Maintain existing template structure
2. **Explain impact** of changes
- Which target files will be affected
- Platform-specific behavior
- What the user should test
3. **Suggest verification commands**
- `chezmoi diff` - preview changes
- `chezmoi apply --dry-run` - simulate apply
- `chezmoi status` - see what's changed
4. **Use templates correctly**
- Platform detection in regular templates: `.chezmoi.os`, `.wsl`, `.chassis`
- Platform detection in partials: `.data.chezmoi.os`, `.data.wsl`, `.data.chassis`
- Doppler secrets: `{{ dopplerProjectJson.SECRET_NAME }}`
- Conditional logic: `{{ if }}...{{ else }}...{{ end }}`
- Example partial call: `{{ template "commonrc.sh.tmpl" . }}` (passes entire context as `data`)
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:**
```bash
# DO NOT run - explain this to user instead
chezmoi add ~/.newconfig
# Edit: home/dot_newconfig or home/dot_newconfig.tmpl
```
**Add sensitive config:**
```bash
# DO NOT run - explain this to user instead
chezmoi add --encrypt ~/.ssh/config
# Creates: home/private_dot_ssh/encrypted_config.age
```
**Edit existing file:**
- Locate source: `home/dot_config/nushell/config.nu.tmpl`
- Make changes to source file
- User runs: `chezmoi apply` or `chezmoi apply ~/.config/nushell/config.nu`
## Platform Coverage
- **OS**: Windows, Linux (WSL/native), macOS
- **Shells**: bash, fish, nushell, PowerShell
- **Tools**: 30+ development tools configured (pyenv, bun, cargo, etc.)
- **Secrets**: Doppler + age encryption
## When Uncertain
1. **Ask before modifying** templates with complex platform logic
2. **Clarify secret handling** before adding sensitive data
3. **Let user verify** all changes before suggesting next steps
4. **Prefer explanations** over automated actions
# Extended Documentation
@README.md
@TODO.md
@FAQ.md
@ONBOARDING.md

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

309
TODO.md
View File

@@ -1,8 +1,301 @@
- age executable is not installed on init
- rbw executable needs better configuration
- rbw config not tracked
- hishtory executable not available on init
- add GPG key to bw
- dracula theme tracking, kitty/micro
- lazygit fix difftool
- testing in github codespaces
# Dotfiles Repository TODO
## Overview
## Critical
*Must be done first - establishes the groundwork for everything else*
### 1. Create Installation Workflow Documentation
- [ ] Document bootstrap process for fresh Linux installations
- [ ] 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.)
- [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
- [ ] Document Doppler setup requirements
- [ ] Create quick reference card for emergency recovery
- [ ] Document proper process of adding symlinks (mention updating chemzoiignore, etc.)
### 2. Standardize Encryption & Authentication Workflow
- [ ] Document age encryption setup and key management
- [ ] Create guide for Doppler integration (project setup, config selection)
- [ ] Document secret rotation process and schedule
- [ ] Create checklist for adding new encrypted values
- [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
- [ ] Document `.private_*` file pattern usage
- [ ] Audit existing secrets and migrate to standard locations
### 3. Define Cross-Platform Strategy
- [ ] Create platform detection reference (`.data.wsl`, `.data.chassis`, OS checks)
- [ ] Document template conditionals strategy (when to use OS-specific blocks)
- [ ] Define Windows vs WSL separation of concerns
- [ ] Create decision matrix for which tools go where (Windows native vs WSL)
- [ ] 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
- [x] Document Windows-specific quirks and workarounds (WSL GPG integration documented)
---
## Important
*Affects daily use and prevents frustration*
### 4. Refactor Shell Configuration Architecture
- [ ] 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``commonrc.sh``.bash_aliases`)
- [ ] Add comments explaining each tool's PATH modification
- [ ] Eliminate duplicate PATH additions
- [ ] Create standard pattern for conditional tool loading
- [ ] Add PATH deduplication function
- [ ] Move WSL-specific settings to dedicated section (currently at commonrc.sh.tmpl:109-114)
- [ ] Organize tool sections alphabetically or by category
### 5. Shell Completions Cleanup
- [ ] Audit all completion sources in `commonrc.sh.tmpl` (lines 17-22, 35-39, 71-76)
- [ ] Create consistent pattern for conditional completion loading
- [ ] 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
- [ ] Add completion loading performance optimization
- [ ] Document how to add new tool completions
### 6. Windows PATH Management
- [ ] Create PowerShell script for Windows-only PATH modifications
- [ ] Document registry-based PATH vs user PATH vs chezmoi-managed PATH
- [ ] Create chezmoi hook for Windows PATH synchronization
- [ ] Add validation script to check PATH consistency
- [ ] Document how to add new Windows PATH entries
- [ ] Create backup/restore mechanism for Windows PATH
- [ ] Add Windows environment variable management strategy
- [ ] Test PATH length limits on Windows
### 7. Core Tool Standardization
**mise (development environment manager):**
- [ ] Add mise configuration file (`.mise.toml` or per-project configs)
- [ ] Document mise setup and installation
- [x] Integrate mise activation with shell configs
- [ ] Document tool version management strategy
- [ ] Add mise to installation checklist
**bun (JavaScript runtime):**
- [ ] Document global install location and version management
- [ ] Add shell completions configuration
- [ ] Document bun vs npm vs pnpm strategy
- [ ] Add bun to PATH in standard location
- [ ] Test bun hooks (`.init_pre.ts`, `.update_pre.ts`) on all platforms
**Windows Terminal:**
- [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
- [ ] Document Windows Terminal installation method
**Claude (AI assistant):**
- [ ] Document Claude configuration location
- [ ] Add API key management strategy (Doppler?)
- [x] Add global CLAUDE.md to dotfiles
- [ ] Create project-specific CLAUDE.md templates
- [ ] Document sync strategy across machines
---
## Nice to Have
*Important for consistency across machines*
### 8. IDE Configuration Management
**VS Code:**
- [ ] Migrate `settings.json` to dotfiles (separate user vs workspace settings)
- [ ] Add `keybindings.json` template
- [ ] Create extensions list and installation script
- [ ] Document settings sync strategy (Settings Sync vs chezmoi)
- [ ] Add snippets directory
- [ ] Configure language-specific settings
**Cursor:**
- [ ] Determine config overlap with VS Code
- [ ] Manage Cursor-specific settings
- [ ] Add Cursor AI configuration
- [ ] Document Cursor vs VS Code decision criteria
- [ ] Add Cursor to installation workflow
**JetBrains:**
- [ ] Add IDE configs for IntelliJ IDEA
- [ ] Add IDE configs for PyCharm
- [ ] Add IDE configs for other JetBrains IDEs if needed
- [ ] Identify portable vs machine-specific settings
- [ ] Document plugin installation strategy
- [ ] Add color scheme/theme configuration
**Meta:**
- [ ] Create sync strategy for each IDE (template vs symlink vs manual)
- [ ] Document extension/plugin installation automation
- [ ] Add IDE version tracking and update strategy
- [ ] Create IDE-specific .gitignore patterns
### 9. AI Tools Configuration
- [ ] Audit existing AI tool configs (`.claude/`, API keys, prompts)
- [ ] Add Claude Desktop configuration to dotfiles
- [ ] Add Gemini configuration (if applicable)
- [ ] Document per-project vs global AI configurations
- [ ] Create templates for common AI prompts/rules
- [ ] Integrate API keys into Doppler
- [ ] Add model preferences and settings
- [ ] Document AI tool usage workflows
### 10. Development Tool Configurations
**Git:**
- [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
**Language Tools:**
- [ ] Add Python development configs (pyproject.toml templates, .python-version)
- [ ] Add Node.js configs (.npmrc, .nvmrc templates)
- [ ] Add Rust configs (rustfmt.toml, clippy settings)
- [ ] Add Go configs (go.env, tool preferences)
- [ ] Add language-specific linter/formatter configs
**Terminal Emulators:**
- [ ] Expand Kitty configuration (currently at `home/dot_config/kitty/`)
- [ ] Add Alacritty config (if used)
- [ ] Document terminal color schemes
- [ ] Add font configuration and Nerd Fonts setup
**Other Tools:**
- [ ] Expand Wakatime config (currently at `home/dot_wakatime.cfg.tmpl`)
- [ ] Add tmux configuration
- [ ] Add vim/neovim basic config
- [ ] Add SSH config template
- [x] Add GPG configuration
### 11. Package Management Strategy
- [ ] Audit `run_onchange_install-packages.sh.tmpl`
- [ ] Separate Linux, WSL, and Windows package lists
- [ ] Create idempotent package installation scripts
- [ ] Document package dependencies and installation order
- [ ] Add Windows package manager integration (winget/chocolatey/scoop)
- [ ] Add Homebrew package list for Linux
- [ ] Add platform-specific package selection logic
- [ ] Test package installation on clean system
- [ ] Document manual installation steps for proprietary tools
- [ ] Add package version pinning strategy
---
## Polishing
*Nice-to-have improvements and quality of life*
### 12. Enhanced Documentation
- [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
- [ ] Document all chezmoi hooks and their purposes
- [ ] Create REFERENCE.md with template variable reference
- [ ] Add FAQ.md with common issues and solutions
- [ ] Document chezmoi commands cheat sheet
- [ ] Add diagrams for config flow and file organization
- [ ] Create video walkthrough or screenshots
### 13. Quality of Life Improvements
- [ ] Add chezmoi status checking script (detect drift)
- [ ] Create update reminder system (terminal startup notification)
- [ ] Implement "unmanaged files" workflow (mentioned in README.md:48-54)
- [ ] Add fuzzy search for config diffs (fzf integration)
- [ ] Create backup/snapshot system before applying changes
- [ ] Add interactive configuration wizard for new machines
- [ ] Create script to list all managed files
- [ ] Add change preview before applying updates
- [ ] Create rollback mechanism
- [ ] Add performance profiling for shell startup time
### 14. Advanced Features from README "Intended Goals"
- [ ] rbw auto-lock implementation (8hr sessions) (README.md:58-60)
- [ ] Lock rbw when computer sleeps, idle, or screen saver activates
- [ ] GitHub language attributes script (pre-commit hook for .gitattributes) (README.md:71-74)
- [ ] Terminal startup checks for out-of-date configs (README.md:69-70)
- [ ] VS Code automatic setup improvements (README.md:68)
- [ ] Neovim configuration management (README.md:67)
- [ ] Add timer-based update checking with low-latency startup
- [ ] Implement device-specific configuration system (README.md:65)
### 15. Testing & Validation
- [ ] Create test script for fresh installation simulation
- [ ] Add validation for encrypted secrets (age decrypt test)
- [ ] Create pre-commit hooks for template syntax checking
- [ ] Add CI/CD for template validation (GitHub Actions)
- [ ] Document rollback procedures
- [ ] Create test matrix for different platforms (Linux/WSL/Windows)
- [ ] Add shellcheck integration for shell scripts
- [ ] Test hook execution on all platforms
- [ ] Validate Doppler integration
- [ ] Add template rendering test suite
### 16. Cleanup & Maintenance
- [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
- [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
- [ ] Reorganize directory structure if needed
---
## Legacy Items from Original TODO
These items were in the original TODO.md and need to be categorized/completed:
- [ ] **age executable not installed on init** - Add to Priority 1, Item 1 (installation docs)
- [ ] **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
- [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)
---
## Notes
- Items can be worked on in any order within their priority level
- Some items have dependencies (e.g., documentation should reflect implemented changes)
- Use `chezmoi cd` to navigate to source directory when working on configs
- Test changes in WSL/Linux before applying to Windows (or vice versa)
- Keep encrypted secrets out of git history - use age encryption or Doppler

View File

@@ -28,12 +28,12 @@
{{- end -}}
{{- /* Detect if running in WSL */ -}}
{{- $wsl := true -}}
{{- $wsl := false -}}
{{- if eq .chezmoi.os "linux" -}}
{{- $wsl = (.chezmoi.kernel.osrelease | lower | contains "microsoft") -}}
{{- end -}}
{{ $privateDomain := promptStringOnce . "privateDomain" "What is the private domain" }}
encryption = "age"
[merge]
command = "bash"
@@ -43,18 +43,17 @@ args = [
]
[data]
privateDomain = {{ $privateDomain | quote }}
chassis = {{ $chassisType | quote }}
wsl = {{ $wsl }}
[diff]
pager = "delta"
scriptContents = false
[data.cpu]
cores = {{ $cpuCores }}
threads = {{ $cpuThreads }}
encryption = "age"
[age]
identity = "{{ .chezmoi.homeDir }}/key.txt"
recipient = "age1s3ctpj9lafl6qwyvd89sn448us7gdzd53d8yyhsc7zny78c0k4sqerrkze"
@@ -64,8 +63,17 @@ encryption = "age"
config = "production"
[hooks.init.pre]
command = "{{ .chezmoi.sourceDir }}/hooks/.init_pre.ts"
command = "bun"
args = ["{{ .chezmoi.sourceDir }}/hooks/.init_pre.ts"]
[hooks.update.pre]
command = "{{ .chezmoi.sourceDir }}/hooks/.update_pre.sh"
[hooks.read-source-state.pre]
command = "{{ .chezmoi.sourceDir }}/hooks/.read-source-state_pre.sh"
command = "bun"
args = ["{{ .chezmoi.sourceDir }}/hooks/.update_pre.ts"]
{{ if eq .chezmoi.os "windows" }}
[cd]
command = "powershell.exe"
args = ["-NoLogo"]
{{ else }}
[cd]
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,34 +1,39 @@
hooks
tool-versions
claude-settings.json
{{/* 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" }}
.oh-my-zsh
.scripts
*.zsh
.zshrc
.bashrc
key.txt
.passwd-s3fs.age
.profile
.tmux.conf
{{/* this may be pretty broad, will need to be adjusted */}}
.config
{{ else }}
Documents
setup-wsl-gpg.sh
.gnupg/**
{{ end }}
{{/* Linux/Unix Only Files */}}
{{ if (not (eq .chezmoi.os "linux")) }}
# Shell configs (Linux-only)
.scripts
.bashrc
.profile
.bash_aliases
key.txt
.tmux.conf
# Linux-only config directories
.config/kitty
.config/fish
.config/Code
.config/Cursor
.config/lazygit
{{ end }}
{{/* Windows Only Files */}}
{{ if (not (eq .chezmoi.os "windows")) }}
Documents/
AppData/
{{ end }}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,242 @@
# {{ template "banner.tmpl" .}}
# Nushell Environment Config File
# Cross-platform configuration for Windows and Linux
# version = "0.98.0"
def create_left_prompt [] {
let dir = match (try { $env.PWD | path relative-to $nu.home-path } catch { null }) {
null => $env.PWD
'' => '~'
$relative_pwd => ([~ $relative_pwd] | path join)
}
let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold })
let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold })
let path_segment = $"($path_color)($dir)(ansi reset)"
$path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)"
}
def create_right_prompt [] {
let time_segment = ([
(ansi reset)
(ansi magenta)
(date now | format date '%x %X')
] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" |
str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}")
let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([
(ansi rb)
($env.LAST_EXIT_CODE)
] | str join)
} else { "" }
([$last_exit_code, (char space), $time_segment] | str join)
}
$env.PROMPT_COMMAND = {|| create_left_prompt }
$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt }
$env.PROMPT_INDICATOR = {|| "> " }
$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " }
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " }
$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " }
# Environment variable conversions
$env.ENV_CONVERSIONS = {
"PATH": {
from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
}
"Path": {
from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
}
}
# Library and plugin directories
$env.NU_LIB_DIRS = [
($nu.default-config-dir | path join 'scripts')
($nu.data-dir | path join 'completions')
]
$env.NU_PLUGIN_DIRS = [
($nu.default-config-dir | path join 'plugins')
]
# Editor configuration
$env.EDITOR = "micro"
$env.MICRO_TRUECOLOR = 1
# OpenAI API Key
$env.OPENAI_API_KEY = "{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# Initialize PATH as a list for easier manipulation
$env.PATH = ($env.PATH | split row (char esep))
# Platform-specific PATH additions
{{ if eq .chezmoi.os "windows" }}
# Windows PATH additions
# User local bin
$env.PATH = ($env.PATH | prepend ($env.USERPROFILE | path join ".local" "bin"))
# Go
let go_user = ($env.USERPROFILE | path join "go" "bin")
let go_system = "C:\\Program Files\\Go\\bin"
if ($go_user | path exists) { $env.PATH = ($env.PATH | prepend $go_user) }
if ($go_system | path exists) { $env.PATH = ($env.PATH | prepend $go_system) }
# Rust/Cargo
let cargo_bin = ($env.USERPROFILE | path join ".cargo" "bin")
if ($cargo_bin | path exists) { $env.PATH = ($env.PATH | prepend $cargo_bin) }
# Deno
let deno_bin = ($env.USERPROFILE | path join ".deno" "bin")
if ($deno_bin | path exists) {
$env.DENO_INSTALL = ($env.USERPROFILE | path join ".deno")
$env.PATH = ($env.PATH | prepend $deno_bin)
}
# Node/pnpm
let pnpm_home = ($env.LOCALAPPDATA | path join "pnpm")
if ($pnpm_home | path exists) {
$env.PNPM_HOME = $pnpm_home
$env.PATH = ($env.PATH | prepend $pnpm_home)
}
# Bun
let bun_bin = ($env.USERPROFILE | path join ".bun" "bin")
if ($bun_bin | path exists) {
$env.BUN_INSTALL = ($env.USERPROFILE | path join ".bun")
$env.PATH = ($env.PATH | prepend $bun_bin)
}
# Python/pyenv
let pyenv_root = ($env.USERPROFILE | path join ".pyenv" "pyenv-win")
if ($pyenv_root | path exists) {
$env.PYENV_ROOT = $pyenv_root
$env.PATH = ($env.PATH | prepend ($pyenv_root | path join "bin"))
$env.PATH = ($env.PATH | prepend ($pyenv_root | path join "shims"))
}
# .NET
let dotnet_root = ($env.USERPROFILE | path join ".dotnet")
if ($dotnet_root | path exists) {
$env.DOTNET_ROOT = $dotnet_root
$env.PATH = ($env.PATH | prepend $dotnet_root)
$env.PATH = ($env.PATH | prepend ($dotnet_root | path join "tools"))
}
# Bob (Neovim version manager)
let bob_bin = ($env.LOCALAPPDATA | path join "bob" "nvim-bin")
if ($bob_bin | path exists) { $env.PATH = ($env.PATH | prepend $bob_bin) }
# Spicetify
let spicetify = ($env.USERPROFILE | path join ".spicetify")
if ($spicetify | path exists) { $env.PATH = ($env.PATH | prepend $spicetify) }
# Pulumi
let pulumi_bin = ($env.USERPROFILE | path join ".pulumi" "bin")
if ($pulumi_bin | path exists) { $env.PATH = ($env.PATH | prepend $pulumi_bin) }
# Scoop
let scoop_shims = ($env.USERPROFILE | path join "scoop" "shims")
if ($scoop_shims | path exists) { $env.PATH = ($env.PATH | prepend $scoop_shims) }
{{ else }}
# Linux/macOS PATH additions
# User local bin
$env.PATH = ($env.PATH | prepend ($env.HOME | path join ".local" "bin"))
# System bins
$env.PATH = ($env.PATH | prepend "/usr/local/bin")
$env.PATH = ($env.PATH | prepend ($env.HOME | path join "bin"))
# Go
let go_bin = "/usr/local/go/bin"
let go_user = ($env.HOME | path join "go" "bin")
if ($go_bin | path exists) { $env.PATH = ($env.PATH | prepend $go_bin) }
if ($go_user | path exists) { $env.PATH = ($env.PATH | prepend $go_user) }
# Rust/Cargo
let cargo_bin = ($env.HOME | path join ".cargo" "bin")
if ($cargo_bin | path exists) { $env.PATH = ($env.PATH | prepend $cargo_bin) }
# Deno
let deno_bin = ($env.HOME | path join ".deno" "bin")
if ($deno_bin | path exists) { $env.PATH = ($env.PATH | prepend $deno_bin) }
# Bob (Neovim version manager)
let bob_bin = ($env.HOME | path join ".local" "share" "bob" "nvim-bin")
if ($bob_bin | path exists) { $env.PATH = ($env.PATH | prepend $bob_bin) }
# Homebrew (Linux)
let brew_bin = "/home/linuxbrew/.linuxbrew/bin"
if ($brew_bin | path exists) {
$env.PATH = ($env.PATH | prepend $brew_bin)
$env.PATH = ($env.PATH | prepend "/home/linuxbrew/.linuxbrew/sbin")
}
# pnpm
let pnpm_home = ($env.HOME | path join ".local" "share" "pnpm")
if ($pnpm_home | path exists) {
$env.PNPM_HOME = $pnpm_home
$env.PATH = ($env.PATH | prepend $pnpm_home)
}
# Bun
let bun_bin = ($env.HOME | path join ".bun" "bin")
if ($bun_bin | path exists) {
$env.BUN_INSTALL = ($env.HOME | path join ".bun")
$env.PATH = ($env.PATH | prepend $bun_bin)
}
# pyenv
let pyenv_root = ($env.HOME | path join ".pyenv")
if ($pyenv_root | path exists) {
$env.PYENV_ROOT = $pyenv_root
$env.PATH = ($env.PATH | prepend ($pyenv_root | path join "bin"))
}
# jenv (Java)
let jenv_bin = ($env.HOME | path join ".jenv" "bin")
if ($jenv_bin | path exists) { $env.PATH = ($env.PATH | prepend $jenv_bin) }
# .NET
let dotnet_root = ($env.HOME | path join ".dotnet")
if ($dotnet_root | path exists) {
$env.DOTNET_ROOT = $dotnet_root
$env.PATH = ($env.PATH | prepend $dotnet_root)
$env.PATH = ($env.PATH | prepend ($dotnet_root | path join "tools"))
}
# Spicetify
let spicetify = ($env.HOME | path join ".spicetify")
if ($spicetify | path exists) { $env.PATH = ($env.PATH | prepend $spicetify) }
# Pulumi
let pulumi_bin = ($env.HOME | path join ".pulumi" "bin")
if ($pulumi_bin | path exists) { $env.PATH = ($env.PATH | prepend $pulumi_bin) }
# Perl (if installed)
let perl_bin = ($env.HOME | path join "perl5" "bin")
if ($perl_bin | path exists) {
$env.PATH = ($env.PATH | prepend $perl_bin)
$env.PERL5LIB = ($env.HOME | path join "perl5" "lib" "perl5")
$env.PERL_LOCAL_LIB_ROOT = ($env.HOME | path join "perl5")
}
# hishtory
let hishtory_bin = ($env.HOME | path join ".hishtory")
if ($hishtory_bin | path exists) { $env.PATH = ($env.PATH | prepend $hishtory_bin) }
{{ end }}
# Remove duplicates from PATH
$env.PATH = ($env.PATH | uniq)
# WSL-specific settings
{{ if .wsl }}
# Ensure CLI apps open URLs in Windows browser
$env.BROWSER = 'powershell.exe /c start'
{{ end }}

View File

@@ -0,0 +1,123 @@
# 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 (stat -c %Y "$brew_bin" 2>/dev/null || echo 0) -gt (stat -c %Y "$brew_cache" 2>/dev/null || echo 0)
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'
# Cursor IDE CLI (Windows installation accessible from WSL)
test -x /mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin/cursor && \
fish_add_path /mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin
# Zed Editor CLI (Windows installation accessible from WSL)
test -x /mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin/zed && \
fish_add_path /mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin
# Launch Windows Terminal in current directory
function wt
if test (count $argv) -eq 0
wt.exe -w 0 sp wsl --cd (pwd)
else
wt.exe -w 0 $argv wsl --cd (pwd)
end
end
{{- end }}
# atuin (magical shell history)
if command -q atuin
atuin init fish | source
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"
@@ -11,11 +11,9 @@ export TERM=xterm-256color # fixes terminal colors when ssh'ing into laptop
export OPENAI_API_KEY="{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# hishtory
export HISHTORY_SERVER="https://hsh.{{ .data.privateDomain }}"
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
@@ -83,15 +83,6 @@ case ":$PATH:" in
*) export PATH="$PNPM_HOME:$PATH" ;;
esac
# perl
if [ -d "$HOME/perl5" ]; then
PATH="$HOME/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="$HOME/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="$HOME/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"$HOME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=$HOME/perl5"; export PERL_MM_OPT;
fi
# spicetify
if [ -d "$HOME/.spicetify" ]; then
export PATH=$PATH:$HOME/.spicetify
@@ -102,16 +93,42 @@ 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
# disable screen blanking
# source $(brew --prefix)/share/zsh/site-functions/_todoist_peco
# xset s off && xset -dpms
# Always use `micro` as the preferred editor when connected via SSH
if [[ -n $SSH_CONNECTION ]]; then
export EDITOR='micro'
fi
{{- /* WSL-specific settings */ -}}
{{- if .data.wsl }}
## Ensures CLI apps open URLs in the default Windows browser (Chrome/Firefox/etc) instead of a CLI browser
export BROWSER='powershell.exe /c start'
{{- end }}
# Cursor IDE CLI (Windows installation accessible from WSL)
[ -x /mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin/cursor ] && \
export PATH="$PATH:/mnt/c/Users/Xevion/AppData/Local/Programs/cursor/resources/app/bin"
# Zed Editor CLI (Windows installation accessible from WSL)
[ -x /mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin/zed ] && \
export PATH="$PATH:/mnt/c/Users/Xevion/AppData/Local/Programs/Zed/bin"
# Launch Windows Terminal in current directory
wt() {
if [ $# -eq 0 ]; then
wt.exe -w 0 sp wsl --cd "$(pwd)"
else
wt.exe -w 0 "$@" wsl --cd "$(pwd)"
fi
}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
# dotnet
if [ -d "$HOME/.dotnet" ]; then
@@ -119,17 +136,7 @@ if [ -d "$HOME/.dotnet" ]; then
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
# If WSL, add SSH key on startup (once per WSL start)
{{- if .data.wsl }}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
# atuin
if [ -d "$HOME/.atuin" ]; then
. "$HOME/.atuin/bin/env"
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": "\u001b\r"
},
"when": "terminalFocus"
}
]

View File

@@ -0,0 +1,335 @@
{
// 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.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,
"cursor.terminal.usePreviewBox": true,
"java.trace.server": "verbose",
"java.server.launchMode": "Standard"
}

View File

@@ -0,0 +1,332 @@
{
// 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.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,220 @@
{
"$help": "https://aka.ms/terminal-documentation",
"$schema": "https://aka.ms/terminal-profiles-schema",
"actions": [
{
"command": {
"action": "copy",
"singleLine": false
},
"id": "User.copy.644BA8F2",
"keys": "ctrl+c"
},
{
"command": "paste",
"id": "User.paste",
"keys": "ctrl+v"
},
{
"command": {
"action": "splitPane",
"split": "auto",
"splitMode": "duplicate"
},
"id": "User.splitPane.A6751878",
"keys": "alt+shift+d"
}
],
"copyFormatting": "none",
"copyOnSelect": false,
"defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"newTabMenu": [
{
"type": "remainingProfiles"
}
],
"profiles": {
"defaults": {
"bellStyle": "taskbar",
"colorScheme": "Campbell",
"experimental.retroTerminalEffect": false,
"font": {
"face": "MesloLGS NF"
},
"startingDirectory": "./"
},
"list": [
{
"adjustIndistinguishableColors": "always",
"commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoLogo",
"experimental.retroTerminalEffect": false,
"font": {
"features": {}
},
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"hidden": true,
"name": "Windows PowerShell"
},
{
"commandline": "%SystemRoot%\\System32\\cmd.exe",
"guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
"hidden": true,
"name": "Command Prompt"
},
{
"commandline": "nu",
"guid": "{88e96e3b-8480-493c-a83a-fdacc2073455}",
"name": "Nushell"
},
{
"guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
"hidden": true,
"name": "Azure Cloud Shell",
"source": "Windows.Terminal.Azure"
},
{
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"commandline": "C:\\Program Files\\PowerShell\\7\\pwsh.exe -NoLogo",
"hidden": false,
"name": "PowerShell"
},
{
"guid": "{2ece5bfe-50ed-5f3a-ab87-5cd4baafed2b}",
"hidden": false,
"name": "Git Bash",
"source": "Git"
},
{
"guid": "{d2d97d92-ca5d-557d-b125-92e740f8d3e3}",
"hidden": true,
"name": "Developer Command Prompt for VS 2022",
"source": "Windows.Terminal.VisualStudio"
},
{
"guid": "{d81ed14b-afc2-5921-9f8f-777ca38e2508}",
"hidden": true,
"name": "Developer PowerShell for VS 2022",
"source": "Windows.Terminal.VisualStudio"
},
{
"guid": "{51855cb2-8cce-5362-8f54-464b92b32386}",
"hidden": false,
"name": "Ubuntu",
"source": "CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc"
},
{
"guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
"hidden": true,
"name": "Ubuntu",
"source": "Windows.Terminal.Wsl"
},
{
"guid": "{b0d4d26a-c7ad-5dde-9fc4-70b8837407a8}",
"hidden": true,
"name": "Developer Command Prompt for VS 2019",
"source": "Windows.Terminal.VisualStudio"
},
{
"guid": "{07391626-5a34-526f-967c-bed2545c591e}",
"hidden": true,
"name": "Developer PowerShell for VS 2019",
"source": "Windows.Terminal.VisualStudio"
},
{
"guid": "{8ab8e6f6-35c6-5b46-8419-3e1568105476}",
"hidden": true,
"name": "podman-machine-default",
"source": "Windows.Terminal.Wsl"
},
{
"commandline": "%WINDIR%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy ByPass -NoExit -Command \"& 'C:\\Users\\Xevion\\anaconda3\\shell\\condabin\\conda-hook.ps1' ; conda activate 'C:\\Users\\Xevion\\anaconda3' \"",
"guid": "{eed49005-877d-5de2-94d5-5ce5e370f8c3}",
"icon": "C:\\Users\\Xevion\\anaconda3\\Menu\\anaconda_powershell_prompt.ico",
"name": "Anaconda PowerShell Prompt (anaconda3)",
"startingDirectory": "C:\\Users\\Xevion"
},
{
"commandline": "%WINDIR%\\System32\\cmd.exe \"/K\" C:\\Users\\Xevion\\anaconda3\\Scripts\\activate.bat C:\\Users\\Xevion\\anaconda3",
"guid": "{e78b37b4-0017-568b-9279-1abde5e14cde}",
"icon": "C:\\Users\\Xevion\\anaconda3\\Menu\\anaconda_prompt.ico",
"hidden": true,
"name": "Anaconda Prompt (anaconda3)",
"startingDirectory": "C:\\Users\\Xevion"
}
]
},
"schemes": [
{
"background": "#F9F9F9",
"black": "#000000",
"blue": "#2F5AF3",
"brightBlack": "#000000",
"brightBlue": "#2F5AF3",
"brightCyan": "#3F953A",
"brightGreen": "#3F953A",
"brightPurple": "#A00095",
"brightRed": "#DE3E35",
"brightWhite": "#FFFFFF",
"brightYellow": "#D2B67C",
"cursorColor": "#BBBBBB",
"cyan": "#3F953A",
"foreground": "#2A2C33",
"green": "#3F953A",
"name": "AtomOneLight",
"purple": "#950095",
"red": "#DE3E35",
"selectionBackground": "#EDEDED",
"white": "#BBBBBB",
"yellow": "#D2B67C"
},
{
"background": "#212121",
"black": "#21222C",
"blue": "#82AAFF",
"brightBlack": "#545454",
"brightBlue": "#D6ACFF",
"brightCyan": "#A4FFFF",
"brightGreen": "#69FF94",
"brightPurple": "#FF92DF",
"brightRed": "#FF6E6E",
"brightWhite": "#F8F8F2",
"brightYellow": "#FFCB6B",
"cursorColor": "#ECEFF4",
"cyan": "#8BE9FD",
"foreground": "#F8F8F2",
"green": "#50FA7B",
"name": "Dracula+",
"purple": "#C792EA",
"red": "#FF5555",
"selectionBackground": "#F8F8F2",
"white": "#F8F8F2",
"yellow": "#FFCB6B"
},
{
"background": "#FFFFFF",
"black": "#011627",
"blue": "#4876D6",
"brightBlack": "#7A8181",
"brightBlue": "#5CA7E4",
"brightCyan": "#00C990",
"brightGreen": "#49D0C5",
"brightPurple": "#697098",
"brightRed": "#F76E6E",
"brightWhite": "#989FB1",
"brightYellow": "#DAC26B",
"cursorColor": "#403F53",
"cyan": "#08916A",
"foreground": "#403F53",
"green": "#2AA298",
"name": "Night Owlish Light",
"purple": "#403F53",
"red": "#D3423E",
"selectionBackground": "#F2F2F2",
"white": "#7A8181",
"yellow": "#DAAA01"
}
],
"theme": "system",
"themes": [],
"useAcrylicInTabRow": 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

@@ -0,0 +1,4 @@
{{- /* Windows path: %APPDATA%\nushell\config.nu */ -}}
{{- if eq .chezmoi.os "windows" -}}
{{- template "nushell/config.nu.tmpl" . -}}
{{- end -}}

View File

@@ -0,0 +1,4 @@
{{- /* Windows path: %APPDATA%\nushell\env.nu */ -}}
{{- if eq .chezmoi.os "windows" -}}
{{- template "nushell/env.nu.tmpl" . -}}
{{- end -}}

View File

@@ -0,0 +1,97 @@
# {{ template "banner.tmpl" .}}
# PowerShell Profile for Windows
# Managed by chezmoi
# Editor configuration
$env:EDITOR = "micro"
# OpenAI API Key
$env:OPENAI_API_KEY = "{{ dopplerProjectJson.OPENAI_CHATGPT_CLI }}"
# mise - polyglot tool version manager
# Activates mise if installed (provides tools like vault, node, python, etc.)
if (Get-Command mise -ErrorAction SilentlyContinue) {
Invoke-Expression (& mise activate pwsh | Out-String)
}
# ----------------------
# Core Aliases
# ----------------------
Set-Alias -Name nano -Value micro
Set-Alias -Name vim -Value nvim
Set-Alias -Name lg -Value lazygit
# 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 }
# ----------------------
# Chezmoi Aliases
# ----------------------
Set-Alias -Name ch -Value chezmoi
function cha { chezmoi apply --interactive }
function chlg { lazygit --path {{ .chezmoi.config.sourceDir }} }
# ----------------------
# Windows Terminal
# ----------------------
# Launch Windows Terminal in current directory
function wt {
if ($args.Count -eq 0) {
wt.exe -w 0 sp wsl --cd $PWD.Path
} else {
wt.exe -w 0 $args wsl --cd $PWD.Path
}
}
# ----------------------
# Git Aliases
# ----------------------
function ga { git add $args }
function gaa { git add . }
function gaaa { git add --all }
function gau { git add --update }
function gb { git branch $args }
function gbd { git branch --delete $args }
function gc { git commit $args }
function gcm { git commit --message $args }
function gcf { git commit --fixup $args }
function gco { git checkout $args }
function gcob { git checkout -b $args }
function gcom { git checkout master }
function gcos { git checkout staging }
function gcod { git checkout develop }
function gd { git diff $args }
function gda { git diff HEAD }
function glg { git log --graph --oneline --decorate --all }
function gld { git log --pretty=format:"%h %ad %s" --date=short --all }
function gm { git merge --no-ff $args }
function gma { git merge --abort }
function gmc { git merge --continue }
function gp { git pull $args }
function gpr { git pull --rebase $args }
function gr { git rebase $args }
function gs { git status $args }
function gss { git status --short }
function gst { git stash $args }
function gsta { git stash apply $args }
function gstd { git stash drop $args }
function gstl { git stash list }
function gstp { git stash pop $args }
function gsts { git stash save $args }
function glf { git log --all --grep="$args" }
# Clipboard aliases (Windows native)
function cdp { Set-Location (Get-Clipboard) }
# Initialize completions if available
if (Get-Command chezmoi -ErrorAction SilentlyContinue) {
chezmoi completion powershell | Out-String | Invoke-Expression
}

232
home/claude-settings.json Normal file
View File

@@ -0,0 +1,232 @@
{
"includeCoAuthoredBy": false,
"permissions": {
"allow": [
"WebSearch",
"WebFetch(domain:github.com)",
"WebFetch(domain:raw.githubusercontent.com)",
"WebFetch(domain:gitlab.com)",
"WebFetch(domain:docs.rs)",
"WebFetch(domain:lib.rs)",
"WebFetch(domain:crates.io)",
"WebFetch(domain:npmjs.com)",
"WebFetch(domain:pypi.org)",
"WebFetch(domain:typst.app)",
"WebFetch(domain:pixijs.com)",
"WebFetch(domain:developers.cloudflare.com)",
"WebFetch(domain:aws.amazon.com)",
"WebFetch(domain:cloud.google.com)",
"WebFetch(domain:azure.microsoft.com)",
"WebFetch(domain:learn.microsoft.com)",
"WebFetch(domain:devblogs.microsoft.com)",
"WebFetch(domain:slowli.github.io)",
"mcp__context7__resolve-library-id",
"mcp__context7__get-library-docs",
"mcp__linear-server__list_issues",
"mcp__linear-server__list_issue_labels",
"mcp__linear-server__create_issue_label",
"mcp__linear-server__update_issue",
"mcp__linear-server__list_teams",
"mcp__linear-server__list_projects",
"Bash(cargo --version:*)",
"Bash(cargo build:*)",
"Bash(cargo check:*)",
"Bash(cargo clippy:*)",
"Bash(cargo test:*)",
"Bash(cargo nextest run:*)",
"Bash(cargo tree:*)",
"Bash(cargo doc:*)",
"Bash(cargo llvm-cov:*)",
"Bash(cargo add:*)",
"Bash(cargo machete:*)",
"Bash(cargo udeps:*)",
"Bash(cargo audit:*)",
"Bash(cargo deny:*)",
"Bash(cargo outdated:*)",
"Bash(rustc --version:*)",
"Bash(sccache --version:*)",
"Bash(node --version:*)",
"Bash(npm --version:*)",
"Bash(npm run:*)",
"Bash(npm audit:*)",
"Bash(pnpm --version:*)",
"Bash(pnpm run:*)",
"Bash(pnpm list:*)",
"Bash(pnpm exec:*)",
"Bash(pnpm audit:*)",
"Bash(pnpm outdated:*)",
"Bash(bun --version:*)",
"Bash(bun run:*)",
"Bash(bun:*)",
"Bash(just --version:*)",
"Bash(just:*)",
"Bash(make --version:*)",
"Bash(make run:*)",
"Bash(make build:*)",
"Bash(git --version:*)",
"Bash(git status:*)",
"Bash(git log:*)",
"Bash(git show:*)",
"Bash(git diff:*)",
"Bash(git fetch:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git rm:*)",
"Bash(git mv:*)",
"Bash(gh --version:*)",
"Bash(gh run list:*)",
"Bash(gh run view:*)",
"Bash(gh pr list:*)",
"Bash(gh api:*)",
"Bash(docker --version:*)",
"Bash(docker ps:*)",
"Bash(docker logs:*)",
"Bash(docker inspect:*)",
"Bash(docker exec:*)",
"Bash(docker port:*)",
"Bash(docker build:*)",
"Bash(wrangler --version:*)",
"Bash(ls:*)",
"Bash(tree:*)",
"Bash(cat:*)",
"Bash(rg:*)",
"Bash(find:*)",
"Bash(mkdir:*)",
"Bash(cloc:*)",
"Bash(tokei:*)",
"Bash(curl:*)",
"Bash(netstat:*)",
"Bash(awk:*)",
"Bash(timeout:*)",
"Bash(wsl --list --verbose:*)",
"Bash(wsl dpkg:*)",
"Bash(wsl which:*)",
"Bash(wsl ps:*)",
"Bash(wsl find:*)",
"Bash(wsl ls:*)",
"Bash(wsl:*)",
"Bash(tasklist:*)",
"Bash(Select-String:*)",
"Bash(Select-Object:*)",
"Bash(findstr:*)",
"Bash(dir:*)",
"Bash(do)",
"Bash(then)",
"Bash(echo:*)",
"Bash(else)",
"Bash(fi)",
"Bash(done)",
"Bash(mise exec actionlint:*)",
"mcp__linear-server__create_issue"
],
"deny": [
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git push --force-with-lease:*)",
"Bash(git reset --hard:*)",
"Bash(git branch -D:*)",
"Bash(git clean -fd:*)",
"Bash(git clean -f:*)",
"Bash(git filter-branch:*)",
"Bash(git push --delete:*)",
"Bash(git push origin --delete:*)",
"Bash(git push origin :*)",
"Bash(gh repo delete:*)",
"Bash(gh repo archive:*)",
"Bash(gh secret delete:*)",
"Bash(gh release delete:*)",
"Bash(cargo clean:*)",
"Bash(cargo yank:*)",
"Bash(cargo uninstall --all:*)",
"Bash(wrangler delete:*)",
"Bash(wrangler secret delete:*)",
"Bash(rm -rf:*)",
"Bash(rmdir /s:*)",
"Bash(rd /s:*)",
"Bash(Remove-Item -Recurse -Force:*)",
"Bash(del /s:*)"
],
"ask": [
"Bash(cargo uninstall:*)",
"Bash(cargo update:*)",
"Bash(npm install:*)",
"Bash(npm update:*)",
"Bash(pnpm install:*)",
"Bash(pnpm add:*)",
"Bash(pnpm remove:*)",
"Bash(pnpm uninstall:*)",
"Bash(pnpm update:*)",
"Bash(pnpm store prune:*)",
"Bash(bun install:*)",
"Bash(bun add:*)",
"Bash(bun remove:*)",
"Bash(git checkout:*)",
"Bash(git pull:*)",
"Bash(git merge:*)",
"Bash(git merge --squash:*)",
"Bash(git branch -d:*)",
"Bash(git rebase:*)",
"Bash(git push:*)",
"Bash(gh pr close:*)",
"Bash(gh issue close:*)",
"Bash(gh run cancel:*)",
"Bash(wrangler publish:*)",
"Bash(wrangler deploy:*)",
"Bash(pnpm run deploy:*)",
"Bash(pnpm run build --production:*)",
"Bash(npm run deploy:*)",
"Bash(bun run deploy:*)",
"Bash(mv:*)",
"Bash(Move-Item:*)",
"Bash(rm:*)",
"Bash(del:*)"
],
"defaultMode": "default"
},
"model": "sonnet",
"statusLine": {
"type": "command",
"command": "bunx -y ccstatusline@latest",
"padding": 0
},
"enabledPlugins": {
"backend-development@claude-code-workflows": true,
"javascript-typescript@claude-code-workflows": true,
"security-guidance@claude-code-plugins": true,
"commit-commands@claude-code-plugins": true,
"feature-dev@claude-code-plugins": true,
"code-documentation@claude-code-workflows": true,
"debugging-toolkit@claude-code-workflows": true,
"git-pr-workflows@claude-code-workflows": true,
"full-stack-orchestration@claude-code-workflows": true,
"unit-testing@claude-code-workflows": true,
"tdd-workflows@claude-code-workflows": true,
"code-review-ai@claude-code-workflows": true,
"code-refactoring@claude-code-workflows": true,
"dependency-management@claude-code-workflows": true,
"error-debugging@claude-code-workflows": true,
"error-diagnostics@claude-code-workflows": true,
"deployment-strategies@claude-code-workflows": true,
"deployment-validation@claude-code-workflows": true,
"cicd-automation@claude-code-workflows": true,
"application-performance@claude-code-workflows": true,
"comprehensive-review@claude-code-workflows": true,
"performance-testing-review@claude-code-workflows": true,
"framework-migration@claude-code-workflows": true,
"codebase-cleanup@claude-code-workflows": true,
"database-design@claude-code-workflows": true,
"data-validation-suite@claude-code-workflows": true,
"api-scaffolding@claude-code-workflows": true,
"api-testing-observability@claude-code-workflows": true,
"documentation-generation@claude-code-workflows": true,
"game-development@claude-code-workflows": true,
"accessibility-compliance@claude-code-workflows": true,
"systems-programming@claude-code-workflows": true,
"functional-programming@claude-code-workflows": true,
"shell-scripting@claude-code-workflows": true,
"observability-monitoring@claude-code-workflows": true,
"database-cloud-optimization@claude-code-workflows": true,
"jvm-languages@claude-code-workflows": true
},
"alwaysThinkingEnabled": true
}

View File

@@ -113,4 +113,8 @@ fi
# If WSL, add SSH key on startup (once per WSL start)
{{- if .wsl }}
eval `keychain --quiet --eval --agents ssh ~/.ssh/id_rsa`
{{ end }}
{{ end }}
# SDKMAN initialization
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

View File

@@ -0,0 +1,208 @@
**Note**: Project-specific CLAUDE.md files take precedence for project-specific patterns.
{{- if and (eq .chezmoi.os "windows") (not .wsl) }}
## Shell Environment (Windows)
- **You are in Bash on Windows** (Git Bash / MSYS2)
- ❌ Do NOT use PowerShell commands (`Get-ChildItem`, `Select-Object`, `Move-Item`)
- ❌ Do NOT use CMD commands (`dir`, `copy`, `del`)
- ✅ Use standard Bash/Unix commands (`ls`, `cp`, `mv`, `rm`, `grep`)
- Prefer relative paths for simplicity
{{- else if .wsl }}
## Shell Environment (WSL)
- **You are in WSL (Windows Subsystem for Linux)**
- ✅ Use standard Linux/Bash commands (`ls`, `cp`, `mv`, `rm`, `grep`)
- ✅ Full access to Linux tooling and package managers
- ⚠️ Can access Windows filesystem via `/mnt/c/`, but prefer Linux paths
- ⚠️ Can call Windows executables (`.exe`), but prefer native Linux tools
- Prefer relative paths for simplicity
{{- else if eq .chezmoi.os "linux" }}
## Shell Environment (Linux)
- **You are in a standard Linux environment**
- ✅ Use standard Bash/Unix commands (`ls`, `cp`, `mv`, `rm`, `grep`)
- ✅ Full access to Linux tooling and package managers
- Prefer relative paths for simplicity
{{- end }}
## Build & Package Management
### General Principles
- **NEVER invoke `cargo clean`** - rarely necessary and wastes time
- **Avoid running full builds unless necessary** - prefer type checking and linting
- Run cargo build or any build commands with lots of output in 'quiet' mode, unless you require access to stacktrace/warnings/etc
- Alternatively, avoid running the command and stop the prompt there if you simply want the user to test and report back
### Dependency Management
- **Always use package manager commands** over manually editing manifest files:
- Rust: `cargo add`, `cargo remove`
- Node.js: `pnpm add`, `pnpm remove` (or npm/yarn as appropriate)
- This ensures lockfiles are updated correctly and consistently
- **Get the latest compatible version** unless there's a specific reason not to
- You can specify versions, but prefer letting the tool grab the latest
- Your knowledge cutoff means you often don't know the latest versions
### Check Commands
- Look for project-specific commands first (`just check`, `just test`, etc.)
- Always prefer project-specific check commands over raw `cargo` or `npm` commands
## Testing
### Test Organization
- **Integration/feature tests**: Place in `tests/` directory
- **Unit tests**: Place alongside the code they test directly (in same file or adjacent `tests.rs`)
- Always check project conventions before adding tests
### Running Tests
- Use project-specific test commands (e.g., `just test`) over raw `cargo test`
- Prefer `cargo nextest run` for executing tests (unless `just test` is available, regardless of what it invokes)
- Run tests after making changes to verify functionality
### Assertion Style (Rust)
When a project uses `assert2`:
- Use `assert2::assert!()` instead of `assert_eq!()`
- Use `assert2::let_assert!()` for pattern matching
- Use `assert2::check!()` for non-fatal assertions
## Code Style
### Rust
- Prefer direct imports when heavily used: `use glam::U16Vec2;` then `U16Vec2::new()`
- Prefer iterators and combinators over for loops when idiomatic
- Prefer slices (`&[T]`) for read-only parameters over `&Vec<T>`
- Use `#[inline]` for hot-path functions
### TypeScript
- **Prefer absolute imports** (`@/...`) over relative imports when available
- Not always necessary or possible - use judgment
- Clearer and easier to refactor when the pattern exists in the project
- Prefer functional programming patterns (map, filter, reduce) over for loops when idiomatic
### General Pattern
- **Write idiomatic code for the language**:
- Rust: iterators, combinators, Option/Result patterns
- TypeScript: functional patterns, modern ES6+ features
- Check existing code patterns before implementing
## Comments & Documentation
- Write comments that explain **WHY**, not **WHAT**
- **Never reference old implementations, migrations, or refactoring history**
- **Never add banner comments** (`===`, `-----`, etc.)
- Update project CLAUDE.md when making architectural decisions
- Examples of bad comments to avoid:
- "Refactored from previous version that used X approach." (never mention past implementations)
- "This function was changed to improve performance." (utterly useless, belongs in a commit message potentially, but not code!)
- "Logging removed for cleaner output." (also useless, belongs in commit message if anything)
## Git Commits
### Safety & Best Practices
- **Do NOT add co-authoring or attribution to Claude Code/AI**
- **Be very careful with commit history**:
- Avoid rewriting history unless explicitly prompted by user
- **Check if commits actually went through** when hooks fail
- **Never accidentally amend previous commits** when user meant to create new one
- If pre-commit or hooks fail, verify the commit status before retrying
- Write concise commit messages focusing on "why" rather than "what"
- If writing the first commit, assume conventional commit style unless user specifies otherwise.
- For subsequent commits, follow the project's existing commit style.
- Scale the length and detail of the commit message to the impact of the changes.
- A simple rename of a function or type may interact with many files, but it does not deserve a length message.
- A complex feature addition or refactor deserves a more detailed message explaining the reasoning. Still, keep things concise.
- Never include details like "All tests pass, 92% coverage. A few warnings."
## AI Development Workflow
### Standard Workflow
`modify code → check → test → hand off to user`
1. Make code changes
2. Run project-specific check commands
3. Run tests if applicable
4. **Hand off to user** - do NOT run dev servers or long-running processes
5. Wait for user feedback
### Codebase Exploration
- **Avoid super complex bash/sed/awk commands** when exploring
- Use existing tools (Read, Glob, Grep) to manually explore instead
- Check for existing libraries, frameworks, and code patterns before creating new utilities/APIs
### Question Tool Usage
- **Use for complex tasks and design decisions**:
- Architectural choices
- Multiple implementation approaches
- Feature design options
- Clarifying & confirming important requirements, especially vague or conflicting ones
- **Do NOT use for trivial details**:
- Variable naming
- Minor formatting choices
- **Prefer multi-select when appropriate**, single-select when mutually exclusive
- User appreciates being consulted on larger, more abstract decisions
### When NOT to Build/Run
- ❌ After type checking passes - building is unnecessary
- ❌ Dev servers (`pnpm dev`, `cargo run`, etc.)
- ❌ Long-running processes or interactive tools
- ✅ Only build when user explicitly requests or verifying build config
## Tool Usage
### Prefer Specialized Tools Over Bash
- Read tool for reading files (not `cat`, `head`, `tail`)
- Edit tool for editing files (not `sed`, `awk`)
- Write tool for creating files (not `echo >`)
- Glob tool for finding files (not `find`, `ls`)
- Grep tool for searching (not `grep`, `rg`)
- Bash ONLY for actual system commands and terminal operations
## Security & Error Handling
- Watch for security vulnerabilities: command injection, XSS, SQL injection, OWASP Top 10
- If you write insecure code, **immediately fix it**
- Validate all external inputs
- Use appropriate error types for the language
## Quick Reference
### After Making Changes
```bash
# 1. Check (find project-specific command)
just check # or equivalent
# 2. Run tests (if applicable)
just test # or equivalent
# 3. STOP - hand off to user for testing
```
### What to Avoid
- Don't run dev servers, builds, or interactive processes yourself
- Don't use complex bash pipelines when simpler tools exist
- Don't manually edit manifests when package manager commands exist
- Don't assume commits went through when hooks fail
---
**Remember**: Check for project-specific CLAUDE.md files that override these global guidelines.

View File

@@ -0,0 +1,17 @@
---
allowed-tools: Bash(git status:*), Bash(git diff:*), Bash(git log:*), Bash(git commit:*)
description: Create a git commit (staged files only)
---
## Context
- Current git status: !`git status`
- Current git diff (staged changes only): !`git diff --cached`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -10`
## Your task
Based on the above staged changes, create a single git commit.
You have the capability to call multiple tools in a single response. Create the commit using a single message. Do not stage any additional files. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.

View File

@@ -0,0 +1 @@
{{ .chezmoi.sourceDir }}/claude-settings.json

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,267 @@
## where to store your database, default is your system data directory
## linux/mac: ~/.local/share/atuin/history.db
## windows: %USERPROFILE%/.local/share/atuin/history.db
# db_path = "~/.history.db"
## where to store your encryption key, default is your system data directory
## linux/mac: ~/.local/share/atuin/key
## windows: %USERPROFILE%/.local/share/atuin/key
# key_path = "~/.key"
## where to store your auth session token, default is your system data directory
## linux/mac: ~/.local/share/atuin/session
## windows: %USERPROFILE%/.local/share/atuin/session
# session_path = "~/.session"
## date format used, either "us" or "uk"
# dialect = "us"
## default timezone to use when displaying time
## either "l", "local" to use the system's current local timezone, or an offset
## from UTC in the format of "<+|->H[H][:M[M][:S[S]]]"
## for example: "+9", "-05", "+03:30", "-01:23:45", etc.
# timezone = "local"
## enable or disable automatic sync
auto_sync = true
## enable or disable automatic update checks
# update_check = true
## address of the sync server
sync_address = "https://atuin.imfucked.lol"
## how often to sync history. note that this is only triggered when a command
## is ran, so sync intervals may well be longer
## set it to 0 to sync after every command
# sync_frequency = "10m"
## which search mode to use
## possible values: prefix, fulltext, fuzzy, skim
# search_mode = "fuzzy"
## which filter mode to use by default
## possible values: "global", "host", "session", "directory", "workspace"
## consider using search.filters to customize the enablement and order of filter modes
# filter_mode = "global"
## With workspace filtering enabled, Atuin will filter for commands executed
## in any directory within a git repository tree (default: false).
##
## To use workspace mode by default when available, set this to true and
## set filter_mode to "workspace" or leave it unspecified and
## set search.filters to include "workspace" before other filter modes.
# workspaces = false
## which filter mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "filter_mode"
## leave unspecified to use same mode set in "filter_mode"
# filter_mode_shell_up_key_binding = "global"
## which search mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "search_mode"
## leave unspecified to use same mode set in "search_mode"
# search_mode_shell_up_key_binding = "fuzzy"
## which style to use
## possible values: auto, full, compact
# style = "auto"
## the maximum number of lines the interface should take up
## set it to 0 to always go full screen
# inline_height = 0
## Invert the UI - put the search bar at the top , Default to `false`
# invert = false
## enable or disable showing a preview of the selected command
## useful when the command is longer than the terminal width and is cut off
# show_preview = true
## what to do when the escape key is pressed when searching
## possible values: return-original, return-query
# exit_mode = "return-original"
## possible values: emacs, subl
# word_jump_mode = "emacs"
## characters that count as a part of a word
# word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
## number of context lines to show when scrolling by pages
# scroll_context_lines = 1
## use ctrl instead of alt as the shortcut modifier key for numerical UI shortcuts
## alt-0 .. alt-9
# ctrl_n_shortcuts = false
## default history list format - can also be specified with the --format arg
# history_format = "{time}\t{command}\t{duration}"
## prevent commands matching any of these regexes from being written to history.
## Note that these regular expressions are unanchored, i.e. if they don't start
## with ^ or end with $, they'll match anywhere in the command.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
# history_filter = [
# "^secret-cmd",
# "^innocuous-cmd .*--secret=.+",
# ]
## prevent commands run with cwd matching any of these regexes from being written
## to history. Note that these regular expressions are unanchored, i.e. if they don't
## start with ^ or end with $, they'll match anywhere in CWD.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
# cwd_filter = [
# "^/very/secret/area",
# ]
## Configure the maximum height of the preview to show.
## Useful when you have long scripts in your history that you want to distinguish
## by more than the first few lines.
# max_preview_height = 4
## Configure whether or not to show the help row, which includes the current Atuin
## version (and whether an update is available), a keymap hint, and the total
## amount of commands in your history.
# show_help = true
## Configure whether or not to show tabs for search and inspect
# show_tabs = true
## Configure whether or not the tabs row may be auto-hidden, which includes the current Atuin
## tab, such as Search or Inspector, and other tabs you may wish to see. This will
## only be hidden if there are fewer than this count of lines available, and does not affect the use
## of keyboard shortcuts to switch tab. 0 to never auto-hide, default is 8 (lines).
## This is ignored except in `compact` mode.
# auto_hide_height = 8
## Defaults to true. This matches history against a set of default regex, and will not save it if we get a match. Defaults include
## 1. AWS key id
## 2. Github pat (old and new)
## 3. Slack oauth tokens (bot, user)
## 4. Slack webhooks
## 5. Stripe live/test keys
# secrets_filter = true
## Defaults to true. If enabled, upon hitting enter Atuin will immediately execute the command. Press tab to return to the shell and edit.
# This applies for new installs. Old installs will keep the old behaviour unless configured otherwise.
enter_accept = false
## Defaults to "emacs". This specifies the keymap on the startup of `atuin
## search`. If this is set to "auto", the startup keymap mode in the Atuin
## search is automatically selected based on the shell's keymap where the
## keybinding is defined. If this is set to "emacs", "vim-insert", or
## "vim-normal", the startup keymap mode in the Atuin search is forced to be
## the specified one.
# keymap_mode = "auto"
## Cursor style in each keymap mode. If specified, the cursor style is changed
## in entering the cursor shape. Available values are "default" and
## "{blink,steady}-{block,underline,bar}".
# keymap_cursor = { emacs = "blink-block", vim_insert = "blink-block", vim_normal = "steady-block" }
# network_connect_timeout = 5
# network_timeout = 5
## Timeout (in seconds) for acquiring a local database connection (sqlite)
# local_timeout = 5
## Set this to true and Atuin will minimize motion in the UI - timers will not update live, etc.
## Alternatively, set env NO_MOTION=true
# prefers_reduced_motion = false
[stats]
## Set commands where we should consider the subcommand for statistics. Eg, kubectl get vs just kubectl
# common_subcommands = [
# "apt",
# "cargo",
# "composer",
# "dnf",
# "docker",
# "git",
# "go",
# "ip",
# "kubectl",
# "nix",
# "nmcli",
# "npm",
# "pecl",
# "pnpm",
# "podman",
# "port",
# "systemctl",
# "tmux",
# "yarn",
# ]
## Set commands that should be totally stripped and ignored from stats
# common_prefix = ["sudo"]
## Set commands that will be completely ignored from stats
# ignored_commands = [
# "cd",
# "ls",
# "vi"
# ]
[keys]
# Defaults to true. If disabled, using the up/down key won't exit the TUI when scrolled past the first/last entry.
# scroll_exits = true
[sync]
# Enable sync v2 by default
# This ensures that sync v2 is enabled for new installs only
# In a later release it will become the default across the board
records = true
[preview]
## which preview strategy to use to calculate the preview height (respects max_preview_height).
## possible values: auto, static
## auto: length of the selected command.
## static: length of the longest command stored in the history.
## fixed: use max_preview_height as fixed height.
# strategy = "auto"
[daemon]
## Enables using the daemon to sync. Requires the daemon to be running in the background. Start it with `atuin daemon`
# enabled = false
## How often the daemon should sync in seconds
# sync_frequency = 300
## The path to the unix socket used by the daemon (on unix systems)
## linux/mac: ~/.local/share/atuin/atuin.sock
## windows: Not Supported
# socket_path = "~/.local/share/atuin/atuin.sock"
## Use systemd socket activation rather than opening the given path (the path must still be correct for the client)
## linux: false
## mac/windows: Not Supported
# systemd_socket = false
## The port that should be used for TCP on non unix systems
# tcp_port = 8889
# [theme]
## Color theme to use for rendering in the terminal.
## There are some built-in themes, including the base theme ("default"),
## "autumn" and "marine". You can add your own themes to the "./themes" subdirectory of your
## Atuin config (or ATUIN_THEME_DIR, if provided) as TOML files whose keys should be one or
## more of AlertInfo, AlertWarn, AlertError, Annotation, Base, Guidance, Important, and
## the string values as lowercase entries from this list:
## https://ogeon.github.io/docs/palette/master/palette/named/index.html
## If you provide a custom theme file, it should be called "NAME.toml" and the theme below
## should be the stem, i.e. `theme = "NAME"` for your chosen NAME.
# name = "autumn"
## Whether the theme manager should output normal or extra information to help fix themes.
## Boolean, true or false. If unset, left up to the theme manager.
# debug = true
[search]
## The list of enabled filter modes, in order of priority.
## The "workspace" mode is skipped when not in a workspace or workspaces = false.
## Default filter mode can be overridden with the filter_mode setting.
# filters = [ "global", "host", "session", "workspace", "directory" ]

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,4 @@
# Activate mise automatically on shell startup
if command -q mise
mise activate fish | source
end

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,4 @@
#
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,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,4 @@
function sdk --description 'SDKMAN wrapper for Fish shell'
# Run sdk commands in a Bash subshell
bash -c "source '$HOME/.sdkman/bin/sdkman-init.sh' && sdk $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

@@ -0,0 +1,13 @@
# Ryan Walters identity override
# Use this for work/professional repositories
#
# To use in a repository, run:
# git config --local include.path ~/.config/git/config-ryan
[user]
name = Ryan Walters
email = ryan@walters.to
signingkey = 301511AAD64FA365
{{ if eq .chezmoi.os "windows" }}
{{ else }}
{{ end }}

View File

@@ -0,0 +1,13 @@
# Xevion identity override
# Use this for personal/open-source repositories
#
# To use in a repository, run:
# git config --local include.path ~/.config/git/config-xevion
[user]
name = Xevion
email = xevion@xevion.dev
# No GPG key available for this email - signing disabled
{{ if eq .chezmoi.os "windows" }}
{{ else }}
{{ end }}

View File

@@ -4,3 +4,10 @@ include current-theme.conf
# END_KITTY_THEME
enable_audio_bell no
font_family MesloLGS NF
# Disable command finish notifications (fixes cryptic "4;0;0" notifications)
notify_on_cmd_finish never
# Claude Code: Enable Shift+Enter for multi-line prompts
map shift+enter send_text all \n

View File

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

View File

@@ -1,899 +1,4 @@
# {{ template "banner.tmpl" .}}
# Nushell Config File
#
# version = "0.98.0"
# For more information on defining custom themes, see
# https://www.nushell.sh/book/coloring_and_theming.html
# And here is the theme collection
# https://github.com/nushell/nu_scripts/tree/main/themes
let dark_theme = {
# color for nushell primitives
separator: white
leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off
header: green_bold
empty: blue
# Closures can be used to choose colors for specific values.
# The value (in this case, a bool) is piped into the closure.
# eg) {|| if $in { 'light_cyan' } else { 'light_gray' } }
bool: light_cyan
int: white
filesize: cyan
duration: white
date: purple
range: white
float: white
string: white
nothing: white
binary: white
cell-path: white
row_index: green_bold
record: white
list: white
block: white
hints: dark_gray
search_result: { bg: red fg: white }
shape_and: purple_bold
shape_binary: purple_bold
shape_block: blue_bold
shape_bool: light_cyan
shape_closure: green_bold
shape_custom: green
shape_datetime: cyan_bold
shape_directory: cyan
shape_external: cyan
shape_externalarg: green_bold
shape_external_resolved: light_yellow_bold
shape_filepath: cyan
shape_flag: blue_bold
shape_float: purple_bold
# shapes are used to change the cli syntax highlighting
shape_garbage: { fg: white bg: red attr: b }
shape_glob_interpolation: cyan_bold
shape_globpattern: cyan_bold
shape_int: purple_bold
shape_internalcall: cyan_bold
shape_keyword: cyan_bold
shape_list: cyan_bold
shape_literal: blue
shape_match_pattern: green
shape_matching_brackets: { attr: u }
shape_nothing: light_cyan
shape_operator: yellow
shape_or: purple_bold
shape_pipe: purple_bold
shape_range: yellow_bold
shape_record: cyan_bold
shape_redirection: purple_bold
shape_signature: green_bold
shape_string: green
shape_string_interpolation: cyan_bold
shape_table: blue_bold
shape_variable: purple
shape_vardecl: purple
shape_raw_string: light_purple
}
let light_theme = {
# color for nushell primitives
separator: dark_gray
leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off
header: green_bold
empty: blue
# Closures can be used to choose colors for specific values.
# The value (in this case, a bool) is piped into the closure.
# eg) {|| if $in { 'dark_cyan' } else { 'dark_gray' } }
bool: dark_cyan
int: dark_gray
filesize: cyan_bold
duration: dark_gray
date: purple
range: dark_gray
float: dark_gray
string: dark_gray
nothing: dark_gray
binary: dark_gray
cell-path: dark_gray
row_index: green_bold
record: dark_gray
list: dark_gray
block: dark_gray
hints: dark_gray
search_result: { fg: white bg: red }
shape_and: purple_bold
shape_binary: purple_bold
shape_block: blue_bold
shape_bool: light_cyan
shape_closure: green_bold
shape_custom: green
shape_datetime: cyan_bold
shape_directory: cyan
shape_external: cyan
shape_externalarg: green_bold
shape_external_resolved: light_purple_bold
shape_filepath: cyan
shape_flag: blue_bold
shape_float: purple_bold
# shapes are used to change the cli syntax highlighting
shape_garbage: { fg: white bg: red attr: b }
shape_glob_interpolation: cyan_bold
shape_globpattern: cyan_bold
shape_int: purple_bold
shape_internalcall: cyan_bold
shape_keyword: cyan_bold
shape_list: cyan_bold
shape_literal: blue
shape_match_pattern: green
shape_matching_brackets: { attr: u }
shape_nothing: light_cyan
shape_operator: yellow
shape_or: purple_bold
shape_pipe: purple_bold
shape_range: yellow_bold
shape_record: cyan_bold
shape_redirection: purple_bold
shape_signature: green_bold
shape_string: green
shape_string_interpolation: cyan_bold
shape_table: blue_bold
shape_variable: purple
shape_vardecl: purple
shape_raw_string: light_purple
}
# External completer example
# let carapace_completer = {|spans|
# carapace $spans.0 nushell ...$spans | from json
# }
# The default config record. This is where much of your global configuration is setup.
$env.config = {
show_banner: false # true or false to enable or disable the welcome banner at startup
ls: {
use_ls_colors: true # use the LS_COLORS environment variable to colorize output
clickable_links: true # enable or disable clickable links. Your terminal has to support links.
}
rm: {
always_trash: false # always act as if -t was given. Can be overridden with -p
}
table: {
mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column
show_empty: true # show 'empty list' and 'empty record' placeholders for command output
padding: { left: 1, right: 1 } # a left right padding of each column in a table
trim: {
methodology: wrapping # wrapping or truncating
wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology
truncating_suffix: "..." # A suffix used by the 'truncating' methodology
}
header_on_separator: false # show header text on separator/border line
# abbreviated_row_count: 10 # limit data rows from top and bottom after reaching a set point
}
error_style: "fancy" # "fancy" or "plain" for screen reader-friendly error messages
# Whether an error message should be printed if an error of a certain kind is triggered.
display_errors: {
exit_code: false # assume the external command prints an error message
# Core dump errors are always printed, and SIGPIPE never triggers an error.
# The setting below controls message printing for termination by all other signals.
termination_signal: true
}
# datetime_format determines what a datetime rendered in the shell would look like.
# Behavior without this configuration point will be to "humanize" the datetime display,
# showing something like "a day ago."
datetime_format: {
# normal: '%a, %d %b %Y %H:%M:%S %z' # shows up in displays of variables or other datetime's outside of tables
# table: '%m/%d/%y %I:%M:%S%p' # generally shows up in tabular outputs such as ls. commenting this out will change it to the default human readable datetime format
}
explore: {
status_bar_background: { fg: "#1D1F21", bg: "#C4C9C6" },
command_bar_text: { fg: "#C4C9C6" },
highlight: { fg: "black", bg: "yellow" },
status: {
error: { fg: "white", bg: "red" },
warn: {}
info: {}
},
selected_cell: { bg: light_blue },
}
history: {
max_size: 100_000 # Session has to be reloaded for this to take effect
sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file
file_format: "plaintext" # "sqlite" or "plaintext"
isolation: false # only available with sqlite file_format. true enables history isolation, false disables it. true will allow the history to be isolated to the current session using up/down arrows. false will allow the history to be shared across all sessions.
}
completions: {
case_sensitive: false # set to true to enable case-sensitive completions
quick: true # set this to false to prevent auto-selecting completions when only one remains
partial: true # set this to false to prevent partial filling of the prompt
algorithm: "prefix" # prefix or fuzzy
sort: "smart" # "smart" (alphabetical for prefix matching, fuzzy score for fuzzy matching) or "alphabetical"
external: {
enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up may be very slow
max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options
completer: null # check 'carapace_completer' above as an example
}
use_ls_colors: true # set this to true to enable file/path/directory completions using LS_COLORS
}
filesize: {
metric: false # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard)
format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, auto
}
cursor_shape: {
emacs: line # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (line is the default)
vi_insert: block # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (block is the default)
vi_normal: underscore # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (underscore is the default)
}
color_config: $dark_theme # if you want a more interesting theme, you can replace the empty record with `$dark_theme`, `$light_theme` or another custom record
footer_mode: 25 # always, never, number_of_rows, auto
float_precision: 2 # the precision for displaying floats in tables
buffer_editor: null # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL
use_ansi_coloring: true
bracketed_paste: true # enable bracketed paste, currently useless on windows
edit_mode: emacs # emacs, vi
shell_integration: {
# osc2 abbreviates the path if in the home_dir, sets the tab/window title, shows the running command in the tab/window title
osc2: true
# osc7 is a way to communicate the path to the terminal, this is helpful for spawning new tabs in the same directory
osc7: true
# osc8 is also implemented as the deprecated setting ls.show_clickable_links, it shows clickable links in ls output if your terminal supports it. show_clickable_links is deprecated in favor of osc8
osc8: true
# osc9_9 is from ConEmu and is starting to get wider support. It's similar to osc7 in that it communicates the path to the terminal
osc9_9: false
# osc133 is several escapes invented by Final Term which include the supported ones below.
# 133;A - Mark prompt start
# 133;B - Mark prompt end
# 133;C - Mark pre-execution
# 133;D;exit - Mark execution finished with exit code
# This is used to enable terminals to know where the prompt is, the command is, where the command finishes, and where the output of the command is
osc133: true
# osc633 is closely related to osc133 but only exists in visual studio code (vscode) and supports their shell integration features
# 633;A - Mark prompt start
# 633;B - Mark prompt end
# 633;C - Mark pre-execution
# 633;D;exit - Mark execution finished with exit code
# 633;E - Explicitly set the command line with an optional nonce
# 633;P;Cwd=<path> - Mark the current working directory and communicate it to the terminal
# and also helps with the run recent menu in vscode
osc633: true
# reset_application_mode is escape \x1b[?1l and was added to help ssh work better
reset_application_mode: true
}
render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt.
use_kitty_protocol: false # enables keyboard enhancement protocol implemented by kitty console, only if your terminal support this.
highlight_resolved_externals: false # true enables highlighting of external commands in the repl resolved by which.
recursion_limit: 50 # the maximum number of times nushell allows recursion before stopping it
plugins: {} # Per-plugin configuration. See https://www.nushell.sh/contributor-book/plugins.html#configuration.
plugin_gc: {
# Configuration for plugin garbage collection
default: {
enabled: true # true to enable stopping of inactive plugins
stop_after: 10sec # how long to wait after a plugin is inactive to stop it
}
plugins: {
# alternate configuration for specific plugins, by name, for example:
#
# gstat: {
# enabled: false
# }
}
}
hooks: {
pre_prompt: [{ null }] # run before the prompt is shown
pre_execution: [{ null }] # run before the repl input is run
env_change: {
PWD: [{|before, after| null }] # run if the PWD environment is different since the last repl input
}
display_output: "if (term size).columns >= 100 { table -e } else { table }" # run to display the output of a pipeline
command_not_found: { null } # return an error message when a command is not found
}
menus: [
# Configuration for default nushell menus
# Note the lack of source parameter
{
name: completion_menu
only_buffer_difference: false
marker: "| "
type: {
layout: columnar
columns: 4
col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
col_padding: 2
}
style: {
text: green
selected_text: { attr: r }
description_text: yellow
match_text: { attr: u }
selected_match_text: { attr: ur }
}
}
{
name: ide_completion_menu
only_buffer_difference: false
marker: "| "
type: {
layout: ide
min_completion_width: 0,
max_completion_width: 50,
max_completion_height: 10, # will be limited by the available lines in the terminal
padding: 0,
border: true,
cursor_offset: 0,
description_mode: "prefer_right"
min_description_width: 0
max_description_width: 50
max_description_height: 10
description_offset: 1
# If true, the cursor pos will be corrected, so the suggestions match up with the typed text
#
# C:\> str
# str join
# str trim
# str split
correct_cursor_pos: false
}
style: {
text: green
selected_text: { attr: r }
description_text: yellow
match_text: { attr: u }
selected_match_text: { attr: ur }
}
}
{
name: history_menu
only_buffer_difference: true
marker: "? "
type: {
layout: list
page_size: 10
}
style: {
text: green
selected_text: green_reverse
description_text: yellow
}
}
{
name: help_menu
only_buffer_difference: true
marker: "? "
type: {
layout: description
columns: 4
col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
col_padding: 2
selection_rows: 4
description_rows: 10
}
style: {
text: green
selected_text: green_reverse
description_text: yellow
}
}
]
keybindings: [
{
name: completion_menu
modifier: none
keycode: tab
mode: [emacs vi_normal vi_insert]
event: {
until: [
{ send: menu name: completion_menu }
{ send: menunext }
{ edit: complete }
]
}
}
{
name: ide_completion_menu
modifier: control
keycode: char_n
mode: [emacs vi_normal vi_insert]
event: {
until: [
{ send: menu name: ide_completion_menu }
{ send: menunext }
{ edit: complete }
]
}
}
{
name: history_menu
modifier: control
keycode: char_r
mode: [emacs, vi_insert, vi_normal]
event: { send: menu name: history_menu }
}
{
name: help_menu
modifier: none
keycode: f1
mode: [emacs, vi_insert, vi_normal]
event: { send: menu name: help_menu }
}
{
name: completion_previous_menu
modifier: shift
keycode: backtab
mode: [emacs, vi_normal, vi_insert]
event: { send: menuprevious }
}
{
name: next_page_menu
modifier: control
keycode: char_x
mode: emacs
event: { send: menupagenext }
}
{
name: undo_or_previous_page_menu
modifier: control
keycode: char_z
mode: emacs
event: {
until: [
{ send: menupageprevious }
{ edit: undo }
]
}
}
{
name: escape
modifier: none
keycode: escape
mode: [emacs, vi_normal, vi_insert]
event: { send: esc } # NOTE: does not appear to work
}
{
name: cancel_command
modifier: control
keycode: char_c
mode: [emacs, vi_normal, vi_insert]
event: { send: ctrlc }
}
{
name: quit_shell
modifier: control
keycode: char_d
mode: [emacs, vi_normal, vi_insert]
event: { send: ctrld }
}
{
name: clear_screen
modifier: control
keycode: char_l
mode: [emacs, vi_normal, vi_insert]
event: { send: clearscreen }
}
{
name: search_history
modifier: control
keycode: char_q
mode: [emacs, vi_normal, vi_insert]
event: { send: searchhistory }
}
{
name: open_command_editor
modifier: control
keycode: char_o
mode: [emacs, vi_normal, vi_insert]
event: { send: openeditor }
}
{
name: move_up
modifier: none
keycode: up
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: menuup }
{ send: up }
]
}
}
{
name: move_down
modifier: none
keycode: down
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: menudown }
{ send: down }
]
}
}
{
name: move_left
modifier: none
keycode: left
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: menuleft }
{ send: left }
]
}
}
{
name: move_right_or_take_history_hint
modifier: none
keycode: right
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: historyhintcomplete }
{ send: menuright }
{ send: right }
]
}
}
{
name: move_one_word_left
modifier: control
keycode: left
mode: [emacs, vi_normal, vi_insert]
event: { edit: movewordleft }
}
{
name: move_one_word_right_or_take_history_hint
modifier: control
keycode: right
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: historyhintwordcomplete }
{ edit: movewordright }
]
}
}
{
name: move_to_line_start
modifier: none
keycode: home
mode: [emacs, vi_normal, vi_insert]
event: { edit: movetolinestart }
}
{
name: move_to_line_start
modifier: control
keycode: char_a
mode: [emacs, vi_normal, vi_insert]
event: { edit: movetolinestart }
}
{
name: move_to_line_end_or_take_history_hint
modifier: none
keycode: end
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: historyhintcomplete }
{ edit: movetolineend }
]
}
}
{
name: move_to_line_end_or_take_history_hint
modifier: control
keycode: char_e
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: historyhintcomplete }
{ edit: movetolineend }
]
}
}
{
name: move_to_line_start
modifier: control
keycode: home
mode: [emacs, vi_normal, vi_insert]
event: { edit: movetolinestart }
}
{
name: move_to_line_end
modifier: control
keycode: end
mode: [emacs, vi_normal, vi_insert]
event: { edit: movetolineend }
}
{
name: move_up
modifier: control
keycode: char_p
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: menuup }
{ send: up }
]
}
}
{
name: move_down
modifier: control
keycode: char_t
mode: [emacs, vi_normal, vi_insert]
event: {
until: [
{ send: menudown }
{ send: down }
]
}
}
{
name: delete_one_character_backward
modifier: none
keycode: backspace
mode: [emacs, vi_insert]
event: { edit: backspace }
}
{
name: delete_one_word_backward
modifier: control
keycode: backspace
mode: [emacs, vi_insert]
event: { edit: backspaceword }
}
{
name: delete_one_character_forward
modifier: none
keycode: delete
mode: [emacs, vi_insert]
event: { edit: delete }
}
{
name: delete_one_character_forward
modifier: control
keycode: delete
mode: [emacs, vi_insert]
event: { edit: delete }
}
{
name: delete_one_character_backward
modifier: control
keycode: char_h
mode: [emacs, vi_insert]
event: { edit: backspace }
}
{
name: delete_one_word_backward
modifier: control
keycode: char_w
mode: [emacs, vi_insert]
event: { edit: backspaceword }
}
{
name: move_left
modifier: none
keycode: backspace
mode: vi_normal
event: { edit: moveleft }
}
{
name: newline_or_run_command
modifier: none
keycode: enter
mode: emacs
event: { send: enter }
}
{
name: move_left
modifier: control
keycode: char_b
mode: emacs
event: {
until: [
{ send: menuleft }
{ send: left }
]
}
}
{
name: move_right_or_take_history_hint
modifier: control
keycode: char_f
mode: emacs
event: {
until: [
{ send: historyhintcomplete }
{ send: menuright }
{ send: right }
]
}
}
{
name: redo_change
modifier: control
keycode: char_g
mode: emacs
event: { edit: redo }
}
{
name: undo_change
modifier: control
keycode: char_z
mode: emacs
event: { edit: undo }
}
{
name: paste_before
modifier: control
keycode: char_y
mode: emacs
event: { edit: pastecutbufferbefore }
}
{
name: cut_word_left
modifier: control
keycode: char_w
mode: emacs
event: { edit: cutwordleft }
}
{
name: cut_line_to_end
modifier: control
keycode: char_k
mode: emacs
event: { edit: cuttolineend }
}
{
name: cut_line_from_start
modifier: control
keycode: char_u
mode: emacs
event: { edit: cutfromstart }
}
{
name: swap_graphemes
modifier: control
keycode: char_t
mode: emacs
event: { edit: swapgraphemes }
}
{
name: move_one_word_left
modifier: alt
keycode: left
mode: emacs
event: { edit: movewordleft }
}
{
name: move_one_word_right_or_take_history_hint
modifier: alt
keycode: right
mode: emacs
event: {
until: [
{ send: historyhintwordcomplete }
{ edit: movewordright }
]
}
}
{
name: move_one_word_left
modifier: alt
keycode: char_b
mode: emacs
event: { edit: movewordleft }
}
{
name: move_one_word_right_or_take_history_hint
modifier: alt
keycode: char_f
mode: emacs
event: {
until: [
{ send: historyhintwordcomplete }
{ edit: movewordright }
]
}
}
{
name: delete_one_word_forward
modifier: alt
keycode: delete
mode: emacs
event: { edit: deleteword }
}
{
name: delete_one_word_backward
modifier: alt
keycode: backspace
mode: emacs
event: { edit: backspaceword }
}
{
name: delete_one_word_backward
modifier: alt
keycode: char_m
mode: emacs
event: { edit: backspaceword }
}
{
name: cut_word_to_right
modifier: alt
keycode: char_d
mode: emacs
event: { edit: cutwordright }
}
{
name: upper_case_word
modifier: alt
keycode: char_u
mode: emacs
event: { edit: uppercaseword }
}
{
name: lower_case_word
modifier: alt
keycode: char_l
mode: emacs
event: { edit: lowercaseword }
}
{
name: capitalize_char
modifier: alt
keycode: char_c
mode: emacs
event: { edit: capitalizechar }
}
# The following bindings with `*system` events require that Nushell has
# been compiled with the `system-clipboard` feature.
# If you want to use the system clipboard for visual selection or to
# paste directly, uncomment the respective lines and replace the version
# using the internal clipboard.
{
name: copy_selection
modifier: control_shift
keycode: char_c
mode: emacs
event: { edit: copyselection }
# event: { edit: copyselectionsystem }
}
{
name: cut_selection
modifier: control_shift
keycode: char_x
mode: emacs
event: { edit: cutselection }
# event: { edit: cutselectionsystem }
}
# {
# name: paste_system
# modifier: control_shift
# keycode: char_v
# mode: emacs
# event: { edit: pastesystem }
# }
{
name: select_all
modifier: control_shift
keycode: char_a
mode: emacs
event: { edit: selectall }
}
]
}
{{- /* Linux/macOS path: ~/.config/nushell/config.nu */ -}}
{{- if ne .chezmoi.os "windows" -}}
{{- template "nushell/config.nu.tmpl" . -}}
{{- end -}}

View File

@@ -1,101 +0,0 @@
# Nushell Environment Config File
#
# version = "0.98.0"
def create_left_prompt [] {
let dir = match (do --ignore-shell-errors { $env.PWD | path relative-to $nu.home-path }) {
null => $env.PWD
'' => '~'
$relative_pwd => ([~ $relative_pwd] | path join)
}
let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold })
let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold })
let path_segment = $"($path_color)($dir)(ansi reset)"
$path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)"
}
def create_right_prompt [] {
# create a right prompt in magenta with green separators and am/pm underlined
let time_segment = ([
(ansi reset)
(ansi magenta)
(date now | format date '%x %X') # try to respect user's locale
] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" |
str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}")
let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([
(ansi rb)
($env.LAST_EXIT_CODE)
] | str join)
} else { "" }
([$last_exit_code, (char space), $time_segment] | str join)
}
# Use nushell functions to define your right and left prompt
$env.PROMPT_COMMAND = {|| create_left_prompt }
# FIXME: This default is not implemented in rust code as of 2023-09-08.
$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt }
# The prompt indicators are environmental variables that represent
# the state of the prompt
$env.PROMPT_INDICATOR = {|| "> " }
$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " }
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " }
$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " }
# If you want previously entered commands to have a different prompt from the usual one,
# you can uncomment one or more of the following lines.
# This can be useful if you have a 2-line prompt and it's taking up a lot of space
# because every command entered takes up 2 lines instead of 1. You can then uncomment
# the line below so that previously entered commands show with a single `🚀`.
# $env.TRANSIENT_PROMPT_COMMAND = {|| "🚀 " }
# $env.TRANSIENT_PROMPT_INDICATOR = {|| "" }
# $env.TRANSIENT_PROMPT_INDICATOR_VI_INSERT = {|| "" }
# $env.TRANSIENT_PROMPT_INDICATOR_VI_NORMAL = {|| "" }
# $env.TRANSIENT_PROMPT_MULTILINE_INDICATOR = {|| "" }
# $env.TRANSIENT_PROMPT_COMMAND_RIGHT = {|| "" }
# Specifies how environment variables are:
# - converted from a string to a value on Nushell startup (from_string)
# - converted from a value back to a string when running external commands (to_string)
# Note: The conversions happen *after* config.nu is loaded
$env.ENV_CONVERSIONS = {
"PATH": {
from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
}
"Path": {
from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
}
}
# Directories to search for scripts when calling source or use
# The default for this is $nu.default-config-dir/scripts
$env.NU_LIB_DIRS = [
($nu.default-config-dir | path join 'scripts') # add <nushell-config-dir>/scripts
($nu.data-dir | path join 'completions') # default home for nushell completions
]
# Directories to search for plugin binaries when calling register
# The default for this is $nu.default-config-dir/plugins
$env.NU_PLUGIN_DIRS = [
($nu.default-config-dir | path join 'plugins') # add <nushell-config-dir>/plugins
]
# To add entries to PATH (on Windows you might use Path), you can use the following pattern:
# $env.PATH = ($env.PATH | split row (char esep) | prepend '/some/path')
# An alternate way to add entries to $env.PATH is to use the custom command `path add`
# which is built into the nushell stdlib:
# use std "path add"
# $env.PATH = ($env.PATH | split row (char esep))
# path add /some/path
# path add ($env.CARGO_HOME | path join "bin")
# path add ($env.HOME | path join ".local" "bin")
# $env.PATH = ($env.PATH | uniq)
# To load from a custom file you can use:
# source ($nu.default-config-dir | path join 'custom.nu')

View File

@@ -0,0 +1,4 @@
{{- /* Linux/macOS path: ~/.config/nushell/env.nu */ -}}
{{- if ne .chezmoi.os "windows" -}}
{{- template "nushell/env.nu.tmpl" . -}}
{{- end -}}

View File

@@ -1,16 +0,0 @@
[user]
name = Xevion
email = xevion@xevion.dev
# signingkey = C217005CF3C00672
# [commit]
# gpgsign = true
[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
[core]
editor = micro
[init]
defaultBranch = master

78
home/dot_gitconfig.tmpl Normal file
View File

@@ -0,0 +1,78 @@
# Git Configuration - Platform-aware
# Managed by chezmoi
{{ if or (eq .chezmoi.os "windows") .wsl }}
# Windows/WSL Configuration - Ryan Walters (Professional)
[user]
name = Ryan Walters
email = ryan@walters.to
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
[credential "https://github.com"]
helper =
helper = !'C:\\Program Files\\GitHub CLI\\gh.exe' auth git-credential
[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 }}
# Native Linux/macOS Configuration - Xevion (Personal)
[user]
name = Xevion
email = xevion@xevion.dev
# No GPG signing - no key available for this identity
[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 }}
# 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
[filter.lfs]
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3aVFyd1pUOHpodWRhT1Yv
RUlCYTArQmhoeldId0tsM3BVQTNrcGN4d0hjCldySE1zazkyRWp5T1pMcFFmVTRR
bVlYbmFXT2xJY3R1VVBubmNaOXF6SEUKLS0tIEtab3M3WDhuWTg0dmdZQzNPUFJy
L0VTa1VGYzJLMzAyNUtIWndLb3JaZTAKlgkKjqJKpmQl+HFUvKEt56mUJoUSGRtO
ixZwSV+QuQ1bqZQHuWGQg5NcKz011xoemEnWbwc3sK/2xY1+Dp6B54bsbt8yhbr3
182DS45TuJrNspSs+65dOvUxGdoJaEIlf5XmyfmyFMu9Lvfcc299HKZrSuDuZRoM
xjJGwWnmFDsdniOS7yzC1Y15ptUxGllKSC8E+WWNsAcOmKpodTgruRW9sEn0hSIi
Xor9D1W7W8uoHV3V5WEkTPBBtrTjzwxPjm0MSj9igml1BW22vqt4uDqhWqccJ84X
FU7KJsmUy6KxKSzeGIesWhlR0tdrMshfZLgXECKTVDr5kMVsyi8PKhlX3XKljna8
hiE9G3cm6LNpj9QeDxpNQmrilDk76j9TwK8u1CgGxlInjaRASHFP8d7x7JIxlUi4
59g25VbBVBOeDL9nQcmXssin8gdAcK528aZOKdMTER7tgEqDEeEi4Cc+dzFYMI1X
s62hLXLCAT7rlJHaaUf6zhoXBdQQka2wFLFKH0j1Y0jGM2pwseGOvHRLVWb8Jzty
g0Vd42Tn8JqgkmCZlskB/Q3buScO8SuDKYypvIELtB3Rqw7VQwtcVqX/FjRLUYuE
fXk3Vq5sAY5I6hUH
-----END AGE ENCRYPTED FILE-----

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

@@ -1,9 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQbDd1eVZrc0JTNFhsa0pP
L1Z5aHlFMDUvMEFWMHh3aVRaMXFEZkNpTXk0CmRLbkEzTEdwQVhiQ1VjUzdMV1Z0
Snp4enIvK1dLT3ZYMGY2MVRRYjcxN1EKLS0tIFl2ZmRRR1BHdlRaNEJJalByZXZW
QTdLdVkyZUx5RiszdW0zNUVRTElhbmMKZGlUTMhPLtH6BJjPpcalIXMKJ4k4zBB+
nUXRyTIEEYtVx9HUtJ2aQLtRAg52LWIF3/6yMeXc8/O/blm6sFQmaQky6R8/Itpv
KBSSqzdecdYnyNE517APOU9xQISXUVE1wFOUK1ijOcBc1vnXNBhhhHtPEBC0nuQj
ytwIUYV8dXQSHA==
-----END AGE ENCRYPTED FILE-----

View File

@@ -33,7 +33,6 @@ alias suggest='gh copilot suggest -t shell'
alias spt='spotify_player'
alias gitalias='alias | grep "git "'
alias mousefix='sudo udevadm trigger' # helped with mouse issues on laptop
alias bw_login='export BW_SESSION=$(bw unlock --raw)'
# Clipboard aliases
{{ if not .wsl -}}

View File

@@ -1,28 +1,31 @@
#!/usr/bin/env -S deno run -A
#!/usr/bin/env bun
import { resolve } from "https://deno.land/std/path/mod.ts";
import { exists } from "jsr:@std/fs";
import { exists } from "node:fs/promises";
import { join } from "node:path";
import { $, os } from "npm:zx@8.3.2";
import { homedir } from "node:os";
import { $ } from "bun";
const { exit } = Deno;
const filePath = join(os.homedir(), "key.txt");
// Type-safe wrapper around console.log that prepends [init_pre]
const log = (...args: any[]): void => {
console.log("[init_pre]", ...args);
};
const filePath = join(homedir(), "key.txt");
if (await exists(resolve(filePath))) {
console.log("key.txt already exists");
Deno.exit(0);
if (await exists(filePath)) {
log("key.txt already exists");
process.exit(0);
}
// Acquire the secret from Doppler
const result = await $`doppler secrets get KEY_TXT --plain`;
const result = await $`doppler secrets get KEY_TXT --plain`.quiet();
// Check if the command was successful
if (result.exitCode !== 0) {
console.error("Failed to get secret KEY_TXT");
exit(1);
process.exit(1);
}
// Write the secret to a file
await Deno.writeTextFile(resolve(filePath), result.stdout);
console.log("key.txt bootstrapped");
await Bun.write(filePath, result.stdout);
log("key.txt bootstrapped");

View File

@@ -1,92 +0,0 @@
#!/bin/bash
set -eu
# Flag variables
LATE_FAIL_EXIT=false # Set to true if any installation fails, but only raise an exit at the end
DOPPLER_UNAVAILABLE=false # Set to true if Doppler is not available
apt_update() {
# Only run apt update once
if [ -f /tmp/.apt-updated ]; then
return
fi
sudo apt update >/dev/null
if [ $? -ne 0 ]; then
echo "chezmoi: Critical issue - failed to update apt!"
exit 1
else
touch /tmp/.apt-updated
fi
}
install_age() {
# Test if age is installed
command -v age >/dev/null 2>&1 && return
# Install age
apt_update
sudo apt install age
}
# install_cargo_binstall() {
# # Test if cargo binstall is installed
# cargo binstall --help >/dev/null 2>&1
# if [ $? -eq 0 ]; then
# return
# fi
# curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
# # Test again
# cargo binstall --help
# if [ $? -ne 0 ]; then
# echo "Failed to install cargo binstall"
# exit 1
# fi
# }
install_inotify() {
if ! dpkg -l inotify-tools >/dev/null 2>&1; then
echo "Installing inotify-tools"
apt_update
sudo apt install inotify-tools
fi
}
install_doppler() {
if ! command -v doppler >/dev/null 2>&1; then
echo "You need to install the Doppler CLI manually (for security purposes)."
echo "https://docs.doppler.com/docs/cli#installation"
DOPPLER_UNAVAILABLE=true
LATE_FAIL_EXIT=true
fi
}
require_doppler_login() {
doppler me >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "You need to login to Doppler."
echo "https://docs.doppler.com/docs/cli#logging-in"
fi
}
install_deno() {
if ! command -v deno >/dev/null 2>&1; then
echo "Installing Deno"
curl -fsSL https://deno.land/install.sh | sh
fi
}
install_inotify
install_age
# install_cargo_binstall
if [ $DOPPLER_UNAVAILABLE = false ]; then
install_doppler
fi
if [ $LATE_FAIL_EXIT = true ]; then
echo "chezmoi: Some installation(s) failed. Please fix the issues detailed before trying again."
exit 1
fi

View File

@@ -1,7 +0,0 @@
#!/bin/bash
# chezmoi update --init does not invoke the 'hooks.init.pre' hook, so we do it ourselves
if grep -q 'init' <<<$CHEZMOI_ARGS; then
# CHEZMOI_UPDATE is just a hint in case we need to know if we're updating
CHEZMOI_UPDATE=1 $(dirname $0)/.init_pre.ts
fi

19
home/hooks/.update_pre.ts Executable file
View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bun
// chezmoi update --init does not invoke the 'hooks.init.pre' hook, so we do it ourselves
const chezmoiArgs = process.env.CHEZMOI_ARGS || '';
if (chezmoiArgs.includes('init')) {
// CHEZMOI_UPDATE is just a hint in case we need to know if we're updating
const scriptDir = import.meta.dir;
const initPreScript = `${scriptDir}/.init_pre.ts`;
await Bun.spawn(['bun', initPreScript], {
env: {
...process.env,
CHEZMOI_UPDATE: '1'
},
stdout: 'inherit',
stderr: 'inherit'
});
}

View File

@@ -1,43 +0,0 @@
#!/bin/bash
set -eu
{{/* This script pulls down the OpenVPN-Config.ovpn file. It will do so once per week. */ -}}
FILE=~/.config/ovpn/Local.ovpn
ONE_WEEK=604800
function displaytime {
local T=$1
local D=$((T / 60 / 60 / 24))
local H=$((T / 60 / 60 % 24))
local M=$((T / 60 % 60))
local S=$((T % 60))
(($D > 0)) && printf '%d days ' $D
(($H > 0)) && printf '%d hours ' $H
(($M > 0)) && printf '%d minutes ' $M
(($D > 0 || $H > 0 || $M > 0)) && printf 'and '
printf '%d seconds\n' $S
}
download() {
echo "Downloading OpenVPN-Config.ovpn"
TEMP_FILE=$(mktemp)
if doppler secrets get OPENVPN_CONFIG --plain >> "$TEMP_FILE"; then
mkdir -p "$(dirname "$FILE")"
mv "$TEMP_FILE" "$FILE"
else
echo "Failed to download OpenVPN-Config.ovpn"
fi
}
# Check if file exists
if [ -f "$FILE" ]; then
FILE_ABSOLUTE=$(realpath "$FILE")
RELATIVE_SECONDS=$(expr $EPOCHSECONDS - $(stat -c %Y -- "$FILE_ABSOLUTE"))
if ! test "$RELATIVE_SECONDS" -lt $ONE_WEEK; then
echo "File is older than a week, redownloading (last downloaded $(displaytime $RELATIVE_SECONDS) ago)"
download
fi
else
download
fi

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

@@ -1,6 +0,0 @@
#!/bin/sh
# We just need to have access to the Git repository
cd {{ .chezmoi.sourceDir }}
# The path is relative to the .git/config file
git config --local include.path ../.gitconfig

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
@@ -48,7 +56,7 @@ fi
# Install hishtory
if ! type -P hishtory; then
echo "chezmoi: Installing hishtory"
export HISHTORY_SERVER="https://hsh.{{ .privateDomain }}"
export HISHTORY_SERVER="https://hsh.{{ dopplerProjectJson.PRIVATE_DOMAIN }}"
export HISHTORY_SKIP_INIT_IMPORT='true'
curl https://hishtory.dev/install.py | python3 - --offline --skip-config-modification
fi
@@ -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,4 @@
nodejs 22.11.0
nodejs latest
pnpm latest
zoxide 0.9.6
deno 2.2.2
deno 2.2.2