diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..8d966c4 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,134 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Repository Overview + +This is a personal development environment setup repository containing: +- Shell scripts for automated installation of development tools +- Dotfiles for bash, vim, tmux, git, psql, and pspg +- The main `setup_env.sh` script deploys dotfiles as symlinks and installs base packages + +## Key Commands + +### Environment Setup +```bash +# Initial setup - installs packages, plugin managers, and creates symlinks +./setup_env.sh + +# Individual tool installations +./install_postgres.sh # PostgreSQL from official apt repository +./install_python3.sh # Latest Python 3 from deadsnakes PPA +./install_java_dev.sh # SDKMAN for Java development +./install_neovim.sh # Latest Neovim release, extracted to /opt/ +./install_nvchad.sh # NvChad Neovim config +./install_visidata.sh # VisiData for terminal data exploration +``` + +After running `setup_env.sh`, activate plugins: +- **Tmux**: Press `prefix + I` (Ctrl-b + I) to install TPM plugins +- **Vim**: Run `:PluginInstall` inside vim to install Vundle plugins + +### Git Operations +```bash +# Automated commit and push (defined in .bashrc) +vc # git add . && commit with timestamp && push + +# Custom git aliases (defined in .gitconfig) +git pushall # Push to all remotes +``` + +## Architecture + +### Dotfile Management System +The repository uses **symlink-based configuration deployment**. When `setup_env.sh` runs: +1. `deploy_configs` symlinks each dotfile in `dotfiles/` to `~/.` (backing up any existing file) +2. `deploy_bin` symlinks every file in `dotfiles/bin/` to `~/.local/bin/` +3. This allows version control of configs and user-local scripts while keeping them in their expected locations + +All dotfiles are symlinked, not copied. Editing `~/.` directly modifies files in the repository. + +**Critical Files:** +- `dotfiles/.bashrc` - Main bash configuration with extensive aliases and functions +- `dotfiles/.bashrc_local` - Machine-specific environment variables (PG, MS connection strings) +- `dotfiles/.bashrc_local_example` - Template for setting up machine-specific configs +- `dotfiles/.vimrc` - Vim configuration using Vundle plugin manager +- `dotfiles/.tmux.conf` - Tmux configuration with vim-style pane navigation +- `dotfiles/.gitconfig` - Git configuration with custom log format and vimdiff +- `dotfiles/.psqlrc` - PostgreSQL client configuration +- `dotfiles/.pspgconf` - pspg (PostgreSQL pager) configuration +- `dotfiles/bin/td` - Python CLI for time-tracking markdown todos (see Time tracking section) + +### Custom Bash Workflow + +**Database Query Management:** + +PostgreSQL workflow: +- `xnspa()` function - Interactive file selector for running PostgreSQL queries through nvim swap files, outputs to VisiData as CSV. Accepts extra psql args (e.g. `xnspa -v var=val`). +- `xnsp` - Select and execute SQL file through fzf with pspg output +- `xns` - Select and execute SQL file through fzf +- `PG` environment variable - psql connection string to database (defined in `.bashrc_local`) + +SQL Server workflow: +- `xmspa()` function - Interactive file selector for SQL Server queries through nvim swap files, outputs to VisiData with pipe-delimited format +- `xmsp` - Select SQL file via fzf, execute with sqlcmd, pipe to pspg +- `xms` - Select SQL file via fzf, execute with sqlcmd +- `MS` environment variable - sqlcmd connection string to SQL Server (defined in `.bashrc_local`) +- `MSC` environment variable - sqlcmd connection string with pipe-delimited output format (defined in `.bashrc_local`) +- `MSW` environment variable - Windows sqlcmd connection (optional, defined in `.bashrc_local`) + +General: +- `ons` - List open nvim files in current directory tree + +**Git workflow aliases:** +- `gs` - git status short format +- `ga` - Interactive git add using fzf for file selection +- `gx` - Interactive git checkout using fzf +- `gr` - git reset HEAD +- `gc` - git commit verbose +- `gd` - git difftool +- `gl` - Pretty git log with colors + +**Todo grep aliases (rg-based):** +- `td` - Find unchecked todo items using ripgrep +- `tdp` - Find priority todos (with 🔼 or ⏫) +- `tdtp` - Find top priority todos (⏫ only) +- `tdo` - Open todo in nvim at exact line +- `tdop` - Open priority todo in nvim at exact line + +**Time tracking (functions wrapping `dotfiles/bin/td`):** +- `tstart ` - Start a timer on a task identified by a `^tid-*` block-ref +- `tstop` - Stop the running timer +- `treport [filter]` - Show totals per tid, filterable by tid or filename +- `tweek [filter]` - Show this week's time summary +- Wrappers use `command td` to bypass the `td` rg alias. The CLI writes one row per entry to `$TD_LOG` (default `./time.csv`, cwd-scoped). +- Companion nvim integration (in the separate `~/.config/nvim` repo) adds `ts/tp/tr` keymaps with auto-generated tids. + +**Other useful aliases:** +- `nv` - Launch Neovim from custom installation path +- `cj` - Navigate to journal directory +- `jr` - Journal sync (pull, commit, push) +- `hc` - hc companies notes sync (pull, push) + +### Plugin Managers +- **Vim**: Vundle (installed to `~/.vim/bundle/Vundle.vim`) +- **Tmux**: TPM - Tmux Plugin Manager (installed to `~/.tmux/plugins/tpm`) + - Plugins: tmux-resurrect, jimeh/tmux-themepack +- **Bash**: bash-git-prompt (installed to `~/.bash-git-prompt`) + +### Package Dependencies +Base packages installed by `setup_env.sh`: +- tmux, vim, git, pspg, bat, fzf, ripgrep + +## Important Conventions + +### Environment Variables +Machine-specific environment variables (database connections, tokens, passwords) belong in `dotfiles/.bashrc_local`, not `.bashrc`. This file is sourced by `.bashrc` and should contain sensitive or machine-specific configuration. + +The `.bashrc_local` file is gitignored for security. Use `dotfiles/.bashrc_local_example` as a template when setting up a new machine. Copy it to `.bashrc_local` and fill in your actual credentials. + +### Symlink Pattern +When modifying dotfiles, remember they are symlinked. Changes are automatically tracked by git since the actual files are in the repository's `dotfiles/` directory. + +### Git Commit Messages +This repository uses simple lowercase commit messages describing the change (e.g., "add cargo", "visidata", "install sdkman"). diff --git a/dotfiles/.bashrc b/dotfiles/.bashrc index aefb2cb..0ce82d0 100644 --- a/dotfiles/.bashrc +++ b/dotfiles/.bashrc @@ -102,17 +102,37 @@ alias opg="lsof 2>/dev/null +D . | grep 'pg.*swp$' | awk '{print \$9}' | sed 's/ alias osw="lsof 2>/dev/null +D . | awk '\$NF ~ /swp$/ {print \$9}' | sed 's/\.swp//g' | sed 's/\/\./\//g'" alias xpg="lsof 2>/dev/null +D . | grep 'pg.*swp$' | awk '{print \$9}' | sed 's/\.swp//g' | sed 's/\/\./\//g' | xargs -r $PG -f" alias xsw="lsof 2>/dev/null +D . | grep '.*swp$' | awk '{print \$9}' | sed 's/\.swp//g' | sed 's/\/\./\//g' | xargs -r $PG -f" -alias ons='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd)"' -alias xns='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | sed "s/\\.swo$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $PG -f %' -alias xnsp='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | sed "s/\\.swo$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $PG -f % | pspg' +alias ons='lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v "lsof:" | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd)"' +alias xns='lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v "lsof:" | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | sed "s/\\.swo$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $PG -f %' +alias xnsp='lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v "lsof:" | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | sed "s/\\.swo$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $PG -f % | pspg' # alias xnspa='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | sed "s/\\.swo$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $PG -f % --csv | vd - > /dev/null 2>&1' #alias xnsp='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd)" | fzf | xargs -I % $PG -f % | pspg' alias mns='fzf | xargs -I {} sqlcmd -U Pricing -S mid-sql02 -C -i {} | pspg' -alias xmsp='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $MS -i % | pspg' -alias xms='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $MSW -i % ' +alias xmsp='lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v "lsof:" | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $MS -i % | pspg' +alias xms='lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v "lsof:" | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $MSW -i % ' # alias xmspa='lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd | sed "s|^//|/|")" | fzf | xargs -I % $MSC -i % | vd -f csv -' # alias xmspa='selected_file=$(lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd)" | fzf) && [ -n "$selected_file" ] && $MSC -i "$selected_file" | vd -f csv -' -alias xmspa='selected_file=$(lsof +D ~/.local/state/nvim/swap/ | grep -o "/swap/.*" | cut -c 7- | tr "%" "/" | sed "s/\\.swp$//" | grep "$(pwd)" | fzf) && [ -n "$selected_file" ] && $MSC -i "$selected_file" | sed "2d" | vd -d "|" - > /dev/null 2>&1' +xmspa() { + local file + + file=$( + lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v 'lsof:' | + grep -o "/swap/.*" | + sed 's|^/swap/||' | + tr "%" "/" | + sed -E 's/\.sw[op]$//' | + grep "$(pwd | sed 's|^//|/|')" | + fzf + ) || return + + [[ -z "$file" ]] && return + + eval "$MSC" \ + -i "$file" | + sed "2d" | + vd -d "|" - > /dev/null 2>&1 +} + alias nv='~/nvim-linux64/bin/nvim' alias gs='git status -s' alias ga='git status --untracked-files=all -s | fzf -m | awk "{print \$2}" | xargs git add ' @@ -123,6 +143,14 @@ alias tdtp='rg "\- \[[^(x|~)]\].*⏫"' # alias tdo='rg "\- \[[^x]\]" | fzf | xargs nvim' alias tdo='rg "\- \[[^(x|~)]\]" --line-number | fzf | awk -F: "{print \$1, \"+\"\$2}" | xargs -r nvim' alias tdop='rg "\- \[[^(x|~)]\].*(🔼|⏫)" --line-number | fzf | awk -F: "{print \$1, \"+\"\$2}" | xargs -r nvim' + +# time-track markdown todos — see `command td --help`. Log at $TD_LOG (default ./time.csv) +# `command td` bypasses the `td` alias (which is rg for finding todos). +tstart() { command td start "$@"; } +tstop() { command td stop; } +treport() { command td report "$@"; } +tweek() { command td week "$@"; } + alias gr='git reset HEAD' alias gc='git commit -v' alias gd='git difftool' @@ -133,9 +161,10 @@ alias hc='cd ~/storage/shared/Documents/hc_notes/ && git pull && git push && cd xnspa() { local file + local db_args="$*" file=$( - lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | + lsof +D ~/.local/state/nvim/swap/ 2>/dev/null | grep -v 'lsof:' | grep -o "/swap/.*" | sed 's|^/swap/||' | tr "%" "/" | @@ -151,8 +180,8 @@ xnspa() { -q \ --csv \ --pset footer=off \ - -f "$file" | - vd - + $db_args \ + -f "$file" | vd - } @@ -195,5 +224,9 @@ fi bind 'set bell-style none' -[ -f ~/dot_config/.bashrc_local ] && source ~/dot_config/.bashrc_local +[ -f ~/setup_env/dotfiles/.bashrc_local ] && source ~/setup_env/dotfiles/.bashrc_local export PATH=$PATH:~/lua-language-server/bin +[ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" + +# opencode +export PATH=/home/pt/.opencode/bin:$PATH diff --git a/dotfiles/.gitconfig b/dotfiles/.gitconfig index 514f8cf..1343e34 100644 --- a/dotfiles/.gitconfig +++ b/dotfiles/.gitconfig @@ -24,5 +24,9 @@ directory = /etc/postgresql/15/main directory = /storage/emulated/0/Documents/journal directory = /storage/emulated/0/Documents/hc_notes + directory = /opt/tps + directory = /etc/ngin + directory = /etc/nginx + directory = /etc/postgresql/18/prod [pull] rebase = false