[{"data":1,"prerenderedAt":476},["ShallowReactive",2],{"all-tips":3},[4,178,215,298,318,356,412],{"id":5,"title":6,"body":7,"date":166,"description":13,"extension":167,"meta":168,"navigation":49,"path":169,"seo":170,"stem":171,"tags":172,"topic":176,"triggered":49,"__hash__":177},"tips\u002Ftips\u002F2026-04-03.md","ripgrep's --files flag for dry-run exploration",{"type":8,"value":9,"toc":164},"minimark",[10,14,152,160],[11,12,13],"p",{},"Before searching, see exactly what files ripgrep will examine:",[15,16,21],"pre",{"className":17,"code":18,"language":19,"meta":20,"style":20},"language-bash shiki shiki-themes github-light","# What would ripgrep search?\nrg --files\n\n# Combine with type filters to preview scope\nrg --files --type py | wc -l  # Count Python files\nrg --files --glob '*.test.*' | head -5  # Preview test files\n\n# Pipe to other tools for analysis\nrg --files --type js | xargs wc -l | sort -n  # Size distribution\n","bash","",[22,23,24,33,44,51,57,85,109,114,120],"code",{"__ignoreMap":20},[25,26,29],"span",{"class":27,"line":28},"line",1,[25,30,32],{"class":31},"sAwPA","# What would ripgrep search?\n",[25,34,36,40],{"class":27,"line":35},2,[25,37,39],{"class":38},"s7eDp","rg",[25,41,43],{"class":42},"sYu0t"," --files\n",[25,45,47],{"class":27,"line":46},3,[25,48,50],{"emptyLinePlaceholder":49},true,"\n",[25,52,54],{"class":27,"line":53},4,[25,55,56],{"class":31},"# Combine with type filters to preview scope\n",[25,58,60,62,65,68,72,76,79,82],{"class":27,"line":59},5,[25,61,39],{"class":38},[25,63,64],{"class":42}," --files",[25,66,67],{"class":42}," --type",[25,69,71],{"class":70},"sYBdl"," py",[25,73,75],{"class":74},"sD7c4"," |",[25,77,78],{"class":38}," wc",[25,80,81],{"class":42}," -l",[25,83,84],{"class":31},"  # Count Python files\n",[25,86,88,90,92,95,98,100,103,106],{"class":27,"line":87},6,[25,89,39],{"class":38},[25,91,64],{"class":42},[25,93,94],{"class":42}," --glob",[25,96,97],{"class":70}," '*.test.*'",[25,99,75],{"class":74},[25,101,102],{"class":38}," head",[25,104,105],{"class":42}," -5",[25,107,108],{"class":31},"  # Preview test files\n",[25,110,112],{"class":27,"line":111},7,[25,113,50],{"emptyLinePlaceholder":49},[25,115,117],{"class":27,"line":116},8,[25,118,119],{"class":31},"# Pipe to other tools for analysis\n",[25,121,123,125,127,129,132,134,137,139,141,143,146,149],{"class":27,"line":122},9,[25,124,39],{"class":38},[25,126,64],{"class":42},[25,128,67],{"class":42},[25,130,131],{"class":70}," js",[25,133,75],{"class":74},[25,135,136],{"class":38}," xargs",[25,138,78],{"class":70},[25,140,81],{"class":42},[25,142,75],{"class":74},[25,144,145],{"class":38}," sort",[25,147,148],{"class":42}," -n",[25,150,151],{"class":31},"  # Size distribution\n",[11,153,154,159],{},[155,156,158],"cite",{"index":157},"8-54,8-55","--files: Just list files ripgrep would search, without searching. (great for dry-runs)"," Perfect for understanding ripgrep's file discovery before expensive searches.",[161,162,163],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":20,"searchDepth":35,"depth":35,"links":165},[],"2026-04-03","md",{},"\u002Ftips\u002F2026-04-03",{"title":6,"description":13},"tips\u002F2026-04-03",[173,174,175],"ripgrep","files","exploration","tools","mRVERgJYK4XqxNYmkWschyz3-jtX0r5eYWRHKw7uCsw",{"id":179,"title":180,"body":181,"date":204,"description":205,"extension":167,"meta":206,"navigation":49,"path":207,"seo":208,"stem":209,"tags":210,"topic":211,"triggered":49,"__hash__":214},"tips\u002Ftips\u002F2026-04-02.md","Debug Macros by Pasting Them",{"type":8,"value":182,"toc":202},[183],[11,184,185,186,189,190,193,194,197,198,201],{},"When a macro misbehaves, paste its contents with ",[22,187,188],{},"\"qp"," (for register q). You'll see the raw keystrokes including ",[22,191,192],{},"^["," for Escape and ",[22,195,196],{},"^M"," for Enter. Edit the text directly, then reload with ",[22,199,200],{},":let @q = 'fixed-content'",". No more re-recording broken macros.",{"title":20,"searchDepth":35,"depth":35,"links":203},[],"2026-04-02","When a macro misbehaves, paste its contents with \"qp (for register q). You'll see the raw keystrokes including ^[ for Escape and ^M for Enter. Edit the text directly, then reload with :let @q = 'fixed-content'. No more re-recording broken macros.",{},"\u002Ftips\u002F2026-04-02",{"title":180,"description":205},"tips\u002F2026-04-02",[211,212,213],"vim","macros","debugging","k1RMy0wKi_xFXRo2Re6R5hINXi-R9X2VuZov7Iuv-w0",{"id":216,"title":217,"body":218,"date":286,"description":287,"extension":167,"meta":288,"navigation":49,"path":289,"seo":290,"stem":291,"tags":292,"topic":295,"triggered":296,"__hash__":297},"tips\u002Ftips\u002F2026-04-01.md","Use .dockerignore to Accelerate Multi-Stage Builds",{"type":8,"value":219,"toc":284},[220,231,275,281],[11,221,222,223,226,227,230],{},"Your ",[22,224,225],{},".dockerignore"," file is critical for multi-stage build performance. Even though your final stage won't include excluded files, Docker still sends them to the build context, slowing down every ",[22,228,229],{},"COPY . ."," instruction.",[15,232,234],{"className":17,"code":233,"language":19,"meta":20,"style":20},"# .dockerignore\nnode_modules\u002F\n*.log\n.git\u002F\nREADME.md\nDockerfile*\n.dockerignore\n",[22,235,236,241,246,255,260,265,270],{"__ignoreMap":20},[25,237,238],{"class":27,"line":28},[25,239,240],{"class":31},"# .dockerignore\n",[25,242,243],{"class":27,"line":35},[25,244,245],{"class":38},"node_modules\u002F\n",[25,247,248,251],{"class":27,"line":46},[25,249,250],{"class":74},"*",[25,252,254],{"class":253},"sgsFI",".log\n",[25,256,257],{"class":27,"line":53},[25,258,259],{"class":38},".git\u002F\n",[25,261,262],{"class":27,"line":59},[25,263,264],{"class":38},"README.md\n",[25,266,267],{"class":27,"line":87},[25,268,269],{"class":38},"Dockerfile*\n",[25,271,272],{"class":27,"line":111},[25,273,274],{"class":38},".dockerignore\n",[11,276,277,278,280],{},"A properly configured ",[22,279,225],{}," can reduce build context from hundreds of MB to just a few MB, dramatically speeding up builds—especially in CI\u002FCD pipelines where network latency matters.",[161,282,283],{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":20,"searchDepth":35,"depth":35,"links":285},[],"2026-04-01","Your .dockerignore file is critical for multi-stage build performance. Even though your final stage won't include excluded files, Docker still sends them to the build context, slowing down every COPY . . instruction.",{},"\u002Ftips\u002F2026-04-01",{"title":217,"description":287},"tips\u002F2026-04-01",[293,294],"docker","performance","devops",false,"4TG9Aiw7ClQQdrYlhrdA5rUGJCUWzCAaOjumQhptKmg",{"id":299,"title":300,"body":301,"date":308,"description":305,"extension":167,"meta":309,"navigation":49,"path":310,"seo":311,"stem":312,"tags":313,"topic":295,"triggered":49,"__hash__":317},"tips\u002Ftips\u002F2026-03-31.md","Use Artifacts for API Response Mocking",{"type":8,"value":302,"toc":306},[303],[11,304,305],{},"Generate realistic JSON API responses in Claude Artifacts by describing your data structure. \"Create a mock REST API response for user profiles with nested address data\" gives you properly formatted JSON with realistic field names and values. Perfect for frontend development before the backend is ready, or for testing edge cases with varied data structures.",{"title":20,"searchDepth":35,"depth":35,"links":307},[],"2026-03-31",{},"\u002Ftips\u002F2026-03-31",{"title":300,"description":305},"tips\u002F2026-03-31",[314,315,316],"claude","api-development","mocking","_DFKRorbl8j7pUzUWib5i8OJ9WJp6mBbsho_XH_fJi4",{"id":319,"title":320,"body":321,"date":344,"description":345,"extension":167,"meta":346,"navigation":49,"path":347,"seo":348,"stem":349,"tags":350,"topic":354,"triggered":296,"__hash__":355},"tips\u002Ftips\u002F2026-03-27.md","Ctrl+X Ctrl+E Opens Your $EDITOR from Any Command Line",{"type":8,"value":322,"toc":342},[323],[11,324,325,326,329,330,333,334,337,338,341],{},"Typing a long command and wish you were in your editor? Press ",[22,327,328],{},"Ctrl+X Ctrl+E"," in bash (or ",[22,331,332],{},"Ctrl+X e"," in zsh) and your current command line opens in ",[22,335,336],{},"$EDITOR",". Save and quit to execute. Set ",[22,339,340],{},"export EDITOR=vim"," in your shell profile if you haven't already.",{"title":20,"searchDepth":35,"depth":35,"links":343},[],"2026-03-27","Typing a long command and wish you were in your editor? Press Ctrl+X Ctrl+E in bash (or Ctrl+X e in zsh) and your current command line opens in $EDITOR. Save and quit to execute. Set export EDITOR=vim in your shell profile if you haven't already.",{},"\u002Ftips\u002F2026-03-27",{"title":320,"description":345},"tips\u002F2026-03-27",[19,351,352,353],"readline","editor","productivity","cli","zHQhgdvM4b0NfOorbqkB3hNLf1Z7p8EtdUIvNQshm1k",{"id":357,"title":358,"body":359,"date":402,"description":403,"extension":167,"meta":404,"navigation":49,"path":405,"seo":406,"stem":407,"tags":408,"topic":377,"triggered":296,"__hash__":411},"tips\u002Ftips\u002F2026-03-26.md","git stash push -m Gives Your Stashes Names",{"type":8,"value":360,"toc":400},[361,368,390,397],[11,362,363,364,367],{},"Stop losing track of your stashes. Instead of ",[22,365,366],{},"git stash",", use:",[15,369,371],{"className":17,"code":370,"language":19,"meta":20,"style":20},"git stash push -m \"WIP: auth token refresh logic\"\n",[22,372,373],{"__ignoreMap":20},[25,374,375,378,381,384,387],{"class":27,"line":28},[25,376,377],{"class":38},"git",[25,379,380],{"class":70}," stash",[25,382,383],{"class":70}," push",[25,385,386],{"class":42}," -m",[25,388,389],{"class":70}," \"WIP: auth token refresh logic\"\n",[11,391,392,393,396],{},"Now ",[22,394,395],{},"git stash list"," shows meaningful labels instead of cryptic auto-generated messages. When you have 5+ stashes, this is the difference between finding your work and guessing.",[161,398,399],{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":20,"searchDepth":35,"depth":35,"links":401},[],"2026-03-26","Stop losing track of your stashes. Instead of git stash, use:",{},"\u002Ftips\u002F2026-03-26",{"title":358,"description":403},"tips\u002F2026-03-26",[377,409,410],"stash","workflow","u8mrWTC42Igo4osJyrFNegZvHfVu4tRiHV4sHqYd9s4",{"id":413,"title":414,"body":415,"date":466,"description":467,"extension":167,"meta":468,"navigation":49,"path":469,"seo":470,"stem":471,"tags":472,"topic":211,"triggered":296,"__hash__":475},"tips\u002Ftips\u002F2026-03-25.md","Use ci( to Change Inside Parentheses",{"type":8,"value":416,"toc":464},[417,424,448],[11,418,419,420,423],{},"In Vim, ",[22,421,422],{},"ci("," deletes everything inside the nearest parentheses and drops you into insert mode. Works from anywhere inside the parens — your cursor doesn't need to be on the opening paren.",[11,425,426,427,430,431,430,434,430,437,430,440,443,444,447],{},"The same pattern works for all paired delimiters: ",[22,428,429],{},"ci[",", ",[22,432,433],{},"ci{",[22,435,436],{},"ci\"",[22,438,439],{},"ci'",[22,441,442],{},"ci\u003C",", and even ",[22,445,446],{},"ci`"," for backticks.",[11,449,450,451,454,455,459,460,463],{},"Use ",[22,452,453],{},"ca("," instead to ",[456,457,458],"strong",{},"include"," the parentheses in the change. The ",[22,461,462],{},"a"," stands for \"around.\"",{"title":20,"searchDepth":35,"depth":35,"links":465},[],"2026-03-25","In Vim, ci( deletes everything inside the nearest parentheses and drops you into insert mode. Works from anywhere inside the parens — your cursor doesn't need to be on the opening paren.",{},"\u002Ftips\u002F2026-03-25",{"title":414,"description":467},"tips\u002F2026-03-25",[211,473,474],"text-objects","editing","24ET8I0mJM2wYTimEFfdruzOkodjTx5ikWTddhZHIos",1775249073929]