Why Should You Learn Vim in 2020
pragmaticpineapple.com
pragmaticpineapple.com
Let me explain: I've been an emacs person for decades now. I was never super committed to it, though. In practice, I'll use whatever editor has the best plugin for the language I'm working in. Which means that, for the longest time, I had to try and keep track of 4 or 5 different sets of editor keyboard commands. Which is too damn much for one brain, so I found that, over time, I stopped being as efficient in any editor as I was in emacs 25 years ago.
So why vim? Because every editor worth its salt has an option to use vim keybindings. So you don't have to learn 4, 5, 6 different sets of editor commands. You can learn one, and learn it well.
Including the Unix shell line editor, which typically supports both vi and emacs key bindings, and nothing else. Yet for some reason the default always seems to be emacs rather than vi, even on BSD (e.g. OpenBSD), and even though POSIX only mandates vi mode because "[t]he author of emacs requested that the POSIX emacs mode either be deleted or have a significant number of unspecified conditions."[1] Emacs line editing mode is more confusing for me as I use Joe (WordStar clone) which has emacs-like key combinations but with slightly different assignments. And because of this default I've never made a habit of using line editing commands; there's no way I can unlearn my Joe muscle memory, and over the years I've gotten into the habit of avoiding shell personalizations, to my detriment in this case.
[1] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/s...
I like my emacs line editing mode :D
I love that control+a and command+a have different functions. I use control+k and control+a all the time while writing comments on websites, etc. Especially since I've been mapping caps-lock to control for more than a decade.
I'm not sure about this. For instance, I'm typing this message in a text box in my browser and I don't have access to vim keybindings. There are many cases where this happens (other example: google docs).
I do use vim whenever I can, but I'd say the most useful keybindings that one can learn are the ones from the OS.
I can Ctrl-C/Ctrl-X/Ctrl-V to copy/cut/paste, Ctrl-arrows to move around one word at a time, Ctrl-shift-arrows to select words, Home and End to go to the start and end of the line, etc, Ctrl-Home/Ctrl-End to move to the start and end of the text input, etc.
Those are emacs bindings. Readline uses emacs bindings by default, but it can also use vi bindings.
Unless you mean that it uses readline and so configuring it (i.e. ~/.inputrc) allows you to change the keybindings of macOS UI text fields. That'd be cool if it's the case.
Here’s another:
Very useful tool, too bad it does not support key mapping. I'd like to `nmap gj <ESC>` or the essential `nmap j gj`, because writing on small `<textbox/>` tends to wrap the content.
But both in this box and in google docs (and so many more places) you have access to the basic emacs C-* cursor movement and line manipulation bindings.
One should really know both vi and emacs style basic movement bindings. Both work in many places, sometimes it's one or the other.
> Sometimes, you edit text outside of Vim. These are sad times. Enter vim-anywhere!
https://github.com/GhostText/GhostText
GhostText extension for chrome/FF and listed $plugin for $editor means you can live edit a browser textarea in $editor with text sent in real time to browser.
Unfortunately, Google Suite(docs etc.) does not play nice and does not work.
Worth checking out.
Also for a more embedded vim experience: https://github.com/glacambre/firenvim
- google chrome
- sql server management studio
- jupyter notebook
- jupyter lab
- visual studio code
- ms visual studio
- dbeaver
- eclipse
- sublime text 2
- hackerank, iirc
Editing source code, on the other hand, benefits much more from vim, because inserting text is only part of it.
Firefox: https://www.reddit.com/r/firefox/comments/8y0q23/vim_mode_fo...
- Geany
- Sublime Text
- VS Code
- Notepad++
- micro
- ne
On top of these I usually memorize Ctrl-A and Ctrl-E for the command-line, and "i… :wq" for vim, although haven't needed the latter in a decade.
But, at the risk of branding myself a traitor, I would suggest that anyone who doesn't already have emacs shortcuts burned into their muscle memory should choose to learn the vim ones, because they're somewhat more widely supported.
(And to use doom emacs to do it.)
Also a lot of inputs use Emacs binding or a subset of it: Bash and other shells, Cisco routers, heck, even in Slack you can Crtl-a or Crtl-k.
Yeah, this is weird to me. I've seen some people list it on their resume. Why should I care what editor you use?
Most anything that VSCode can do, you can make vim do with plugins, but it is often incredibly time consuming and finnicky to get up and running, whereas with VSCode everything "just works".
All the productivity of being able to edit text in vim, alongside the conveniences of a real, modern IDE.
I always loved vims movement and editing and hated it's file traversal / project management, so this is a perfect amalgamation
I have a hot key for opening the current file in an actual vim instance whenever I want to write multiline text or use visual block mode.
You can even use a custom ~/.ideavimrc and bind leader shortcuts to JetBrains actions. I rarely ever touch the mouse in IntelliJ now. It's an ultra-productive environment to have the power of IntelliJ, the convenience of vim, and Spacemacs/Doom Emacs style shortcuts.
For example, to manage projects:
nnoremap <leader>po :action ManageRecentProjects<CR>
nnoremap <leader>pc :action CloseProject<CR>
Or to create/switch git branches: nnoremap <leader>gb :action Git.Branches<CR>
Or to bring up the nav bar to change or create new files (Ctrl/Cmd + N once the nav bar is visible): nnoremap <leader>fn :action ShowNavBar<CR>
Or to summon git blame annotations in the current file (repeat to dismiss them): nnoremap <leader>ga :action Annotate<CR>
Or manipulate windows: " Window movement.
map <leader>wv :vsplit<CR>
map <leader>ws :split<CR>
map <leader>wd <C-W>c
map <leader>wx <C-W>c
map <leader>ww <C-W>w
map <leader>wl <C-W>l
map <leader>wh <C-W>h
map <leader>wk <C-W>k
map <leader>wj <C-W>j
map <leader>wo <C-W>o
Or summon “Refactor This” at the cursor point: nnoremap <leader>rt :action Refactorings.QuickListPopupAction<CR>
You can get a list of available actions for your current environment and plugins with the :actionlist command.I only started playing with this recently but my current config is here for those interested:
https://gist.github.com/nickcernis/bcb5cb7f55c07ed3de8287d16...
It takes a bit of searching and fiddling, but once you hide all the chrome (I even hide tabs at Editor → General → Editor Tabs → Tab Placement = None), install IdeaVim and configure shortcuts how you want them IntelliJ feels just as slick as a tricked-out Emacs/vim, but with better out-of-the-box code intelligence.
On Mac I also remap Ctrl+hjkl system-wide so that I can navigate IntelliJ popovers with vim-ish shortcuts. I use Karabiner for this with the “Vi Mode, left_control + hjkl. shift/option/command + arrow working” option on this page: https://ke-complex-modifications.pqrs.org/?q=%20PC-Style%20S...
I have a single config for all vim related things(vimrc) and source it for neovim as well, hence I was curious. For example,
has('nvim') checks for neovim.
Something like this for 'ideavim' would mean I can add IntelliJ related stuff inside that check.
https://stackoverflow.com/questions/34528322/how-to-include-...
There goes my afternoon...
VSCode is awesome, it provides a ton of benefits you don't get from emacs or vanilla vim. I'm really enjoying using it, and there's a chance that it will become my new "main" editor.
That said, the vim mode is not perfect. It only takes a few minutes of work before I run into a limitation of the vim mode, some binding or other that I use and that isn't replicated. More importantly, some things feel broken - there have been cases where undo didn't work properly for me, and cases where numerical arguments to commands messed things up.
That said, I've actually started taking the time to customize the vim mode in VSCode, and it's starting to pay off.
That being said, I haven't been able to make the switch myself yet, even though I sort of want to. The vibe is off.
You don't need to be a vi/vim wizard, but you should at least be able to use it a little bit. Vi is the one editor that's guaranteed to be available basically anywhere.
For working on a complex file (local to my workstation), I almost always prefer Geany or maybe VSCode (depending on the scope of the project). But I'm also semi-decent with vi, and it's saved me a lot of times on embedded systems where I need to log in via serial-console and edit some files.
It's also just faster/easier for editing the odd config-file here or there on a system that I'm logged into. Sure, I could launch a GUI and browse to it (for a local file), or maybe edit with a GUI over SSHFS or something. But if it's a small change? Vim is killer.
Maybe Emacs is better for CLI use, I'm not sure one way or the other. But it's definitely got a much smaller install-base than Vim. And proper-noun Vim has a _much_ smaller install-base than vi-compatible things generally (vim, busybox vi, etc).
Programmers like using vim because it feels like solving a puzzle or RTS micro'ing and/or they have already sunk a huge amount of time into it and aren't willing to walk away (which is fine, but it's not evidence that these tools are better.)
Starting fresh (i.e. no experience with an IDE or vi/emacs) there is zero productivity benefit to choosing vi or emacs over a real IDE in this day and age.
Disclaimer: I am a former vi (~5 years) and emacs (~20 years) fanatic.
Vim is great and I love it and have used it for 12 years day in and day out. But I wouldn't say it's what makes me productive, just that I got good at it and know it well.
I am (was?) a heavy vim user - 10 years, a .vimrc with thousands of lines and many custom code and settings.
I can vouch that in my case, one of the reasons that I did this is because I enjoyed it. I played around with many editors before I settled on vim, and I enjoyed it immensely. vim was my main editor for many years because it was the best at editing and still is. But for sure I wouldn't have sunk so much time into it without also having fun doing it.
In the last few years, I've started experimenting with other editors/IDEs using vim mode, starting from spacemacs, and now using VSCode.
vi/emacs will definitely still be around in 20 years. Other editors may not be.
TBH, although this might be an unpopular opinion among vim users, I don't think vim is worth for coding beyond simple scripting, a decent setup requires way too much work which defeats one of its key points. But for everything else in editing files, nothing compares.
Also, for some reason, many modern systems still only install vi by default. If you know vim, you know vi; but it is missing enough features to be annoying.
The thing I'm running into recently is that it gets very slow for large files. Unfortunately, where I work, the norm is to have files be thousands and thousands of lines long, which causes my setup which otherwise works fine to become very slow.
It's probably a plugin I'm using, but as you say, it now becomes my responsibility to figure out which one it is. Contrast this with vscode, which works fine out of the box, and already has most features built in.
You know, people always say this, but I've never seen that actually happen. And I've been using vim for around 10 years, with lots of customizations. I consider myself fairly proficient (though by no means an expert).
Week 1: Complete vimtutor once a day, every day Week 2: Use Vim with minimal config, no plugins Week 3: Use Vim with minimal plugins Week 4: Compose Vim commands with verbs and nouns
The vim ecosystem reminds me of the node ecosystem. It's a choose your own adventure approach. Yes, there are wonderful and powerful tools, but it's always a shotgun of plugins to get a solution for each language you want to support. With JetBrains, I get 90% of the tooling I need for the language I'm using out of the box. The other 10% can be handled by plugins and some small configuration changes.
I'm posting this because I want to be convinced otherwise. Here are the JetBrains features that I can't live without:
- Contexts: https://www.jetbrains.com/help/idea/managing-tasks-and-context.html#work-with-context
- Re > I'm usually working with a 6 to 8 way split. Kind of like the tabs on my browser.
- VCS tooling
- Handles multiple git repos from a top level. I can commit across all repos or a single repo selectively
- File change view
- Merging view
- Per line commit selection
- Inbuilt database tooling
- Ad hoc queries and output directly next to the code you're prototyping
- Database introspection
- Symbol based refactoring
- Visual debugger
- Multiple module repo
- You can configure a language/ecosystem per each directory in your project to get the associated tooling for each directory
- Scratch files
- Local history
- This has saved my ass more than once. It's amazing how far back you can go outside of commit history with this.It's not even good at dealing with more than one file. Yeah, I have nerd-tree and have tried explore. meh.
I'll think about it when ReSharper comes up with an add-in for VIM.
Yes, I know Visual Studio Code has VIM mode. . and Visual Studio used to (or maybe still does), but then you're outside the norm of that environment. Ever Visual Studio Code extension is tested with Visual Studio Code. But they're not all tested with Visual Studio Code in VIM mode. That's why I like to stick with defaults and the base-case.
What's needed is for VIM itself to have features beyond just editing text files. It's never going to compete with Visual Studio or Visual Studio code until VIM itself adds those features that make a viable IDE replacement. Today, it ain't.
wget https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz -O- | tar zxvf - -C /usr/local --strip=1
And the relevant part of dotfile that adds LSP support and enables a few language servers:https://github.com/d33tah/dotfiles/blob/master/dotfiles/vimr...
You'll also need to run:
nvim +PlugInstall +UpdateRemotePlugins +qa
Personally I was surprised many times how easy it was to add decent support for new languages. It really is a godsend.I also use a buffer explorer plugin and LSP servers too (go to definitions, find references, etc.), but buffers and fzf alone can be very powerful.
The Vim author was against adding :term but their hand was forced by the success of neovim from what I understand.
i stopped using tmux because now all i need to do is open a terminal buffer in a new split to multiplex. i rarely used it for sessions, but use abduco[1] for that now when i find the need.
In other words, screen handles persistance and the ability to reattach to an existing session. The outer vim serves as a terminal manager. The nested vim instances are used to edit code, etc.
I think it's actually more likely to be useful for you (or anyone) to get intrigued, fire up vim, and use, say, `:help :term`. At least, that's what I'm off to do!
Drag your mouse while pressing meta on VS Code. I certainly think Vim is powerful, and I've spent enough time in it to be able to edit a file solely via ex. But I think VS Code is making some awesome progress, too. I like using the two editors together
Yeah, what? Seriously?
JetBrains: command-shift-8 to toggle column select mode.
And if you forget that, just control-click and you can select it in the popup menu.
The only explanation for boneheaded statements like these are that vi/emacs nuts haven't used a modern IDE in decades.
Doesn't help that I use a Windows keyboard on Mac some days, and a Windows machine on others.
Also mice suck (but are orders of magnitude better than track pads), I always find selecting columns this way to be super finicky and I often have to do it twice to get it just right.
* Keyboard command that requires no counting or precision and has no easily-confused variants. In almost all editors this encompasses up, down, left, right, home, end, select or delete a line, and so on; some editors have more sophisticated ones like "select all in enclosing characters", or Vim's non-parameterized text objects ("cw" for "change word" as opposed to "dt6f" for "delete to the sixth occurrence of 'f' or maybe to the character in front of it, I always forget which").
* Mouse selection in any editor that lets you do multiple clicks to change selection object (e.g.: single click character, double click word, triple click line; on a Mac this is nearly any editor, including the text box I'm typing in right now). This isn't as precise as a correctly-executed keyboard command like "dt6f" or some Emacs equivalent, but it requires less cognitive switching: you don't have to think about the command and you don't have to do any counting. You just know you want to select from there to there. If you mess up, it rarely requires any effort to recover.
* Keyboard commands that require you to think carefully before composing them. This is where Vim, god love it, sometimes falls down hard. I know exactly what I want to select, but I have to stop and think about the "best" way to select it, and if I screw it up, I have to get back to where I was and try again -- which may require yet more thinking. I don't doubt that there are people who are just super good at this and get it right first try evey time, and those people are... well, probably not much faster than someone who gets selection right with the mouse every time.
tl;dr: Mice do not suck, and I like trackpads, dammit.
Keyboard does that better than mouse IMHO. Alt-arrow to skip between words, alt-shift-arrow to select word to left or right.
Use correct meta or home/end key along with shift and arrow key to select the entire line, based on your platform of choice.
I'd like to see some more intelligent selection hotkeys though. JumpingBetweenCamelCase, "everything inside the quotes" { data:'inside', the:'braces'}
> Use correct meta or home/end key along with shift and arrow key to select the entire line, based on your platform of choice.
Ideally this is just one command, I think, like Cmd/Ctrl+L for "select current line". :)
> I'd like to see some more intelligent selection hotkeys though. JumpingBetweenCamelCase, "everything inside the quotes" { data:'inside', the:'braces'}
The only editor that I've found that does both of those out of the box is BBEdit for the Mac, which uses Ctrl+left/right and Opt+left/right to navigate and select by word but Ctrl stops for camelCase and underscore breaks while Opt doesn't. And Cmd+B, "Balance," selects text between enclosing characters in the current scope: brackets, parentheses, quote marks, etc. I'm not sure why equivalents to these aren't more common in other editors.
I find it easier to, instead of remember another command, remember "jump to start of line, select entire line."
Mentally composable and it works in all text input boxes across the entire system. (MacOS, cmd-l selects current line in VS-Code, jumps to URL bar in Chrome.)
IMHO the problem is getting stuff to be system wide. Per editor hotkeys, or even worse. hotkeys added by plugins, cause dissonance when I sit down at someone else's computer, or just switch apps.
Someone's already made plugins that embed a Neovim instance right inside VSCode[1] and Sublime Text[2]. There's no emulation here, just straight up neovim running behind those buffers. I've tried VSCode with that plugin (though personally I like to stick to just neovim when I can), and I can say that despite some minor bugs it's been a pretty smooth experience. Even stuff like `gt` to change editor tabs is supported.
[0]: https://neovim.io/
Does vscode-neovim work around this somehow?
My main computer is also a Mac and I also need to copy text to and from multiple machines and the host machine, and while I don't write C++, I do write other languages on all the remote machines -- and BBEdit lets me do that a lot more easily, since it has menu commands for save/open over FTP/SFTP. But it's certainly not unique in that regard. (Personally I've found Vim's netrw implementation of this a bit clunky and never got Emacs's functionality for this working quite right, although "Never Got Emacs Working Quite Right" may be my epitaph).
But...
Vim bindings also feel like they have accumulated 40 years of cruft and evolved into some severely localized maxima. I'd be really interested in other attempts to do modal editing. Are there other attempts out there?
(Disclaimer: I use vim and vim bindings a lot but I am not really a vim power user.)
https://github.com/mrkkrp/modalka
https://github.com/fgeller/fingers.el
I believe I've seen at least one standalone editor focused on this, too, but I don't recall where.
Thanks!
Edit: And, as had to be the case, someone has made a simple simulation of Kakoune for Emacs: https://github.com/jmorag/kakoune.el
Years later, I started thinking that sooner or later, a simpler, better alternative would emerge.
It's 2020, and I'm still waiting.
The biggest downside for me is I don't think autocomplete is on par with other IDEs (even with YouCompleteMe, which is great). To be fair, this would be a massive challenge, considering how generalized vim is vs. an IDE like Xcode — which is purpose-built for writing Swift/ObjC. I feel like half of the time in Xcode I'm just hitting tab, and the code writes itself. I want that same experience in vim.
That said, after use it extensive in the past, unless your editing code in a potato, for more complex work, I don't see a reason to learn advanced commands. You will be more productive with a modern text editor.
- opens instantly
- does side-by-side file viewing with reasonable text size and low enough clutter for a laptop screen
- offers a great deal of editing power with no need for any extra preparation
Starting to work -- particularly at irregular times -- is much more fluid with vim. I usually need to take a deep breath before opening an IDE. Vim is just there, at my fingertips, all the time, and few competitors offer that experience.
I can't even count the times I've accidentally written :w into a document while using an editor without vim bindings.
The most significant, real benefit is the ubiquity, and the ubiquity is a function of tradition, vim's size, and its portability. This leads to its use because its 'the only option, not because 'its the best (or even good) option'. There's no arguing against the benefits of the ubiquity; its on almost every device that runs linux or unix like OS.
What really separates vim from the real day-to-day competition is the abysmal usability. From the complete lack of visibility and discoverability to the numerous modes, vim is a hall-of-shame when it comes to UX and UI. The original post even points to this stack overflow question with 3k upvotes and a top answer of 5k upvotes asking simply 'how do I quit vim': https://stackoverflow.com/questions/11828270/how-do-i-exit-t...
I don't think it's fair to ask every user to read the man pages, read a book, take a class, or go through a tutorial on how to use vim. If most users can figure out notepad.exe or TextEdit.app without reading a manual or taking a class, I think it's fair to say vim loses the usability battle, regardless of how powerful of a text editor it is.
I find most evangelists of tools have jumped from some feature anemic tool (notepad.exe or notepad++) to a more powerful tool (like notepad++ or visual studio, respectively) and decided "theres no way anything is better" then plug their ears to hearing about better tools. Nothing could possibly beat the amazing tool they use now!
JetBrains tools are less ubiquitous than vim, and sure take up more disk space. But the usability and power, as far as I can tell as I am no vim expert, far exceed that of vim. If I'm going to pick a daily-use tool, it's not going to be the one so small it fits in the tiny memory of my router, I'm going to pick the tool that with the most utility.
The original article should simply say "In many cases, vim and emacs are your only two options. When you are forced into that corner, you better know at least one of those two tools. You should learn vim because it's the (just barely) easier to use of the two ubiquitous editors."
But being able to connect via serial port to some crappy stripped down Linux and knowing vi is there is a good feeling and it asks nothing of you in return.
lookback: vi, sh and unix have become your vim, bash and linux systems of today. Now, while they have forward compatibility, of sorts, vi and sh, the same cannot be said in reverse, as a rule. Modern bash folks have bent bourne shell syntax into foreign looking contortions where bourne shell syntax is a) performant and conformant, b)a lot simpler when simpler is better and c) is why bash maintains posix.
I agree, learn basic vim. And bash. But not really to program with. It's more of a burden than not for a million languages and formats.
The busybox implementation kinda sucks at times, but I can't complain given that they've obviously focused on size.
Although, surprisingly, most command-line interfaces and command-driven apps (like redis client and psql) use emacs key bindings for command history.
set editing-mode viTo exit vi or vim, press Esc then type ":q" (without quotes) and hit enter.
If it warns you about not saving, try ":wq" to save and quit or ":q!" to quit without saving.
If this is in the article video I apologize, but I did check and it's not in the article text.
I get that it's efficient once mastered but I just can't push that kind of thing to the top of my to-do list. I'll spend my time learning French or something
How to get there? Press Q in normal mode.
What is it about? To punish you for trying to type while still in normal mode, or for having fat fingers. An opportunity to type "visual" to go to Normal mode.
They're fluff. Somewhat easy to write and generally find an audience in both the users and the wannabes.
They will write articles about how to use Vi/Vim long after I'm dead :-)
They're one of the social discussions that hackers have, just like football fans discuss about Pele vs Maradona (or these days Messi vs Cristiano Ronaldo), boxing fans argue about Muhammad Ali vs Mike Tyson, etc.
The issue is with HNers who have promoted it and highlighted it.