Created
January 18, 2026 14:31
-
-
Save ejfox/36c37cb4a9ae4bb3e18fe0b4636eedde to your computer and use it in GitHub Desktop.
EJ Fox tips.txt - complete dotfiles cheatsheet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| n - (zsh) browse current directory with oil.nvim | |
| vs - (zsh) fuzzy find files with bat preview | |
| vg - (zsh) grep file contents and jump to matching lines | |
| o - (zsh) instantly access Obsidian vault (sorted by recency) | |
| r - (zsh) recent files across ALL ~/code projects | |
| tips - (zsh) search this cheatsheet with fzf | |
| note <text> - (zsh) quick capture to Obsidian inbox.md | |
| yy - (zsh) re-run last command and copy its output | |
| ask <question> - (zsh) ask LLM about clipboard contents (e.g. "ask what does this do") | |
| explain - (zsh) re-run last command, pipe output to LLM for explanation | |
| ding - (zsh) macOS notification + sound (use: long_command; ding) | |
| gist - (zsh) create GitHub gist from clipboard (gist filename.py "description") | |
| (nvim/oil) delete a line to delete a file, edit a line to rename it | |
| (nvim/oil) visual select multiple files, :d to delete them all | |
| (nvim/oil) g. - toggle hidden files | |
| (nvim/oil) C-p - preview file without opening | |
| (nvim/oil) gx - open file with external program | |
| (nvim/oil) _ - jump to cwd (current working directory) | |
| (tmux) C-a g - lazygit popup (floats over panes) | |
| (tmux) C-a K - yazi file manager popup | |
| (tmux) C-a ? - THIS CHEATSHEET (searchable popup) | |
| (tmux) C-a S - scratch terminal toggle (persistent) | |
| (tmux) C-a F - tmux-fzf launcher (interactive search for sessions/windows/panes) | |
| (tmux) C-\ - tmux-menus (visual TUI for all tmux functions) | |
| (tmux) C-a C-y - yank entire pane scrollback to clipboard | |
| (tmux) C-a M-y - yank last 200 lines to clipboard | |
| (tmux) M-c - INSTANT copy entire pane (no prefix!) | |
| (tmux) M-C - INSTANT copy last pane you were in | |
| (tmux) M-v - INSTANT copy visible portion only | |
| (tmux) C-a e - open visible pane in nvim (searchable) | |
| (tmux) C-a E - open entire scrollback in nvim | |
| (tmux) C-a P - capture pane to tmux buffer (then C-a ] to paste elsewhere) | |
| (tmux) C-a N - quick note prompt → appends to Obsidian inbox.md | |
| (tmux) C-a Space - enter copy mode (easier than C-a [, use v to select, y to yank) | |
| (tmux) Shift+Left/Right - previous/next window (NO PREFIX! huge time saver) | |
| (tmux) C-a > - swap pane down | |
| (tmux) C-a < - swap pane up | |
| (tmux) C-a H/J/K/L - resize pane left/down/up/right | |
| (tmux) C-a q - display pane numbers (press number to select) | |
| (tmux) C-a z - zoom/fullscreen current pane (toggle) | |
| (tmux) C-a ! - break pane into new window | |
| (tmux) C-a m - mark pane (for swapping/joining later) | |
| (tmux) right-click pane - context menu (mark, swap, split, kill, zoom) | |
| (tmux) M-1 through M-9 - select pane by number | |
| (tmux) M-h/M-l - previous/next window | |
| (tmux) C-a w - choose window tree view (visual session/window picker) | |
| (tmux) C-a C-c - create new session | |
| (tmux) C-a C-f - find and switch to session by name | |
| (tmux) C-a Z - zen mode toggle | |
| (tmux) status bar shows ◼ when prefix is active | |
| (nvim/tmux) C-h/j/k/l - seamless navigation between nvim splits AND tmux panes | |
| (nvim) gai - incoming calls (who calls this function) | |
| (nvim) gao - outgoing calls (what does this function call) | |
| (nvim) <leader>ss - document symbols (outline of current file) | |
| (nvim) <leader>sS - workspace symbols (search symbols across project) | |
| (nvim) <leader>Z - zen mode toggle (distraction-free writing) | |
| (nvim/telescope) C-_ - opens file in vertical split | |
| (nvim/telescope) <c-d> in buffer picker - delete buffer | |
| (nvim/dap) <leader>db - toggle breakpoint | |
| (nvim/dap) <leader>dc - start/continue debugging | |
| (nvim/dap) <leader>du - toggle debug UI | |
| (nvim/kulala) Enter in .http files - execute request | |
| (nvim/surround) ysiw" - surround inner word with quotes | |
| (nvim/surround) yss) - surround entire line with parentheses | |
| (nvim/surround) ds" - delete surrounding quotes | |
| (nvim/surround) cs"' - change surrounding quotes to single quotes | |
| (nvim/surround) S in visual mode - surround selection | |
| (nvim/surround) dst - delete surrounding HTML tag | |
| (nvim/git-conflict) co - choose ours (current branch) | |
| (nvim/git-conflict) ct - choose theirs (incoming) | |
| (nvim/git-conflict) cb - choose both | |
| (nvim/git-conflict) c0 - choose none | |
| (nvim/git-conflict) [x / ]x - jump between conflicts | |
| (zsh) commit - LLM-generated commit messages with fzf selection | |
| (zsh) ghpub <name> - create public GitHub repo and push | |
| (zsh) ?? - llm CLI help | |
| (zsh) pbjson - pretty-print JSON from clipboard | |
| (zsh) jcurl <url> - curl URL and pretty-print JSON | |
| (zsh) catcopy - cat file and copy to clipboard | |
| (zsh) showcase - open code showcase with clipboard content | |
| (zsh) uvi <tool> - install Python CLI tool | |
| (zsh) uvr <file> - run Python file in isolated env | |
| (zsh) uvs - sync dependencies | |
| (zsh) uvx <tool> - run tool without installing | |
| (zsh) fixit - auto-fix Python environment issues | |
| (zsh) fuckit - nuke .venv and __pycache__, start fresh | |
| (zsh) nukeyarn - remove yarn.lock and node_modules | |
| (zsh) z <partial> - jump to frequently used directory | |
| (nvim) mA - set GLOBAL mark (works across files!) | |
| (nvim) 'A - jump to global mark A | |
| (nvim) g; - jump to last change location | |
| (nvim) g, - jump to next change location | |
| (nvim) `. - jump to last change (exact position) | |
| (nvim) ci" - change inside quotes (also works with ', `, (, [, {, <) | |
| (nvim) da" - delete around quotes (including quotes) | |
| (nvim) =i{ - auto-indent inside braces | |
| (nvim) gg=G - auto-indent entire file | |
| (nvim/treesitter) C-space - EXPAND selection to parent AST node (keep pressing!) | |
| (nvim/treesitter) BS - SHRINK selection back down (in visual mode) | |
| (nvim/treesitter) vaf/daf/yaf - select/delete/yank AROUND function | |
| (nvim/treesitter) vif/dif/yif - select/delete/yank INSIDE function | |
| (nvim/treesitter) vat/dat - select/delete around HTML tag (whole element) | |
| (nvim/treesitter) vit/dit - select/delete inside tag (just contents) | |
| (nvim/treesitter) vaa/via - select around/inside argument (function params) | |
| (motorcycle) C-space is semantic zoom - not lines, not chars, MEANING | |
| (nvim/telescope) <leader>fk - search all keymaps/keybindings | |
| (nvim/telescope) <leader>fo - oldfiles (recent files) | |
| (nvim/telescope) <leader>fm - jump to bookmarks/marks | |
| (nvim/telescope) <leader>fr - see all registers content | |
| (nvim/telescope) <leader>fj - navigate jump history | |
| (nvim/yanky) <leader>p - cycle through yank history | |
| (nvim/yanky) deleted something then copied? <leader>p gets it back | |
| (tmux) C-a [ or C-a Space - enter copy mode (Space is easier!) | |
| (tmux/copy-mode) v - start selection | |
| (tmux/copy-mode) y - yank selection to clipboard and exit | |
| (tmux/copy-mode) C-v - rectangle/block selection (select columns) | |
| (tmux/copy-mode) / - search forward | |
| (tmux/copy-mode) ? - search backward | |
| (tmux/copy-mode) g - go to top of scrollback | |
| (tmux/copy-mode) G - go to bottom | |
| (tmux/copy-mode) C-u / C-d - half page up/down | |
| (tmux/copy-mode) Escape - cancel and exit | |
| (git) git worktree add ../feature-name feature-branch - work on multiple branches simultaneously | |
| (git) git worktree list - see all active worktrees | |
| (git) git worktree remove ../feature-name - remove worktree | |
| (git) worktrees: work on PR in one pane, develop in another, no stashing | |
| (zsh) cl - claude --dangerously-skip-permissions | |
| (zsh) cln - claude --no-approval (maximum velocity) | |
| (zsh) clc - claude commit (AI writes your git messages) | |
| (zsh) ta or t0 - instantly attach to tmux session 0 | |
| (zsh) nrd - npm run dev | |
| (zsh) nred - npm run electron:dev | |
| (zsh) yy - yalc commands without the npx dance | |
| (zsh) ..2 - go up two directories | |
| (zsh) ..3 - go up three directories | |
| (sketchybar) CIPHER coach shows when no calendar events in next 4 hours | |
| (nvim) capital letter marks (mA) are GLOBAL across files, lowercase (ma) are file-local | |
| (nvim/oil) - opens oil (parent dir) | |
| (lazygit) space = stage, c = commit, P = push, ? = help | |
| (yazi) enter = open, space = select, . = hidden, z = frecency jump | |
| (nvim) space u w - toggle wrap | |
| (nvim) space u l - line numbers | |
| (nvim) space u L - relative numbers | |
| (nvim) space u s - spell check | |
| (nvim) space u d - toggle diagnostic virtual text | |
| (nvim) space u h - inlay hints | |
| (nvim) space u f - format on save | |
| (nvim) space u b - dark/light toggle | |
| (nvim) space u g - git signs | |
| (nvim) space u i - indent guides | |
| (nvim) gd - jump to definition | |
| (nvim) gr - find all references | |
| (nvim) K - hover docs | |
| (nvim) space c a - code action | |
| (nvim) space c r - rename symbol across all files | |
| (nvim) space f f - find files | |
| (nvim) space f g - live grep | |
| (nvim) space f b - list open buffers | |
| (nvim) space f r - recent files | |
| (nvim) space e - toggle file tree sidebar | |
| (nvim) space g g - lazygit | |
| (nvim) space x x - list all errors/warnings in project | |
| (nvim) space s s - jump to functions/classes in current file | |
| (nvim) ]d / [d - next/prev diagnostic | |
| (nvim) ]] / [[ - next/prev function | |
| (nvim) gcc - comment line | |
| (nvim) gc - comment selection | |
| (nvim) za - toggle fold | |
| (nvim) zR - open all folds | |
| (nvim) zM - close all folds | |
| (nvim) ctrl-o - jump back | |
| (nvim) ctrl-i - jump forward | |
| (nvim) * - search word under cursor | |
| (nvim) # - search backwards | |
| (nvim) ciw - change word | |
| (nvim) diw - delete word | |
| (nvim) yiw - yank word | |
| (nvim) vi" - select in quotes | |
| (nvim) va" - select around quotes | |
| (nvim) dt. - delete to period | |
| (nvim) ct, - change to comma | |
| (nvim) f( - find next ( | |
| (nvim) ; - repeat f/t motion | |
| (nvim) . - repeat last change | |
| (nvim) u - undo | |
| (nvim) ctrl-r - redo | |
| (nvim) ZZ - save and quit | |
| (nvim) ZQ - quit without saving | |
| (nvim) space b d - close buffer | |
| (nvim) space b o - close other buffers | |
| (nvim) ]b / [b - next/prev buffer | |
| (nvim) space , - switch buffer | |
| (nvim) ctrl-h/j/k/l - move between splits and tmux panes | |
| (nvim) space w d - close window | |
| (nvim) space w - - split below | |
| (nvim) space w | - split right | |
| (nvim) :%s/old/new/g - replace all | |
| (nvim) n / N - next/prev match | |
| (nvim) space / - grep project | |
| (nvim) ]h / [h - next/prev git hunk | |
| (nvim) space g s - stage hunk | |
| (nvim) space g r - reset hunk | |
| (nvim) space g p - preview hunk | |
| (nvim) space g b - git blame line | |
| (nvim/copilot) Tab - accept ghost text suggestion | |
| (nvim/copilot) ]s - next AI suggestion | |
| (nvim/copilot) [s - prev AI suggestion | |
| (nvim/copilot) C-Right - accept one word | |
| (nvim/copilot) C-l - accept one line | |
| (nvim/copilot) C-] - dismiss suggestion | |
| (nvim/copilot) M-Enter - open panel (browse 3 suggestions) | |
| (nvim/diffview) space g d - open git diff view (review Claude Code changes) | |
| (nvim/diffview) space g h - file history for current file | |
| (nvim/diffview) space g c - close diffview | |
| (nvim/diffview) ]c / [c - jump between changes in diff | |
| (nvim/diffview) Tab - cycle through files in diff | |
| (nvim/diffview) do - obtain (accept) change from other side | |
| (nvim/diffview) dp - put (apply) change to other side | |
| (nvim/claude) space y r - yank selection with relative path (paste in Claude Code) | |
| (nvim/claude) space y a - yank selection with absolute path | |
| (nvim/hotreload) files auto-reload when Claude Code edits them | |
| (nvim/hotreload) won't reload if you have unsaved changes (safe!) | |
| (nvim/hotreload) diffview auto-refreshes when Claude Code commits | |
| (nvim/telescope) ctrl-q - send results to quickfix | |
| (nvim/telescope) tab - select multiple | |
| (nvim/telescope) ctrl-x - open in split | |
| (nvim/telescope) ctrl-v - open in vsplit | |
| (nvim) space f t - float terminal | |
| (nvim) ctrl-\ - toggle terminal | |
| (nvim) J - join lines | |
| (nvim) ~ - swap case | |
| (nvim) gu - lowercase selection | |
| (nvim) gU - UPPERCASE selection | |
| (nvim) > / < - indent/dedent selection | |
| (nvim) ctrl-a - increment number | |
| (nvim) ctrl-x - decrement number | |
| (zsh) opin - sign into 1Password | |
| (zsh) opget "Item" password - grab password from any item | |
| (zsh) opget "Item" username - grab username | |
| (zsh) opcp "Item" - copy password to clipboard | |
| (zsh) opfzf - browse all items with fzf preview | |
| (zsh) oplist - fuzzy search item names | |
| (zsh) vpsdb - connect to VPS PostgreSQL (creds from 1Password) | |
| (zsh) pgop "Item Name" - connect to PostgreSQL using 1Password creds | |
| (zsh) openv "Item" - export all fields as ENV vars | |
| (zsh) opsavedb "Title" host user pass - save new DB creds to 1Password | |
| (1p) op read "op://Vault/Item/field" - read secret in scripts | |
| (1p) op inject -i .env.template -o .env - inject secrets into templates | |
| (1p) op run --env-file=.env.op -- npm start - inject secrets for any command | |
| (1p) op item get "Item" --format=json | jq - full item as JSON | |
| (combo) tailscale up && vpsdb - connect to VPS db over tailnet securely | |
| (combo) store tailscale hostnames in 1Password (names don't change, IPs do) | |
| (zsh) vps - connects with mosh (auto-installs on first run) | |
| (zsh) vpsreconnect - respawn pane with reconnect | |
| (zsh) sshkeepalive <host> - auto-reconnect loop | |
| (tmux) C-a R - respawn pane (instant reconnect) | |
| (ssh) ControlMaster multiplexes connections (instant subsequent connects) | |
| (mosh) survives: laptop sleep, wifi changes, IP changes, network drops | |
| (wisdom) never echo passwords to terminal, use opcp instead | |
| (wisdom) .env files are for non-secrets, 1Password is for secrets | |
| (wisdom) connection strings > individual fields (one copy-paste to connect) | |
| (vibe) you're building something cool right now | |
| (vibe) take a breath, stretch your wrists | |
| (vibe) small commits > big commits | |
| (vibe) if it works, ship it | |
| (vibe) future you will thank present you for that comment | |
| (vibe) the bug is always where you're not looking | |
| (vibe) cmd+shift+r to reload ghostty shaders | |
| (vibe) have you pushed your work lately? | |
| (vibe) drink water | |
| (vibe) the best code is the code you delete | |
| (workflow) nvim left pane (manual coding) + Claude Code right pane (big refactors) | |
| (workflow) Tab accepts ghost text, ]s cycles suggestions, space g d reviews changes | |
| (workflow) select code, space y r, paste in Claude Code (it knows the file!) | |
| (reading) the professional concentrates on the work and allows rewards to come or not come | |
| (reading) the most important thing about art is to work. nothing else matters except sitting down every day and trying | |
| (reading) when we sit down and work, we become like a magnetized rod that attracts iron filings | |
| (reading) the more important a call is to our soul's evolution, the more Resistance we will feel | |
| (reading) who knows doesn't talk. who talks doesn't know. | |
| (reading) to live till you die is to live long enough. | |
| (reading) noise is any pattern we don't understand. | |
| (reading) life doesn't happen along interstates. it's against the law. | |
| (reading) ego stories come naturally because uncertainty is frightening. | |
| (reading) the love that lasts the longest is the love that is never returned. | |
| (reading) the first line of attack in this campaign was poetry. | |
| (reading) be broken to be whole. | |
| (reading) bullshit is not a modern invention. | |
| (reading) living people are soft and tender. | |
| (reading) the five colors blind our eyes. | |
| (reading) true goodness is like water. | |
| (reading) thoughts happen to us. | |
| (reading) study the hard while it's easy. | |
| (reading) well planted is not uprooted, well kept is not lost. | |
| (reading) the wind plays the world like an instrument. | |
| (reading) not everyone wants to get better. | |
| (reading) by intention, everyone would be in one another's way. | |
| (reading) in some ways, my moods did and did not exist. | |
| (reading) today mankind is locked into stealing ravenously from the future. | |
| (reading) their lack of planning does not make it your emergency. | |
| (reading) to run things, be undiplomatic. | |
| (reading) the wise person acts but does not take credit. | |
| (reading) we can't actually be aware unless we pay attention. | |
| (reading) the professional cannot live like that. he is on a mission. | |
| (strudel.nvim) :StrudelLaunch - opens Strudel in browser, syncs with current buffer | |
| (strudel.nvim) :StrudelToggle - play/stop playback | |
| (strudel.nvim) :StrudelUpdate - evaluate/update code (hear changes without stopping) | |
| (strudel.nvim) :StrudelQuit - close browser session | |
| (strudel.nvim) edit in nvim OR browser - changes sync both ways automatically | |
| (strudel.nvim) cursor syncs in real-time between nvim and browser | |
| (strudel.nvim) evaluation errors show as nvim notifications | |
| (strudel.nvim) works with .str and .std file extensions | |
| (strudel.nvim) hydra integration - live code visuals from nvim | |
| (strudel.nvim) uses Puppeteer + Chromium for browser automation | |
| (strudel.nvim) prereqs: neovim 0.9+, node 16+, chromium-based browser | |
| (strudel.nvim) install: { "gruvw/strudel.nvim", build = "npm ci", config = function() require("strudel").setup() end } | |
| (strudel.nvim) github: https://github.com/gruvw/strudel.nvim | |
| (obs) obs print <file> - get note content from Obsidian vault | |
| (obs) obs search <term> - fuzzy search vault note titles | |
| (obs) obs content <term> - search within note contents | |
| (obs) obs export-ready - bulk export notes from year folders (not /drafts/) | |
| (obs) obs export-by-tag <tag> - export all notes with specific tag | |
| (obs) obs tags - list all tags in vault with frequency count | |
| (obs) obs daily - create or open today's daily note | |
| (obs) obs open <file> - open note in Obsidian GUI | |
| (pub) pub status - full publishing dashboard (vault stats, site health, git status) | |
| (pub) pub import - run import pipeline (Obsidian → website2) | |
| (pub) pub watch - watch vault for changes and auto-import to website2 | |
| (pub) pub publish - full workflow: import → build → git push | |
| (pub) pub preview <type> - preview posts by type (blog, robot, weeknote) | |
| (pub) pub info <file> - show metadata for a file | |
| (obsidian) export-ready = notes in year folders (2025/, 2024/), NOT in /drafts/ | |
| (obsidian) location-based = simple to understand, enforces workflow | |
| (obsidian) hotkeys/plugins/css are symlinked to ~/.dotfiles/.obsidian-config/ (git-controlled) | |
| (obsidian) any keybind changes auto-version-control in dotfiles | |
| (obsidian) obs/pub commands bridge Obsidian ↔ website2 publishing pipeline | |
| (workflow) write in Obsidian → obs print to preview → pub publish to deploy | |
| (workflow) pub status shows everything: vault, git, site health, response times | |
| (vibe) Obsidian is your brain. Website2 is your voice. Keep them in sync. | |
| (vibe) small changes ship instantly with pub watch | |
| (vibe) nothing is lost - everything versions in git | |
| (pipeline) scrap list -limit 20 | jq -r '.[].content' | llm "Synthesize into key insights" - process scraps with AI | |
| (pipeline) obs print "drafts/idea.md" | llm -s "Expand into 3 angles" | scrap save --title "Expanded" - enhance notes with Claude | |
| (pipeline) scraps --tag "research" | jq -r '.[].content' | llm "Create blog outline" | obs create "blog/outline.md" - scrap → article | |
| (pipeline) obs print "blog/*.md" | while read f; do llm -s "Quality 1-10?"; done - batch quality check all drafts | |
| (pipeline) pub status && obs search "status:ready" | llm "Which should I publish first?" - AI-powered priority queue | |
| (pipeline) scraps | jq -r '.[].tags[]' | sort -u | while read tag; do obs tags | grep -q "$tag" || echo "Gap: $tag"; done - find content gaps | |
| (pipeline) find ~/.obsidian/robots -name "*.md" -mtime -7 | xargs -I {} obs print {} | llm "Weekly synthesis" | scrap save - weekly digest | |
| (pipeline) for note in $(obs export-ready); do llm -s "Quality check this" | obs create "reviews/$note.md"; done - async review queue | |
| (wisdom) a computer is a meta-tool — a tool for making tools. defaults are for everyone, meaning no one. yours should be useless to others, perfect for you. | |
| (weeknotes) screenshots auto-append to YYYY-WW-raw.md (private), actual writing goes to YYYY-WW.md (publishable) | |
| (weeknotes) Friday ritual: open -raw.md, write 3 sentences in main file from memory while looking at screenshots | |
| (zsh) btop - beautiful system monitor (CPU, RAM, network, processes) - run it, it's sexy |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment