[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"header-categories":3,"post-practical-vim-modern-developers":73,"parsed-post-cdb70bf7-aa8f-48c0-9760-2b8d0867dc0b":141},{"success":4,"data":5},true,{"items":6,"pagination":70},[7,16,24,32,40,48,56,63],{"id":8,"name":9,"description":10,"parentId":11,"createdAt":12,"updatedAt":12,"parent":11,"children":13,"_count":14},"ai-future","AI & The Future","Artificial intelligence and emerging technology",null,"2026-07-24T06:02:45.990Z",[],{"posts":15},1,{"id":17,"name":18,"description":19,"parentId":11,"createdAt":20,"updatedAt":20,"parent":11,"children":21,"_count":22},"tools-productivity","Tools & Productivity","Developer tools and workflow optimization","2026-07-24T06:02:45.712Z",[],{"posts":23},7,{"id":25,"name":26,"description":27,"parentId":11,"createdAt":28,"updatedAt":28,"parent":11,"children":29,"_count":30},"career","Career & Growth","Professional development for developers","2026-07-24T06:02:45.486Z",[],{"posts":31},3,{"id":33,"name":34,"description":35,"parentId":11,"createdAt":36,"updatedAt":36,"parent":11,"children":37,"_count":38},"opinion","Opinion & Analysis","Industry analysis and technical opinions","2026-07-24T06:02:45.272Z",[],{"posts":39},6,{"id":41,"name":42,"description":43,"parentId":11,"createdAt":44,"updatedAt":44,"parent":11,"children":45,"_count":46},"tutorials","Tutorials","Step-by-step learning guides","2026-07-24T06:02:44.965Z",[],{"posts":47},21,{"id":49,"name":50,"description":51,"parentId":11,"createdAt":52,"updatedAt":52,"parent":11,"children":53,"_count":54},"software-engineering","Software Engineering","Best practices, patterns, and principles","2026-07-24T06:02:44.689Z",[],{"posts":55},24,{"id":57,"name":58,"description":59,"parentId":11,"createdAt":60,"updatedAt":60,"parent":11,"children":61,"_count":62},"devops-cloud","DevOps & Cloud","Infrastructure, deployment, and cloud computing","2026-07-24T06:02:44.453Z",[],{"posts":39},{"id":64,"name":65,"description":66,"parentId":11,"createdAt":67,"updatedAt":67,"parent":11,"children":68,"_count":69},"web-development","Web Development","Frontend and backend web development tutorials and guides","2026-07-24T06:02:44.169Z",[],{"posts":55},{"page":15,"limit":71,"total":71,"totalPages":15,"hasNext":72,"hasPrev":72},8,false,{"success":4,"data":74},{"id":75,"slug":76,"title":77,"excerpt":78,"content":79,"status":80,"visibility":81,"featuredImage":82,"canonicalUrl":11,"readingTime":71,"viewCount":83,"commentEnabled":4,"publishedAt":84,"scheduledAt":11,"createdAt":85,"updatedAt":86,"seoTitle":87,"seoDescription":78,"seoKeywords":11,"authorId":88,"author":89,"coAuthors":94,"tags":95,"categories":106,"comments":109,"_count":110,"relatedPosts":112},"cdb70bf7-aa8f-48c0-9760-2b8d0867dc0b","practical-vim-modern-developers","Practical Vim for Modern Developers","You don't need to live in Vim to benefit from it. Learn the motions and mental model that make editing code dramatically faster.","## You Don't Have to Switch Editors\n\nVim isn't an editor — it's an editing *language*. Learn the motions and use them everywhere: VS Code (Vim extension), JetBrains (IdeaVim), or the terminal.\n\n## The Mental Model\n\nVim commands are **verb + noun**:\n\n- `d` (delete) + `w` (word) = delete a word\n- `c` (change) + `i\"` (inside quotes) = change text inside quotes\n- `y` (yank\u002Fcopy) + `ap` (a paragraph) = copy a paragraph\n\n## Essential Motions (The Nouns)\n\n```\nw\u002Fb     → next\u002Fprevious word\ne       → end of word\n0\u002F$     → start\u002Fend of line\ngg\u002FG    → start\u002Fend of file\nf{char} → jump to character on line\n%       → matching bracket\n\u002F{text} → search forward\n```\n\n## Essential Operators (The Verbs)\n\n```\nd → delete\nc → change (delete + enter insert mode)\ny → yank (copy)\nv → visual select\n> → indent\n\u003C → unindent\n```\n\n## Text Objects (The Precision Tools)\n\n```\niw → \"inner word\"        (just the word)\naw → \"a word\"            (word + surrounding space)\ni\" → inside quotes\ni( → inside parentheses\nit → inside HTML tag\nip → inner paragraph\n```\n\n::callout{icon=\"i-lucide-keyboard\" color=\"primary\"}\nText objects are Vim's superpower. `ci\"` (change inside quotes) works regardless of where your cursor is within the quotes. No need to select first.\n::\n\n## Recipes for Daily Coding\n\n```\nci'     → Change string contents: 'hello' → '|'\nda(     → Delete function args: fn(a, b) → fn\nyap     → Copy entire paragraph\nV5j>    → Select 6 lines and indent\n*       → Search for word under cursor\ncgn     → Change next search match (then . to repeat)\n```\n\n## Practical Workflow: Rename Variable\n\n```\n\u002FoldName    → Search for the variable\ncgn         → Change the current match\nnewName     → Type the new name\n\u003CEsc>       → Back to normal mode\n.           → Repeat on next match (press n to skip)\n```\n\n## Multi-Cursor Alternative: Macros\n\n```\nqa          → Start recording macro into register 'a'\n(edits)     → Make your changes on one line\nq           → Stop recording\n@a          → Replay the macro\n10@a        → Replay 10 more times\n```\n\n## VS Code + Vim Config\n\n```json\n\u002F\u002F settings.json\n{\n  \"vim.leader\": \"\u003Cspace>\",\n  \"vim.useSystemClipboard\": true,\n  \"vim.normalModeKeyBindings\": [\n    { \"before\": [\"\u003Cleader>\", \"w\"], \"commands\": [\"workbench.action.files.save\"] },\n    { \"before\": [\"\u003Cleader>\", \"f\"], \"commands\": [\"editor.action.formatDocument\"] },\n    { \"before\": [\"\u003Cleader>\", \"p\"], \"commands\": [\"workbench.action.quickOpen\"] }\n  ]\n}\n```\n\n## Learning Path\n\n1. **Week 1:** hjkl navigation, i\u002Fa to insert, dd\u002Fyy\u002Fp basics\n2. **Week 2:** w\u002Fb\u002Fe word motions, f\u002Ft character jumps\n3. **Week 3:** Text objects (ci\", di(, yap)\n4. **Week 4:** Macros, visual mode, registers\n\nYou'll be slower for 2 weeks. Then faster than ever after that. The ROI compounds over your entire career.\n","published","public","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1517694712202-14dd9538aa97?w=1200&q=80",1371,"2026-04-20T06:04:38.260Z","2026-07-24T06:04:38.262Z","2026-07-28T12:16:25.381Z","Practical Vim for Modern Developers | BitBlog","fddb5d93-7a2c-4d86-a06a-fa32e73a01c6",{"email":90,"bio":91,"id":88,"name":92,"avatarUrl":93},"mbeahessilfieprince@gmail.com","Fullstack Software Developer ","Mbeah Essilfie","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F93322394?v=4",[],[96,101],{"id":97,"name":98,"color":99,"description":100},"devops","DevOps","#ff6c37","Development and Operations",{"id":102,"name":103,"color":104,"description":105},"python","Python","#3776ab","General-purpose programming language",[107,108],{"id":25,"name":26,"description":27},{"id":17,"name":18,"description":19},[],{"comments":111},0,[113,122,132],{"id":114,"slug":115,"title":116,"excerpt":117,"featuredImage":118,"viewCount":119,"readingTime":71,"publishedAt":120,"author":121},"2997028f-4d22-4eb7-9d86-894a54cb559a","building-type-safe-apis-nuxt3-prisma","Building Type-Safe APIs with Nuxt 3 and Prisma","Learn how to build end-to-end type-safe APIs using Nuxt 3 server routes and Prisma ORM for a seamless developer experience.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1498050108023-c5249f4df085?w=1200&q=80",1920,"2026-07-23T06:02:46.910Z",{"id":88,"name":92,"avatarUrl":93},{"id":123,"slug":124,"title":125,"excerpt":126,"featuredImage":127,"viewCount":128,"readingTime":129,"publishedAt":130,"author":131},"da9e4553-8b0d-411e-b4ec-f9684017e163","mastering-tailwind-css-design-systems","Mastering Tailwind CSS: From Utility Classes to Design Systems","Go beyond basic utility classes and learn how to build cohesive, maintainable design systems with Tailwind CSS.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1555066931-4365d14bab8c?w=1200&q=80",255,10,"2026-07-21T06:02:49.268Z",{"id":88,"name":92,"avatarUrl":93},{"id":133,"slug":134,"title":135,"excerpt":136,"featuredImage":82,"viewCount":137,"readingTime":138,"publishedAt":139,"author":140},"50add5fc-4026-4267-b917-7f71ea9e35b0","complete-guide-vue3-composables","The Complete Guide to Vue 3 Composables","Understand the power of Vue 3's Composition API through practical, real-world composable patterns that you can use today.",988,12,"2026-07-19T06:02:51.753Z",{"id":88,"name":92,"avatarUrl":93},{"data":142,"body":144,"toc":440},{"title":143,"description":143},"",{"type":145,"children":146},"root",[147,156,170,176,189,252,258,269,275,284,290,299,318,324,333,339,348,354,363,369,380,386,430,435],{"type":148,"tag":149,"props":150,"children":152},"element","h2",{"id":151},"you-dont-have-to-switch-editors",[153],{"type":154,"value":155},"text","You Don't Have to Switch Editors",{"type":148,"tag":157,"props":158,"children":159},"p",{},[160,162,168],{"type":154,"value":161},"Vim isn't an editor — it's an editing ",{"type":148,"tag":163,"props":164,"children":165},"em",{},[166],{"type":154,"value":167},"language",{"type":154,"value":169},". Learn the motions and use them everywhere: VS Code (Vim extension), JetBrains (IdeaVim), or the terminal.",{"type":148,"tag":149,"props":171,"children":173},{"id":172},"the-mental-model",[174],{"type":154,"value":175},"The Mental Model",{"type":148,"tag":157,"props":177,"children":178},{},[179,181,187],{"type":154,"value":180},"Vim commands are ",{"type":148,"tag":182,"props":183,"children":184},"strong",{},[185],{"type":154,"value":186},"verb + noun",{"type":154,"value":188},":",{"type":148,"tag":190,"props":191,"children":192},"ul",{},[193,214,233],{"type":148,"tag":194,"props":195,"children":196},"li",{},[197,204,206,212],{"type":148,"tag":198,"props":199,"children":201},"code",{"className":200},[],[202],{"type":154,"value":203},"d",{"type":154,"value":205}," (delete) + ",{"type":148,"tag":198,"props":207,"children":209},{"className":208},[],[210],{"type":154,"value":211},"w",{"type":154,"value":213}," (word) = delete a word",{"type":148,"tag":194,"props":215,"children":216},{},[217,223,225,231],{"type":148,"tag":198,"props":218,"children":220},{"className":219},[],[221],{"type":154,"value":222},"c",{"type":154,"value":224}," (change) + ",{"type":148,"tag":198,"props":226,"children":228},{"className":227},[],[229],{"type":154,"value":230},"i\"",{"type":154,"value":232}," (inside quotes) = change text inside quotes",{"type":148,"tag":194,"props":234,"children":235},{},[236,242,244,250],{"type":148,"tag":198,"props":237,"children":239},{"className":238},[],[240],{"type":154,"value":241},"y",{"type":154,"value":243}," (yank\u002Fcopy) + ",{"type":148,"tag":198,"props":245,"children":247},{"className":246},[],[248],{"type":154,"value":249},"ap",{"type":154,"value":251}," (a paragraph) = copy a paragraph",{"type":148,"tag":149,"props":253,"children":255},{"id":254},"essential-motions-the-nouns",[256],{"type":154,"value":257},"Essential Motions (The Nouns)",{"type":148,"tag":259,"props":260,"children":264},"pre",{"className":261,"code":263,"language":154},[262],"language-text","w\u002Fb     → next\u002Fprevious word\ne       → end of word\n0\u002F$     → start\u002Fend of line\ngg\u002FG    → start\u002Fend of file\nf{char} → jump to character on line\n%       → matching bracket\n\u002F{text} → search forward\n",[265],{"type":148,"tag":198,"props":266,"children":267},{"__ignoreMap":143},[268],{"type":154,"value":263},{"type":148,"tag":149,"props":270,"children":272},{"id":271},"essential-operators-the-verbs",[273],{"type":154,"value":274},"Essential Operators (The Verbs)",{"type":148,"tag":259,"props":276,"children":279},{"className":277,"code":278,"language":154},[262],"d → delete\nc → change (delete + enter insert mode)\ny → yank (copy)\nv → visual select\n> → indent\n\u003C → unindent\n",[280],{"type":148,"tag":198,"props":281,"children":282},{"__ignoreMap":143},[283],{"type":154,"value":278},{"type":148,"tag":149,"props":285,"children":287},{"id":286},"text-objects-the-precision-tools",[288],{"type":154,"value":289},"Text Objects (The Precision Tools)",{"type":148,"tag":259,"props":291,"children":294},{"className":292,"code":293,"language":154},[262],"iw → \"inner word\"        (just the word)\naw → \"a word\"            (word + surrounding space)\ni\" → inside quotes\ni( → inside parentheses\nit → inside HTML tag\nip → inner paragraph\n",[295],{"type":148,"tag":198,"props":296,"children":297},{"__ignoreMap":143},[298],{"type":154,"value":293},{"type":148,"tag":300,"props":301,"children":304},"callout",{"color":302,"icon":303},"primary","i-lucide-keyboard",[305],{"type":148,"tag":157,"props":306,"children":307},{},[308,310,316],{"type":154,"value":309},"Text objects are Vim's superpower. ",{"type":148,"tag":198,"props":311,"children":313},{"className":312},[],[314],{"type":154,"value":315},"ci\"",{"type":154,"value":317}," (change inside quotes) works regardless of where your cursor is within the quotes. No need to select first.",{"type":148,"tag":149,"props":319,"children":321},{"id":320},"recipes-for-daily-coding",[322],{"type":154,"value":323},"Recipes for Daily Coding",{"type":148,"tag":259,"props":325,"children":328},{"className":326,"code":327,"language":154},[262],"ci'     → Change string contents: 'hello' → '|'\nda(     → Delete function args: fn(a, b) → fn\nyap     → Copy entire paragraph\nV5j>    → Select 6 lines and indent\n*       → Search for word under cursor\ncgn     → Change next search match (then . to repeat)\n",[329],{"type":148,"tag":198,"props":330,"children":331},{"__ignoreMap":143},[332],{"type":154,"value":327},{"type":148,"tag":149,"props":334,"children":336},{"id":335},"practical-workflow-rename-variable",[337],{"type":154,"value":338},"Practical Workflow: Rename Variable",{"type":148,"tag":259,"props":340,"children":343},{"className":341,"code":342,"language":154},[262],"\u002FoldName    → Search for the variable\ncgn         → Change the current match\nnewName     → Type the new name\n\u003CEsc>       → Back to normal mode\n.           → Repeat on next match (press n to skip)\n",[344],{"type":148,"tag":198,"props":345,"children":346},{"__ignoreMap":143},[347],{"type":154,"value":342},{"type":148,"tag":149,"props":349,"children":351},{"id":350},"multi-cursor-alternative-macros",[352],{"type":154,"value":353},"Multi-Cursor Alternative: Macros",{"type":148,"tag":259,"props":355,"children":358},{"className":356,"code":357,"language":154},[262],"qa          → Start recording macro into register 'a'\n(edits)     → Make your changes on one line\nq           → Stop recording\n@a          → Replay the macro\n10@a        → Replay 10 more times\n",[359],{"type":148,"tag":198,"props":360,"children":361},{"__ignoreMap":143},[362],{"type":154,"value":357},{"type":148,"tag":149,"props":364,"children":366},{"id":365},"vs-code-vim-config",[367],{"type":154,"value":368},"VS Code + Vim Config",{"type":148,"tag":259,"props":370,"children":375},{"className":371,"code":372,"language":373,"meta":143,"style":374},"language-json","\u002F\u002F settings.json\n{\n  \"vim.leader\": \"\u003Cspace>\",\n  \"vim.useSystemClipboard\": true,\n  \"vim.normalModeKeyBindings\": [\n    { \"before\": [\"\u003Cleader>\", \"w\"], \"commands\": [\"workbench.action.files.save\"] },\n    { \"before\": [\"\u003Cleader>\", \"f\"], \"commands\": [\"editor.action.formatDocument\"] },\n    { \"before\": [\"\u003Cleader>\", \"p\"], \"commands\": [\"workbench.action.quickOpen\"] }\n  ]\n}\n","json","undefined",[376],{"type":148,"tag":198,"props":377,"children":378},{"__ignoreMap":143},[379],{"type":154,"value":372},{"type":148,"tag":149,"props":381,"children":383},{"id":382},"learning-path",[384],{"type":154,"value":385},"Learning Path",{"type":148,"tag":387,"props":388,"children":389},"ol",{},[390,400,410,420],{"type":148,"tag":194,"props":391,"children":392},{},[393,398],{"type":148,"tag":182,"props":394,"children":395},{},[396],{"type":154,"value":397},"Week 1:",{"type":154,"value":399}," hjkl navigation, i\u002Fa to insert, dd\u002Fyy\u002Fp basics",{"type":148,"tag":194,"props":401,"children":402},{},[403,408],{"type":148,"tag":182,"props":404,"children":405},{},[406],{"type":154,"value":407},"Week 2:",{"type":154,"value":409}," w\u002Fb\u002Fe word motions, f\u002Ft character jumps",{"type":148,"tag":194,"props":411,"children":412},{},[413,418],{"type":148,"tag":182,"props":414,"children":415},{},[416],{"type":154,"value":417},"Week 3:",{"type":154,"value":419}," Text objects (ci\", di(, yap)",{"type":148,"tag":194,"props":421,"children":422},{},[423,428],{"type":148,"tag":182,"props":424,"children":425},{},[426],{"type":154,"value":427},"Week 4:",{"type":154,"value":429}," Macros, visual mode, registers",{"type":148,"tag":157,"props":431,"children":432},{},[433],{"type":154,"value":434},"You'll be slower for 2 weeks. Then faster than ever after that. The ROI compounds over your entire career.",{"type":148,"tag":436,"props":437,"children":438},"style",{},[439],{"type":154,"value":143},{"title":143,"searchDepth":441,"depth":441,"links":442},2,[443,444,445,446,447,448,449,450,451,452],{"id":151,"depth":441,"text":155},{"id":172,"depth":441,"text":175},{"id":254,"depth":441,"text":257},{"id":271,"depth":441,"text":274},{"id":286,"depth":441,"text":289},{"id":320,"depth":441,"text":323},{"id":335,"depth":441,"text":338},{"id":350,"depth":441,"text":353},{"id":365,"depth":441,"text":368},{"id":382,"depth":441,"text":385}]