{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/blog/2013/04/23/5-essential-vim-plugins",
    "result": {"data":{"site":{"siteMetadata":{"title":"your friend Joel's digital garden","description":"Articles and notes from a collaborator at egghead.io. Musings on software, business, and life from a skilled virtual assistant.","author":{"name":"Joel Hooks"},"keywords":["Video Blogger"]}},"mdx":{"excerpt":"There are  a lot  of VIM plugins to choose from. An individual's list of what\nwould be considered \"essential\" is largely a personal matter. For any given\nplugin, there is also probably going to be an excellent alternative plugin that does…","fields":{"github":"https://github.com/joelhooks/joelhooks-com/tree/master/content/legacy_blog/2013-04-23-5-essential-vim-plugins.markdown"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"post\",\n  \"title\": \"5 Essential VIM Plugins That Greatly Increase my Productivity\",\n  \"date\": \"2013-04-23T00:00:00.000Z\",\n  \"comments\": true\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"There are \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"a lot\"), \" of VIM plugins to choose from. An individual's list of what\\nwould be considered \\\"essential\\\" is largely a personal matter. For any given\\nplugin, there is also probably going to be an excellent alternative plugin that does the\\nsame basic thing in a slightly different way. I'm just starting to use VIM for\\nmore than just quick edits of files on a server, and the plugins below are\\nsolving very specific workflow issues that I've encountered while learning to be\\nproductive in VIM.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"warning:\"), \" watch out for plugins, generally. For many (some included in my\\nlist of favorites here) might hamper your ability to understand the core\\nfunctionality of VIM. Many times the problem is best solved by understanding how\\nyou can accomplish the task with just VIM, and not a plugin. One of the biggest\\nbarriers I had with getting over the initial learning curve was over-saturation\\nwith plugins, as I \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://joelhooks.com/blog/2013/04/09/getting-to-know-vim/\"\n  }, \"wrote\\nhere\"), \".\"), mdx(\"h2\", null, \"Vundle\"), mdx(\"p\", null, \"If any of these plugins had an \\\"absolutely\\\" in front of its \\\"essential\\\"\\ndescriptor, it would be \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/gmarik/vundle\"\n  }, \"Vundle\"), \".\"), mdx(\"p\", null, \"Vundle is short for VIM Bundle. It is spiritually alike to\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://gembundler.com/\"\n  }, \"Bundler\"), \", and provides a clean easy way to manage\\nplugins that you install. In past VIM efforts, I didn't use any sort of scheme\\nfor managing plugins, and it was allways a complete \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"mess\"), \". Vundle has solved\\nthis for me completely.\"), mdx(\"p\", null, \"Vundle also allows me to rapidly reconfigure my setup across multiple machines,\\nwhich can be a real boost. It isn't really a day-to-day productivity booster,\\nbut when you need it, it is great to have it configured.\"), mdx(\"h2\", null, \"NERDTree\"), mdx(\"p\", null, \"One of the first walls I hit was \\\"how the heck do I navigate files in a\\nproject?\\\"\"), mdx(\"p\", null, \"The solution is multi-pronged, and starts with\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/scrooloose/nerdtree\"\n  }, \"NERDTree\"), \". The NERD Tree is a\\nfilesystem explorer that looks something like this:\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"295px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/32b688302ed886c4dc47eafb74000bcd/e4a3f/nerdtree.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"170.65637065637065%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAIAAADQyG7qAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEpklEQVRIx42U2W7bRhSGqRkOF81wEUWKIkWKWkhLsiSLIrXLsR07dpIGqFvXVu3sSP0CzUWLGkWStgHSvlHRIuhlb7vcBIhiA32SgmQcJLHd5seAmJuP/5mZ/xzqxfPfXv3688mfv/z+1/O/X/xx8uqf+cvj4+OT+cuT+fzk+OQczefz41jUnf3d+3e2vzjc3r+9fXBr5/bdvXsPZge39u4/mN29v7c3++w97e7uHh4eHhwczGYziiesasJKi232eN2kRQW4bUaUU/WQbQ1ZLKQoiqLiTyIAwGKzyXE8jRAlihIECFCABoCGNAAApACiEaJZhmHPiuf5IAx1PZ9VFEoQBBqhnF1RjaIgK5pdMZwKESUaAhrRZ8WybDfoSpIsSxJlFGxNN72lobc0sMoLbrtfa4eWUxZjkVNhjAkhHBeVEwSBIIoRXHRKW1evTYbhYs0dj4brGxudVnM6nX6yszMcjUeT5WvXP9rc3FzfuDIZj9I8zzBMEASSJGcyMqXl8nwa18LVhe60HkwrVoljEMtysQmTHJJlow3HsRBClo2cCYkKoRRV04tec7ThtoeN/prrVBBIoYuVwEIsKqvpRrlRC1cW+2s1f+wYFoQAIeZc8s2FiZIsyzKl5nTdqS2ONu26X2/4MscCmr7I9hQOBCG6Tiqr5tRCudoZV6sNkWWo6LUTRQ8D3xUAACEUlU0EQRApq1hyF7vdS9favemCu5DXVCUbSVWzqqq9J1VV9Xx+MBgQQiLnQtGptcPw0tXmYHV5dWuhWMwbhnmBDMOwbXs0GmGMI5jneSyIquH4a9uD6abEcfB/z9w9PTOOfiKrhtOaXg+GaxL/Ppyk8vUOQoZhul2f43iOT7+Gc1alvXw9GKxleD6B6fP8E2ff78oSyamRcxoTUTWK1c640R4oGNNx95zFEEIwgbuBnss4BZmKMi9Iuu3WeytOsSoiFPVvKgXfVPs2HJfd6/dxGkddTggRZAVjwSjVyg3fqjYrnXGpWEojBM70YwKHvR7BGEIYlS3IWSLKEdYMKq1BPVypWA5DQ/piGCdwOp0WJAULUnGh3Ryul9tjr9HJCUIKAPRfcDpxxkTKECnjNELPH7u1JRXzKXjuFDnjLAiEiLKiF7zO2AuW3bqvEgwgpD8EjkaMIGmFsudP3PagUmmIPAcA+EAYE1HWCk6xEXZ7UwKjMYsuSGgSkndgIY6n2xn7ax/X+5frS0NLUQCE8bHR2wtCmmHegqN4EjFnVz1/2g4vmUZRVvNpjoPwA54que2MXig3e+VqXeC4eGIjhmEuKrvX7xNC6OTCiJSRtXzNn/qXt1vdSTbNRQmNh0YEnIV7MUzTlBDFM5NR89WlUXuy5S0NnYbvdafNRgcziI796dOFEMNxXD92hjRN8WmeS5NM3vFafaNQIopOZFXOWUpGA3GLUO8oBSCMsh3BkDLNvOu5zXC0snqlYubyhmaZumlohpmz7YJlFcyCGS0r/pqmbduTyQRjTCOGunFj+cdn+99+s/Pw4e6jR/tPn86+/urm40f7Pz3bOzraPzr6/Ifv9757MnvyePbwy5u379w7PDy8urWpeYG78um/8sDjwACZZo8AAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"NERDTree\",\n    \"title\": \"NERDTree\",\n    \"src\": \"/static/32b688302ed886c4dc47eafb74000bcd/e4a3f/nerdtree.png\",\n    \"srcSet\": [\"/static/32b688302ed886c4dc47eafb74000bcd/a2ead/nerdtree.png 259w\", \"/static/32b688302ed886c4dc47eafb74000bcd/e4a3f/nerdtree.png 295w\"],\n    \"sizes\": \"(max-width: 295px) 100vw, 295px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\",\n    \"decoding\": \"async\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"It opens to your current directory, and allows you to drill down into folders.\\nThis allows you to traverse your project and open files. It also has file\\nmanagement capabilities for creating, deleting, and other common tasks.\"), mdx(\"p\", null, \"NERDTree is fantastic for hunting something down, but there are other tools that\\nhelp solve this problem in different ways.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"note\"), \": I was chastised a bit for this one on \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://news.ycombinator.com/item?id=5597939\"\n  }, \"Hacker\\nNews\"), \". NERDTree \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"is\"), \" big, and\\nyou might have better luck with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"netrw\"), \" as suggested. I plan on digging in to\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \":h netrw\"), \" to see if I can drop NERDTree off this list of (my) essentials.\"), mdx(\"p\", null, \"##ctrlp\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Full path fuzzy file, buffer, mru, tag, ... finder for Vim.\")), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/kien/ctrlp.vim\"\n  }, \"ctrlp\"), \" is \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"rad\"), \". It really lets you fly\\naround your project's files. After a quick \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"let g:ctrlp_map = '<c-p>'\"), \" to map it\\nto a hotkey, you are off to the races. It has different modes that allow you to\\njump to files, buffers, most recently used, as well as tags.\"), mdx(\"p\", null, \"With no fault to ctrlp, I've had issues with tags and JavaScript. ctags is\\nbehind the times, and DoctorJS lost its maintainer. Tern looks to have some\\npromise in this regard, and the VIM plugin is under heavy development. Having\\nsolid JS tags would turbo-charge ctrlp for me, so I'm paying close attention to\\nongoing development.\"), mdx(\"h2\", null, \"Syntastic\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/scrooloose\"\n  }, \"scrooloose\"), \" has several awesome VIM plugins,\\nincluding NERDTree above. I also get a lot of mileage out of\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/scrooloose/syntastic\"\n  }, \"Syntastic\"), \". It is a simple linter that\\nhighlights problems with syntax in a file. It works on \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"save\"), \", and provides\\nmeaningful feedback about warnings and errors.\"), mdx(\"h2\", null, \"EasyMotion\"), mdx(\"p\", null, \"Last, but in absolutely no way least, is the elegent\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/Lokaltog/vim-easymotion\"\n  }, \"EasyMotion\"), \". This plugin is all\\nabout navigating in the file you are currently editing.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"699px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/b348e0458082b211db1f59afc27798af/3fe45/easymotion.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"84.16988416988417%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAAClElEQVQ4y4WS2W7bOBRAFUvUQkqWuIi79i2OZGfiOINBH9r+TR9mEheY/wcGspKXou0cEOQFwXtJ8Fzn37+//fP67e3t7fX19e26ssXX6/X7b7ler04EUdf0GBOtte/7HvB834cQ7nY753+RQn7+8vWPp/PnL1//+vTp6Xwui9LaIkli3/eDXwMAcPZp9jAv0zQZa3PGCCGUUoRQhnEYhgD4PwUA4LqukyRJDNdLPM8DACCEIIQwiiCEruve3d3tdrt1vtut4wP3hkMIPdwf2q7r+n45HsuqGsfpdDz1/dC13fH02I/TMAzDOM7LMk5T2zTDMDRdByF0CGWXlz/HcXw8PZ5Op+XhcD4/n5+fl3mej8fj6XEahpfLZZmXeV4Oh8PyMF8uL03VGGudNE07a22e65zpPK8pKaUota60slLUlHCCLc4qnjdal1o3grdKsjSFCDk8y45V1dbNvdGHqjRS2jw3ghvOC85rSgqKK54bbRqlCikqKazWYr/PoshhOCsZzTDZwyiGcPs5D4D3+RaAW+CuW976UbedVVWWpjRGe4R83999nAOeuy3gVswFYJVzy93kvyfTfdoxylluGesEr4qi4XmrZKtVVVWG85LRRsmKs4LnU1kIpcIg2J7jKIJ7wRnGMkt1lmqSFTiTQhicapwpjFnODcEmZyRJYoSAD1bPWzJOkqmwhVK9EJbRQUurdS24oXikpNRaSzlQ3Euhs5QnsU5iw3kYRmuTsDSdS9vX9aEqJ2v6ui6F6NYqqjemFbzVulNylKLTalSy0/pe5F1dr6oEoQPPNaWG0soYKeUeQRgGcRgihFDgxwhFECEYRRGMwnBt3jCAEAZB4CTJXuCMUgYR2pp2E+FtbKredf3If4+iX3qZDuLUAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"EasyMotion\",\n    \"title\": \"EasyMotion\",\n    \"src\": \"/static/b348e0458082b211db1f59afc27798af/3fe45/easymotion.png\",\n    \"srcSet\": [\"/static/b348e0458082b211db1f59afc27798af/a2ead/easymotion.png 259w\", \"/static/b348e0458082b211db1f59afc27798af/6b9fd/easymotion.png 518w\", \"/static/b348e0458082b211db1f59afc27798af/3fe45/easymotion.png 699w\"],\n    \"sizes\": \"(max-width: 699px) 100vw, 699px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\",\n    \"decoding\": \"async\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"When activated with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"word\"), \" motion, EasyMotion assigns the first letter of\\nevery word after the cursor with a letter-based hotkey. After the first 26\\nletters are used up, it switches to capitals. Those soon change to sections that\\nallow you to \\\"drill in\\\" and get very fine-grained movement across large\\ndistances in your file. As your finger muscles get trained, the motion really is\\n\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"easy\"), \".\"), mdx(\"p\", null, \"This list isn't exhaustive, by any means. I also have several \\\"essential\\\"\\nplugins that I used specifically related to languages and file types that are\\ncommon for me. Vundle is probably the most essential out of this list. It has\\nbeen a huge help over the previous cut-n-paste horrid approach I've used in the\\npast. Running \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \":BundleUpdate\"), \" and watching Vundle march down my installed plugin\\nlist, looking at the github repository for each plugin I've installed, and\\nupdating them without any hassle at all is hugely satisfying.\"), mdx(\"p\", null, \"If you are interested, my \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/joelhooks/dotfiles\"\n  }, \"dotfiles are stored\\nhere\"), \". They are an ongoing process, but\\nthere are some interesting things going on.\"), mdx(\"p\", null, \"I'd love the hear about your essential VIM plugins. I'm always on the hunt for\\nnew and interesting additions to my workflow.\"), mdx(\"p\", null, \"{% render_partial _partials/consultancy_class.markdown %}\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"5 Essential VIM Plugins That Greatly Increase my Productivity","date":"April 23, 2013","banner":null,"slug":null,"keywords":null}}},"pageContext":{"id":"e9af66f4-e970-5964-aec5-8aa0c8d2456e","prev":{"id":"850ec444-559d-5cf0-a126-a75a6f5ff63c","parent":{"name":"2013-04-24-modeling-data-and-state-in-your-angularjs-application","sourceInstanceName":"legacy"},"excerpt":"Respect your data. Contain your state. \nData and state are the foundation of your application. These two items should be\nabsolutely respected. As you work through the AngularJS documentation, these two\nitems are generally stored on the controllers…","fields":{"title":"Modeling Data and State in Your AngularJS Application","slug":"blog/2013/04/24/modeling-data-and-state-in-your-angularjs-application","date":"2013-04-24T00:00:00.000Z"}},"next":{"id":"69eea334-e327-5f68-852e-d58c4f2f4c84","parent":{"name":"2013-04-18-a-tiny-review-one-week-with-an-11-macbook-air-for-software-development","sourceInstanceName":"legacy"},"excerpt":"For as long as I can remember, all of my computer upgrades have been \"bigger and\nbadder.\" Outside of moving from a FULL ATX DESKTOP WORKSTATION to a laptop,\nMoore's law has played out nicely. Every few years I'd get something bigger and\nbetter. Not…","fields":{"title":"It is Tiny. One Week Developing With an 11\" MacBook Air","slug":"blog/2013/04/18/a-tiny-review-one-week-with-an-11-macbook-air-for-software-development","date":"2013-04-18T00:00:00.000Z"}}}},
    "staticQueryHashes": ["1045846374"]}