Go to file
Paul Trowbridge 2f695def41 Add aerial.nvim for document outline
Add aerial.nvim plugin spec with Telescope picker (<leader>O) and
side panel toggle (<leader>o). Extend deploy_nvim in _lib.sh to also
symlink dotfiles/nvim/plugins/ into ~/.config/nvim/lua/plugins/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:35:23 -04:00
dotfiles Add aerial.nvim for document outline 2026-05-10 21:35:23 -04:00
_lib.sh Add aerial.nvim for document outline 2026-05-10 21:35:23 -04:00
.gitignore add .bashrc_paths for machine-specific PATH and tool inits 2026-05-10 02:12:15 -04:00
CLAUDE.md update docs to reflect new scripts and pinned nvim version 2026-05-10 04:46:53 -04:00
install_java_dev.sh improve install scripts with modern practices and transparency 2026-01-17 23:28:44 -05:00
install_neovim.sh pin neovim to v0.11.3 2026-05-10 04:40:38 -04:00
install_node.sh add install_node.sh via nvm 2026-05-10 03:58:26 -04:00
install_nvchad.sh fix nvchad pull using wrong remote name 2026-05-10 03:33:48 -04:00
install_postgres.sh improve install scripts with modern practices and transparency 2026-01-17 23:28:44 -05:00
install_python3.sh add python3-venv for system python (needed by mason) 2026-05-10 03:50:11 -04:00
install_visidata.sh improve install scripts with modern practices and transparency 2026-01-17 23:28:44 -05:00
README.md add what you get section to readme 2026-05-10 04:52:54 -04:00
reinstall_nvchad.sh add reinstall_nvchad.sh 2026-05-10 04:20:30 -04:00
setup_env.sh split into setup_env.sh (fresh install) and sync.sh (day-to-day sync) 2026-05-10 03:13:30 -04:00
sync.sh split into setup_env.sh (fresh install) and sync.sh (day-to-day sync) 2026-05-10 03:13:30 -04:00

setup_env

Personal Linux development environment. Clone once, run one script, get a consistent shell and editor across machines.

Fresh machine

git clone git@gitea.hptrow.me:pt/setup_env.git ~/setup_env
cd ~/setup_env && ./setup_env.sh

setup_env.sh handles everything in order:

  • Installs base packages (tmux, vim, git, fzf, ripgrep, pspg, bat)
  • Downloads and installs Neovim v0.11.3 to /opt/, adds it to .bashrc_paths
  • Clones TPM, Vundle, bash-git-prompt
  • Deploys all dotfile symlinks
  • Clones and sets up NvChad nvim config from gitea

After install:

  • Tmux: press Ctrl-b + I to install TPM plugins
  • Vim: run :PluginInstall to install Vundle plugins
  • Edit dotfiles/.bashrc_local with your real credentials (auto-created from example)
  • Edit dotfiles/.bashrc_paths with PATH additions for tools on this machine (auto-created from example)

Day-to-day sync

cd ~/setup_env && ./sync.sh

Pulls the latest setup_env and nvim config repos, redeploys all symlinks. Safe to run anytime.

Optional installs

Run manually on machines that need them:

./install_postgres.sh      # PostgreSQL from official apt repository
./install_python3.sh       # Latest Python 3 from deadsnakes PPA (includes python3-venv)
./install_node.sh          # Node.js via nvm (needed for prettier formatter in nvim)
./install_java_dev.sh      # SDKMAN for Java development
./install_visidata.sh      # VisiData for terminal data exploration
./reinstall_nvchad.sh      # Wipe and reinstall NvChad from scratch

What you get

Packages

tmux, vim, git, fzf, ripgrep, pspg, bat — installed via apt on fresh setup.

Shell aliases

Alias What it does
ll / la / l Long, all, compact ls
lb lsblk with filesystem info
gs git status -s
ga Interactive git add via fzf
gx Interactive git checkout via fzf
gc git commit -v
gr git reset HEAD
gd git difftool
gl Pretty git log graph
vc git add -u, commit with timestamp, push
td Find unchecked todos with ripgrep
tdp / tdtp Priority todos (🔼 / )
tdo / tdop Open todo in nvim at exact line
tstart / tstop Start/stop time tracking on a todo
treport / tweek Time tracking report / week view
cj cd to journal directory
jr / hc Sync journal / hc notes repos
ons List open nvim swap files in current tree

Database query aliases (requires .bashrc_local vars)

Alias What it does
xnspa([args]) fzf-select open nvim swap file → run via $PG → VisiData (CSV)
xnsp Same → pspg
xns Same → raw output
xmspa() fzf-select swap file → run via $MSC → VisiData (pipe-delimited)
xmsp Same → pspg
xms Same → raw output

Neovim (NvChad)

Plugins:

Plugin Purpose
conform.nvim Formatting (g+w or <leader>fm)
nvim-lspconfig LSP support
nvim-tree File explorer
telescope Fuzzy finder
nvim-treesitter Syntax highlighting
gitsigns Git blame and diff signs
mason Formatter/LSP installer (:MasonInstall <tool>)
obsidian.nvim Obsidian vault integration (skipped if no vaults found)
transparent.nvim Transparent background

Keymaps:

Key What it does
g+w / <leader>fm Format file
<leader>gb Git blame
<leader>ts Start time tracking on todo under cursor
<leader>tp Stop time tracking
<leader>tr Time report float
<leader>tw Time week float

Prompt

bash-git-prompt — shows branch, dirty state, ahead/behind in the shell prompt (only inside git repos).


Dotfile deployment

All config files are symlinked, not copied — editing ~/.<file> edits the repo file directly. git status always shows config drift.

Source Deployed to Notes
dotfiles/.bashrc ~/.bashrc Main shell config
dotfiles/.bashrc_local ~/.bashrc_local Secrets/credentials — gitignored
dotfiles/.bashrc_paths ~/.bashrc_paths PATH and tool inits — gitignored
dotfiles/.vimrc, .gitconfig, .tmux.conf, etc. ~/<filename> Standard dotfiles
dotfiles/bin/* ~/.local/bin/<name> Executable scripts
dotfiles/nvim/*.lua ~/.config/nvim/lua/<name> Nvim lua modules

When a tool appends lines to .bashrc, git status shows the modification — move those lines to .bashrc_paths instead.

Machine-specific config

Two gitignored files sourced by .bashrc, auto-bootstrapped from examples on first run:

  • .bashrc_local — DB connection strings, passwords, tokens
  • .bashrc_paths — PATH additions (nvim, cargo, nvm, java, etc.)

td — markdown todo time tracking

Track time on markdown todos identified by a block-ref ^tid-*. Data lives in time.csv at the vault root.

Surfaces

Surface Location How to use
CLI bin/td~/.local/bin/td command td <subcommand>
Shell wrappers .bashrc tstart, tstop, treport, tweek
Nvim nvim/td.lua + nvim/td_mappings.lua <leader>ts/tp/tr/tw or :TdStart/Stop/Report/Week

Subcommands

Command What it does
td start <tid> [--file PATH] [--desc TEXT] Start timer, auto-stops any running entry
td stop Close the open entry
td report [filter] Total time per tid (filter matches tid or file)
td week [--since DATE] Tasks from git log joined with time data
td current Print the currently-running tid
td tidgen Generate a fresh tid

How td week works

Scans git log -p from cwd, pairs -/+ task-line diffs within each commit by tid:

  • [x] done- [ ]- [x] transition
  • [ ] new — added - [ ] line with a fresh tid
  • [+] done+new — created and completed in the same commit
  • [o] reopen- [x]- [ ] transition

Nvim integration

<leader>ts on a - [ ] line auto-generates a ^tid-* block ref if missing, saves the buffer, and starts the timer. <leader>tp stops, <leader>tr shows a report float, <leader>tw shows the week float. Close floats with q or <Esc>.

Gotchas

  • td alone is aliased to rg for todo-grepping. Use tweek, treport etc. or command td to reach the CLI directly.
  • CSV is cwd-scoped. Run subcommands from the vault root. The nvim wrapper walks up to find it; shell wrappers trust your cwd.
  • Data-model changes go in bin/td. Shell and nvim surfaces stay thin wrappers.