[HN Gopher] A Vim Guide for Advanced Users
       ___________________________________________________________________
        
       A Vim Guide for Advanced Users
        
       Author : asicsp
       Score  : 448 points
       Date   : 2021-02-27 13:06 UTC (9 hours ago)
        
 (HTM) web link (thevaluable.dev)
 (TXT) w3m dump (thevaluable.dev)
        
       | forgotmypw17 wrote:
       | What an amazing guide, as well as the others. I think these are
       | the best Vim guides I've ever read. Vim user for years.
        
       | lucb1e wrote:
       | The article mentions gI but that's 3 keystrokes (g, shift, i)
       | when you can do 0i, and you probably want to know about 0 and i
       | regardless, making the extra learning of gI unnecessary.
       | 
       | Unfortunately this doesn't help anyone because it's not as if by
       | deleting gI from your memory you can more easily learn something
       | else, but perhaps it's helpful for a future guide writer or
       | perhaps someone knows why gI is useful.
       | 
       | Edit: The section "The Insane Expression Register" also doesn't
       | make much sense to me. Why would I do this 'system("ls")' thing
       | when there is '!ls'? Using vimscript instead of bash probably has
       | advantages in, y'know, vim, but most people know their shell and
       | probably very few people know vimscript (certainly not me) so I'm
       | not quite clear on the advantages here.
        
       | ravoori wrote:
       | As far as I am concerned, this constitutes a good read for the
       | VIM pro. It's a shame that critical comments tend to bubble up to
       | the top on HN
        
       | OskarS wrote:
       | The article mentions "gn" in passing, but it doesn't give it
       | enough credit: this is an enormously useful motion, almost more
       | useful on its own than the rest of the article.
       | 
       | The thing that makes it golden is that it is a motion, and thus
       | combined with a command, it is repeatable! So, like:
       | 
       | 1. Search for something (either using / or *).
       | 
       | 2. Type "cgn" in Normal mode (i.e. change next search match) and
       | replace what you searched for with whatever
       | 
       | 3. Hammer on "." (i.e. repeat last command) to replace other
       | matches.
       | 
       | This replaces, like, 97% of uses of :s and is a much more
       | convenient way to do search/replace, especially if you use * to
       | search for the word under the cursor. It's the bee's knees!
        
         | erostrate wrote:
         | Thank you so much! I've been using Vim for 5 years and I always
         | thought :s was one of the major pain points.
        
         | thanato0s wrote:
         | Yeah I know the trick and I explain it a bit more in another
         | article on my blog.
         | 
         | Most of the time it's more keystrokes than using :s though, so
         | I'm not a big fan of it. But I see the appeal :)
        
           | typon wrote:
           | I'm paranoid and I like seeing exactly what I'm replacing. In
           | that case I still use :s but I always end it with
           | :s/foo/bar/gc. Although I do see the appeal of cgn for simple
           | replacements.
        
             | thanato0s wrote:
             | If you use Neovim, you can set the option inccommand:
             | 
             | set inccommand=nosplit
             | 
             | It will display the substitute directly in the buffer.
        
         | petepete wrote:
         | So I've been using vim for nearly twenty years and didn't know
         | this. I also never touch visual mode make any advanced use of
         | buffers or marks. I feel like some kind of caveman now.
        
         | simias wrote:
         | Oh man, I knew there had to be a way to do that but I couldn't
         | find it, so I always resorted to counting the number of
         | characters in the match and then use cl<num> to replace it if
         | there was no convenient motion like some kind of barbarian.
        
           | bobbyi_settv wrote:
           | The non-barbarian way to avoid counting characters when
           | there's no convenient motion is visual mode. Hit v, then hit
           | l until you've highlighted the part you want to change, then
           | hit c to start changing it.
        
             | simias wrote:
             | Oh I never thought about that either. Thank you.
        
               | bobbyi_settv wrote:
               | I rarely actually do it because f and t motions, possibly
               | with a number, can usually handle these cases. For
               | example, c3tA to change up to but not including the third
               | capital A after the current position
        
               | tasuki wrote:
               | If it's more than one 'A' I'd use visual mode. I'm always
               | impressed people can accurately count up to like three ;)
        
         | hpfr wrote:
         | The author does mention this in an in-depth article on search:
         | https://thevaluable.dev/vim-search-find-replace/
         | 
         | It's pretty comprehensive. Personally I'd just install Doom
         | Emacs though :)
        
         | aaimtts wrote:
         | This is very useful, thank you! How would you go about pasting
         | the "replace" part though?
         | 
         | I could only think of this rather awkward sequence:
         | 
         | 1. Yank to named register
         | 
         | 2. Search
         | 
         | 3. "cgn"
         | 
         | 4. Ctrl-R to paste from named register
         | 
         | 5. Repeat
         | 
         | This is actually the biggest gripe I have with vim, even after
         | almost 10 years of constant use. Vim always seems to overwrite
         | the default register when I don't want it to. This makes
         | replacing multiple bits of text with one pasted value awkward.
         | I feel like I'm missing some essential shortcut or
         | configuration that everybody else knows. It can't just be named
         | registers, right?
        
           | tvrg wrote:
           | You can slightly simplify your workflow using the yank
           | register 0.
           | 
           | 1. Yank using y without specifying a register
           | 
           | ...
           | 
           | 4. CTRL-R 0
           | 
           | Deletes and changes don't touch the 0-register. It always
           | contains your last (unnamed) yank.
        
         | throwoutttt wrote:
         | As someone who uses this regularly, it's still not as
         | convenient as multi cursors that most modern ides give you.
         | 
         | There's a vim extension for multiple cursors but it's a little
         | buggy.
        
           | OskarS wrote:
           | I dunno, I've also used both, and I keep coming back to the
           | Vim/gn way of doing it, I just like it more. I see how people
           | can feel otherwise, though.
        
             | boogies wrote:
             | Yeah, not everyone is the same, but there are definitely
             | people interested in multi-cursor modal editors, enough to
             | build their own, eg. vis0 -- a light, fast, and simple text
             | editor with a pretty standard vim normal mode but sam's
             | structural regex command language1 for creating and
             | procedurally editing selections in command mode2, and
             | kakoune3 -- known for switching vi's word order from verb
             | noun to noun verb, so typical normal mode commands work by
             | first creating one or more selections with motions (no need
             | to press v), and only then operating on them. And of course
             | Emacs has multi-selection modes and AFAIK they're
             | compatible with evil.
             | 
             | 0https://sr.ht/~martanne/vis/
             | 1http://doc.cat-v.org/bell_labs/structural_regexps/
             | 2http://doc.cat-v.org/bell_labs/sam_lang_tutorial/
             | 3http://kakoune.org/
        
           | lucb1e wrote:
           | As someone who never used a multi-cursor IDE (I've seen other
           | use it but not in a convincing way): what's something that
           | you use this for that you don't think vim can do?
           | 
           | The main purpose I've seen is basically block mode (like
           | ctrl+v) or (iirc) repeating things on multiple hits (like n.
           | or indeed cgn).
        
         | usmannk wrote:
         | Why is this preferable to :%s?
        
           | kadonoishi wrote:
           | It allows you to use a full Turing machine rather than
           | restricting yourself to a Finite State Machine.
        
           | simias wrote:
           | It composes better if you were searching for something and
           | then want to replace it IMO. You basically just have to
           | remember the search syntax and then you can reuse it for
           | replacing.
           | 
           | It's also better if you don't actually want to replace in the
           | whole file and there's no convenient shorthand for the range.
           | 
           | I very rarely use :s myself, I'm always too worry that I'm
           | going to clobber something I didn't mean to, I prefer to
           | search and manually repeat a substitution. s can do it with
           | with the "c" modifier but I find that using normal edit
           | commands is both more flexible and easier to remember.
        
           | RMPR wrote:
           | I find it more intuitive, and for a small number of
           | iterations it's definitely faster.
        
         | asicsp wrote:
         | Ooh, sounds interesting. I'll have to look up the details. I
         | currently do this after a search with / and regex (if it is a
         | bit complicated)                   :%s//replace/gc
        
           | stjohnswarts wrote:
           | This is what I do, I use regex's so often it's easier for me
           | to read this even if it's a little bit more typing
        
         | RMPR wrote:
         | Awesome, that's definitely something I'll add to my bag of
         | tricks. But
         | 
         | > This replaces, like, 97% of uses of :s and is a much more
         | convenient way to do search/replace, especially if you use * to
         | search for the word under the cursor. It's the bee's knees!
         | 
         | I'm not really sure about that. I can definitely see it
         | replacing :s for a small number of repetitions, but for a large
         | number. I think using :s with a range is quicker.
         | 
         | Edit: typos, punctuation
        
           | thesteamboat wrote:
           | I too wish to add this to my repertoire. I don't think it
           | will replace :s, but occasionally I find myself copying a
           | line to use as a template. When I go to change each line I'm
           | changing a particular part to different things. Assuming I
           | remember, this trick seems like a good approach.
        
         | lucb1e wrote:
         | I used to do n.n.n.n. to do the same (i.e. /search something,
         | then do the replacing with something like cw or 3s or ct' or
         | whatever you want, and then hit n for next result and . to
         | repeat the change). Using cgn is less flexible and you need to
         | learn another thing (you know about n and . already by the time
         | you get to cgn), and maybe it's just me but hitting n.
         | repeatedly is practically equally fast as just hitting the dot.
         | 
         | It also has the downside that it doesn't match what is being
         | shown: when I hit * on "overview" it highlights both "overview"
         | and "Overview" (I have highlight search enabled), but cgn
         | replaces only one of them. When the cursor is on Overview and I
         | run "*cgnexample<esc>..." it will skip all the "Overview"s and
         | only replace "overview".
         | 
         | But perhaps it's a bug in Vim since it works when I run * on
         | the lowercase variant.
        
           | Skunkleton wrote:
           | This might be the right audience for this little vimrc
           | tidbit:                   "Press space to highlight current
           | word         nnoremap <silent><space>             \ :let
           | @/='\<<C-R>=expand("<cword>")<CR>\>'<CR>:set hls<CR>
           | 
           | This works just like *, except that it leaves your cursor
           | where it is. You can then use n/p/whatever as normal.
        
             | lucb1e wrote:
             | > like * but leaves your cursor where it is
             | 
             | Ooooh that is great! I use *# every time and am then
             | annoyed when the n key goes backwards instead of forwards
             | and then I try to remember to do #* instead and pff... ^^
             | This will solve those issues!
        
             | revscat wrote:
             | This is useful enough that I wonder why you chose not to
             | just map it to *. Is there a reason you did not?
        
         | sanderjd wrote:
         | That does sound useful, but I do this with `:s/foo/bar/gc`,
         | then I press `y` each time, which is pretty similar to pressing
         | `.` each time in your example. I do like that the `cgn`
         | approach works better for something you searched for without
         | knowing a priori that you were going to do a replacement on it.
        
         | trigoman wrote:
         | I was looking on how do this exact thing! Thank you! In
         | IntelliJ I press Alt+j to add to selection then I can edit all
         | matches. You just described how to do the same effect in Vim
        
         | [deleted]
        
         | mushishi wrote:
         | Just tried this. Note for others: between 2. and 3. you need to
         | get back to normal mode (which is kinda obvious but...)
         | 
         | Thank you for the tip.
        
         | johncoltrane wrote:
         | Maybe you will like these little gems I came up with back when
         | the gn patch was merged:
         | 
         | nnoremap <key> *``cgn
         | 
         | nnoremap <key> #``cgN
         | 
         | Hit <key> to change the current word and ... to repeat on the
         | next occurrences.
        
         | nightcracker wrote:
         | This has one huge shortcoming: when the next match is off-
         | screen, pressing . jumps immediately to the next match and
         | replaces it, before you had the opportunity to review whether
         | you want that.
         | 
         | To solve this I wrote a little plugin (that I finished as a
         | plugin yesterday and uploaded just now):
         | https://github.com/orlp/vim-quick-replace
         | 
         | It requires vim-repeat (and a patched one because the current
         | one has an issue): https://github.com/orlp/vim-repeat
         | 
         | The nice thing is that it always jumps to the next match
         | _before_ replacing, and if you choose to replace the current
         | match it _immediately_ jumps to the next one, so that you can
         | evaluate whether you want to replace it.
         | 
         | You can start in two quick ways: using the current word under
         | the cursor or the current visual selection, so it's very
         | flexible. For me replacing a variable name is often just
         | putting my cursor on it, pressing space + r, typing the
         | replacement name and then a couple .'s, n's and if I mess up
         | some u's.
         | 
         | To see it in action: https://i.imgur.com/wEX6O1w.mp4
        
           | tasty_freeze wrote:
           | I'm not sure exactly what your plugin does, but are you aware
           | of the "c" flag to substitute, eg
           | 
           | :%s/debug/dbg/c
           | 
           | vim will show the text which is about to be modified, and you
           | have a prompt to confirm, skip, or quit (and some others).
        
             | nightcracker wrote:
             | Yes, I am aware, but it's not nearly as flexible and quick.
             | It doesn't allow me to in the meantime move my cursor
             | around, switch buffers, undo, open/close a fold, etc. It
             | takes complete control of your workflow to temporarily put
             | you in some special 'search/replace mode' in a very non-
             | Vimlike manner. My plugin has a simple operation (if cursor
             | is on a match, replace, regardless jump to next match) that
             | gets repeated with ., combined with nN and u and you have
             | complete control while also rapidly doing search/replace.
             | 
             | And you would still need some nice mappings to substitute
             | the word/selection underneath the cursor with :%s///gc.
        
               | chrismorgan wrote:
               | If using the [c] flag and you want to interrupt it, a
               | convenient way of continuing where you left off (and
               | _not_ touching previous lines, which may have new
               | matches, depending on the nature of the replacement) may
               | be :.,$ &&<Enter>, which means "operating on the range
               | current line (.) to end of file ($), execute the last
               | substitution (&) with the same flags as last time (&)".
               | 
               | (This is very unlikely to interest _you_ , but I mention
               | it for the sake of others. I've commonly seen people not
               | really know about ranges especially, never stopping and
               | thinking about what the % means (see `:help :%` if you
               | don't know), beyond _possibly_ having encountered  '<,'>
               | by accident when pressing : in Visual mode (for
               | explanation of these, see the help for :', '< and '>).)
        
           | thomastjeffery wrote:
           | But if you're not sure you wanted it, you can just press u to
           | undo and n to skip.
           | 
           | Since Vim keeps an undo tree, you are guaranteed not to lose
           | anything anyway.
        
           | coliveira wrote:
           | You can just type n, followed by ., to view the next match
           | before changing it.
        
             | nightcracker wrote:
             | I used to do that but my brain messes up "n." for replace,
             | "n" for skip, whereas "." for replace, "n" for skip is
             | really easy.
        
           | bxparks wrote:
           | That's a good point about previewing. So instead of "cgn", it
           | looks like you can do "gns", which highlights the match, then
           | enters into substitution mode, and you type the replacement,
           | then hit <ESC>. Then you can hit "n." "n." "n." repeatedly,
           | where the "n" goes to the next match so that you can preview,
           | and the "." applies the replacement. Not quite as efficient
           | as a single ".", but the "n." sequence is a familiar one.
        
           | tvrg wrote:
           | Is this much different from searching with * or :s for a
           | match and use something like "ciwReplacement<Esc>", then "n."
           | or just "n" if I don't want to change the match? I can
           | imagine that the plugin works in more complicated cases, but
           | most of the time I probably just want to replace a word with
           | ciw or ciW.
        
             | nightcracker wrote:
             | Well, assuming you already have a plugin or mapping that
             | makes * search your visual selection, it's similar.
             | 
             | You'd have to do *, then N to back to where you just were,
             | then cgn, type your replacement, and then n., n., n., n
             | (skip), n., etc.
             | 
             | With my plugin that just becomes one mapping, type your
             | replacement, ., ., n (skip), ., etc.
             | 
             | It's just very smooth, which I like because I use this
             | operation literally all the time. Hell, I'll even use it
             | when changing a single variable, just to make sure there
             | isn't another sneaky one in the file somewhere.
        
           | ThrustVectoring wrote:
           | IMO the "correct" way to handle this is with vanilla vim's
           | built-in macros. Find the next match, record a macro making
           | the edit you want, then find the next match and finish
           | recording the macro. The macro _starts_ with the cursor over
           | the match you want, the edit can be more complex than a
           | simple replacement, and skipping is simply a matter of
           | pressing `n` instead of `@@`.
           | 
           | Vim can also take a command that yields a list of filenames
           | as a launch parameter via something like `vim $(ag -l
           | target_string)`, letting you go through each file with a
           | `:n`, letting you complete large refactors surprisingly
           | quickly.
        
       | orthecreedence wrote:
       | Thank you! Two things I really got from this:
       | 
       | Capital marks. I use ma or ms and `a `s a lot, but did not know
       | you could do global marks with mA and `A. Very useful!
       | 
       | I've been using `` for a long time to mean "go back to the last
       | place I was editing" but sometimes it gets overridden when
       | navigating (I'm not super familiar with the jumplist, so maybe I
       | need to get a better understanding) but `[ and `] are exactly
       | what I've been looking for all these years.
        
         | danidiaz wrote:
         | > did not know you could do global marks with mA and `A.
         | 
         | Incidentally, the "Vimium" browser extension also supports
         | those marks with the same syntax; they're an interesting
         | alternative to conventional bookmarks for frequently accessed
         | pages. https://github.com/philc/vimium/blob/master/README.md
        
         | thanato0s wrote:
         | You should try g; and g,
         | 
         | You'll go through the change list. I think it's what you want.
         | 
         | I explain it in the article vim-intermediate on the same blog
         | :)
        
           | orthecreedence wrote:
           | Yes, thank you, I just read that article as well and that is
           | what I was looking for =]
        
         | ryannevius wrote:
         | I use global marks for things like my .vimrc (`V), .zshrc (`Z),
         | and other config files that I edit semi-regularly. Definitely a
         | useful tool for the box.
        
       | Agentlien wrote:
       | This was a really nice refresher and I learned a few new cool
       | tricks (like gx).
       | 
       | I'm a bit surprised that the 'u' flag for sort wasn't mentioned.
       | That's the most useful one in my mind and I use it almost every
       | time.
        
         | residualmind wrote:
         | My thoughts exactly about ':sort u'
        
           | lucb1e wrote:
           | The u option making it keep only unique lines, for anyone
           | else left wondering.
           | 
           | Personally, instead of re-learning how to do stuff with vim-
           | sepecific commands, I just use the existing command line
           | tool, especially since I don't do this on a daily/weekly
           | basis (but I use sort in command line pipes at least weekly).
           | The command is literally "sort" and for unique you just pass
           | the -u flag, e.g. select something in Vim and type :!sort -u
        
             | ravoori wrote:
             | Vim's sort is handy on Windows where the option to shell
             | out usually doesn't exist. Additionally you have the full
             | power of Vim regex to sort on subsets of lines.
        
       | dllthomas wrote:
       | The section on the quickfix list should include cbuffer, which
       | puts the contents of the current buffer in the quickfix list.
        
       | cma wrote:
       | Is there a good way by default to wrap a visual selection in
       | braces/parens/brackets?
        
         | ludsan wrote:
         | I use vim-surround. https://github.com/tpope/vim-surround
        
         | SpaceNugget wrote:
         | A fairly easy way to do it is either
         | 
         | c()^[P or c(^r")
         | 
         | The first leaves you in normal mode the second in insert mode.
         | I recommend vim-surround by tpope though.
        
       | rualca wrote:
       | Superb submission! I've been using vim for over a decade and I
       | never knew about gx or gf. Thanks!
        
         | tjoff wrote:
         | Related, gF will also scroll down to the line number if
         | specified as: File.txt:45
         | 
         | Very handy when using a terminal from within vim and looking at
         | compiler errors/warnings or log files etc.
        
           | thanato0s wrote:
           | Nice one. Didn't know that. I'll add it to the article :)
        
         | thanato0s wrote:
         | Thanks for the kind words! I'm happy it helps.
        
         | RMPR wrote:
         | I was meant to write a blog post like this since forever.
         | Anyway, if you want really advanced stuff this[0] is definitely
         | a way to go. As for ```gx``` since I'm using aerc as my email
         | client, a trick I found very useful to open links using only
         | the keyboard is to open an email then rq (reply with quote)
         | search for the link and gx.
         | 
         | 0: https://www.ele.uri.edu/faculty/vetter/Other-
         | stuff/vi/009-in...
         | 
         | Edit: add the bit about aerc
        
           | issamehh wrote:
           | Do you have any more aerc tricks? I use it and do like it but
           | there's a whole lot of basic things even that I don't know
           | how to do. And some things like saving file attachments that
           | I'm not even sure if it supports or if I'm just clueless
        
             | RMPR wrote:
             | You can browse the different parts of your email using
             | Ctrl+J/K when you reach the attachment you can save it with
             | :save
        
           | thanato0s wrote:
           | Wow this looks super interesting. Thanks for sharing :)
        
             | RMPR wrote:
             | No problem, I also wrote a blog post about Vim sessions[0].
             | I think it definitely counts as intermediate/advanced vim
             | material. Great work with your article.
             | 
             | 0: https://rmpr.xyz/Vim-Session/
        
       | jzer0cool wrote:
       | One of my goals is to become a really good vim power user. I am
       | not able to pick up all of these but one here and there.
       | 
       | In the first command gf, once new file opened and then closed
       | (wq), is there a a way to close such that the previous file that
       | was originally opened to return? At moment returning back to
       | shell prompt.
       | 
       | Also curious if there is a way to open the file as a new split
       | screen rather than replacing the entire window?
        
         | [deleted]
        
         | lucb1e wrote:
         | > is there a a way to close such that the previous file that
         | was originally opened to return?
         | 
         | If I understand the question correctly then the answer is ":bd"
         | after ":w"riting the file. If you just want to switch between
         | buffers (switch between the two files) then use ":b#". You can
         | also list open buffers with ":ls"
         | 
         | Someone recently told me of :tabedit, though, and that is
         | lookin' way nicer to me. But I haven't gotten used to it yet or
         | know how to make it work with gf or other handy things.
         | 
         | As for split screen, those are hotkeys I have yet to learn. If
         | someone has an answer to that question, please reply here so
         | the parent commenter and I both see it :)
        
           | Smaug123 wrote:
           | "Split screen" as in make a new window? Sure - `:vs`
           | ("vertical split"), or `:vs filename.txt`. Or there's the
           | "Windows" section on https://thevaluable.dev/vim-
           | intermediate/ .
        
             | jzer0cool wrote:
             | great got both answered perfectly!
        
         | alex_smart wrote:
         | wq writes the current file _and_ closes the current window
         | (which quits vim if you happen to be on the last window). The
         | command to close the current buffer is :bd(elete).
         | 
         | If you want to return to the previous file without closing the
         | new file, you can just use :bp(rev) so that the new file also
         | stays in memory.
         | 
         | Relevant man page is available at :help buffers.
         | 
         | >Also curious if there is a way to open the file as a new split
         | screen rather than replacing the entire window?
         | 
         | CTRL-W f
         | 
         | Another remark: vim's shortcuts are organized in a way that you
         | are often able to guess what the correct shortcut should be.
         | CTRL-W is the common prefix for commands regarding split
         | windows CTRL-W v/s for splits, CTRL-W CTRL-W cycle through
         | windows. So naturally you can guess that CTRL-W f should be
         | open file in split and CTRL-W ] should be jump to definition in
         | split.
        
       | happy-go-lucky wrote:
       | One of my favorites is the Vim's ability to split both
       | horizontally ( <Ctrl>+<w>, then <v> ) and vertically (
       | <Ctrl>+<w>, then <s> ).
        
         | [deleted]
        
       | yewenjie wrote:
       | Nice. I would love to see more advanced guides for vim.
        
         | thanato0s wrote:
         | Oh I don't want to stop there, especially when I see the crazy
         | positive returns I get ;)
         | 
         | So it will come.
        
       | javitury wrote:
       | Those commands may look useless at first sight, but combined can
       | create powerful routines. As an example, my routine to refactor
       | non-typesafe codebases.
       | 
       | - Find the pattern that you want to replace (the last dot is for
       | current dir)
       | 
       | :grep -r 'pattern' .
       | 
       | - Open the quickfix window and check if matches are correct
       | 
       | :copen
       | 
       | - Find and replace the entries of the quickfix list
       | 
       | :cdo s/pattern/replacement/ | update
        
       | nafizh wrote:
       | Practical vim by Drew Neil is hands down the best vim learning
       | resource out there. Nothing even comes close.
        
         | thanato0s wrote:
         | Totally agree with that. That's my favorite book about Vim for
         | sure.
        
         | teeray wrote:
         | Anyone looking to pick this up: I found the best way to consume
         | it is to grab a couple tips at a time (it's structured as a
         | "recipe book") and incorporate them into your workflow. For
         | example, try Netrw for a week, then another week try out folds.
         | You don't have to read it cover to cover to get the full
         | benefit of it.
        
         | dllthomas wrote:
         | What are the high points? Would you expect it has much to add
         | for someone who's been using vim for closer to 3 decades than
         | 2?
        
           | dm319 wrote:
           | In some ways it's quite conceptual about the best way to use
           | vim. Inside the cover there's a quote "I thought I knew vim,
           | but practical vim has massively improved my code-wrangling
           | productivity".
        
         | maxioatic wrote:
         | This book is so good I actually bought it twice. The second
         | time was the ebook edition just so I can pull it up next to
         | Vim. Highly recommend it.
        
         | mesaframe wrote:
         | I thought it will be a 100 page book but hot damn. 487 Pages
         | for what?
        
         | JNRowe wrote:
         | Drew Neil's Modern Vim is also wonderful. While it introduces a
         | lot of plugins in an attempt to modernize the experience, it
         | also includes some excellent notes on standard
         | features(qf/sessions/etc).
         | 
         | I'll also note it covers both vim and neovim, with nice little
         | asides explaining the differences where they matter.
        
       | jimnotgym wrote:
       | Everyone who uses Vim is an advanced user. The rest of us have to
       | be content learning how to get back out of it without closing the
       | terminal.
        
       | lucb1e wrote:
       | The number increment example doesn't seem to work for me. It says
       | to start with this:                   1. a         1. b
       | 1. c
       | 
       | The post says to "select in VISUAL mode the last two lines and
       | hit `g CTRL+a`". So I guess with shift+v select the bottom two
       | lines, and then I hit g, space, and Ctrl+a. I get:
       | 1. a         2. b         2. c
       | 
       | The post says that the last line should now start with 3 instead
       | of 1, or in my case 2. The behavior is the same as when omitting
       | g+space for me. Am I doing it wrong?
        
         | tux1968 wrote:
         | Don't press space. "g" and then "ctrl-a"
        
           | lucb1e wrote:
           | Thank you!
        
         | mklein994 wrote:
         | The docs for this is in `:help v_CTRL-A`.
         | 
         | It should actually say VISUAL BLOCK mode. This is where you use
         | `CTRL-v` to select a block of text. You can read more in `:help
         | blockwise-visual`.
         | 
         | Also see the 'nrformats' option: `:help 'nrformats'`. You can
         | include alphabetic characters to do the same thing with A-Z,
         | for example.
         | 
         | https://vimhelp.org/change.txt.html#v_CTRL-A
        
           | lucb1e wrote:
           | It seems to work in both visual block mode and visual line
           | mode for me, for what it's worth. (When not pressing space as
           | mentioned in another reply.)
        
         | thomastjeffery wrote:
         | Did you try not pressing space?
        
           | lucb1e wrote:
           | evidently not :)
        
       | craigary wrote:
       | Nice, but still wondering if I should know vim since nano is
       | enough for me :)
        
         | scottlamb wrote:
         | I recommend learning the basics. It's great being able to
         | navigate around a file with the keyboard in ways other than
         | arrow keys to move a line at a time. Stuff like hitting "%" to
         | move between matching parenthesis, { and } to move between
         | paragraphs, etc. And if you do any kind of development, the
         | automatic indentation (and < and > to indent and outdent
         | ranges) are hugely useful. All of these are also things you can
         | use in IDEs like VS Code with their vim modes.
         | 
         | The stuff in this article is pretty neat but (even after using
         | vim for about 20 years) most of it doesn't click for me as
         | easily. Eg I don't use marks; I wouldn't think ahead to leave a
         | mark or remember afterward which letter I used for it. Kudos to
         | people who can gain productivity by using this stuff, but I'd
         | need something other than an explanation of what the commands
         | do to be effective with it. I do at least try to use the
         | quickfix stuff; that's a pretty big productivity boost over
         | manually going to the right file and line to fix an error
         | spotted by my compiler.
        
           | dllthomas wrote:
           | > I do at least try to use the quickfix stuff; that's a
           | pretty big productivity boost over manually going to the
           | right file and line to fix an error spotted by my compiler.
           | 
           | I've mapped cnext and cprev to tab and shift-tab, to make it
           | easy to bounce through things.
           | 
           | Also, in my shell I have defined                   alias
           | cbuf='vim - -c cbuffer!'
           | 
           | which lets me do things like "make | cbuf" or "git grep -n
           | foo | cbuf", which is great.
           | 
           | Tangentially, all of this plays well with some things I've
           | built out for dealing with diffs
           | (https://github.com/dlthomas/diff-kit) - dklocs will turn a
           | unified diff into location-prefixed changed lines, dkcov will
           | find the intersection of a diff and a coverage report (very
           | useful for answering the question "how did I break _that_
           | test? "), either of which can be piped right into cbuf.
        
         | yakshaving_jgt wrote:
         | They aren't comparable.
        
         | dehrmann wrote:
         | I know the basics because vi ships with practically ever *nix
         | (unlike Emacs), so it's there for when I need to edit config
         | files, but I do 97% of my real work in something more like
         | IntelliJ, so there just aren't big returns for getting better
         | at vim.
        
           | Smaug123 wrote:
           | The Vi bindings in IntelliJ-based IDEs are pretty damn good
           | in my experience. Certainly I feel a lot happier { and }'ing
           | my way around, and having my `ce` and `gg` and `C`, in Rider.
        
         | Uhhrrr wrote:
         | Even as a daily emacs user I got value out of learning vi a
         | while ago. It's better for some kinds of editing and generally
         | works better than the emacs bindings for job interview browser
         | apps.
        
         | thanato0s wrote:
         | You should just try seriously. First because many CLI have vim-
         | like keystrokes, second because when you're lost on a remote
         | server or on a docker container without nano you can use vi
         | (close enough), and third because it might change your life :D
        
         | lucb1e wrote:
         | Can you tell me how to exit nano without writing changes? Every
         | time some silly default server kicks me into nano I'm
         | absolutely lost and ctrl+c doesn't give you help text like in
         | vim iirc. (Not kidding)
        
           | calmoo wrote:
           | It's CTRL+X and then N to not save changes
        
             | lucb1e wrote:
             | Thanks! Gonna try to remember that combo.
        
               | Smaug123 wrote:
               | It appears in the table of commands at the bottom of the
               | screen by default, doesn't it?
        
               | mkl wrote:
               | You don't even need to remember it. At the bottom it
               | lists keyboard shortcuts, and on the left is "^X Exit".
               | When you press it with a modified file, it gives you:
               | Save modified buffer?
               | Y Yes         N No           ^C Cancel
        
       | benatkin wrote:
       | Vim is getting more popular. Not just within vim, but outside
       | vim! Practically every full-featured editor has a vi or vim mode,
       | and when they say vi, usually they also mean vim.
       | 
       | Things that have nothing to do with vim but are inspired by vim
       | are even sprouting up! And apparently it's OK to name something
       | based on vim:
       | https://groups.google.com/g/vim_use/c/EnSMrx_rGg4/m/d_nVlmLQ...
       | 
       | Edit: In Bram's reply he mentioned the household cleaner.
       | Apparently it's similar to Ajax. That's so awesome.
       | https://en.wikipedia.org/wiki/Vim_(cleaning_product)
        
         | CoffeePython wrote:
         | I definitely agree that it's getting more popular.
         | 
         | I use vim inside VS code as my main editor and love the
         | experience. It was also an easy way to step into learning vim.
         | 
         | I also have a vim product with vim in the name (it's
         | practically the whole name) and haven't had any sort of
         | trademark issues.
        
           | benatkin wrote:
           | Yeah, the current situation, with no registered trademark for
           | vim the editor, seems to be great for everyone! Vim is
           | popular enough that it's unlikely to be taken. However,
           | someone is currently trying to claim Screen for a screen
           | sharing product despite a screen sharing tool called
           | screen(1) having been around for decades, so nothing is
           | impossible.
        
         | teeray wrote:
         | I used to work near a gym called "Vim Fitness"[0] in Cambridge,
         | MA and there were endless jokes about trainers calling out: "H!
         | J! K! L!"
         | 
         | [0] https://vimfitness.com/
        
           | chestervonwinch wrote:
           | I bet it's constantly crowded since no one can figure out how
           | to exit.
        
       | lucb1e wrote:
       | One thing I've never been able to figure out in Vim: why does O
       | (insert new line above the current line and enter insert mode)
       | often wait and hang? And when you start typing, it'll sometimes
       | do random stuff? Is there a way to just make it behave like a
       | true counterpart of o (insert new line below and enter insert
       | mode)?
        
         | leadingthenet wrote:
         | I think I remember having this issue in vim too. Don't remember
         | it ever crossing my mind since I've started using neovim,
         | though, so maybe give it a try?
        
         | drewfish wrote:
         | Took some effort to refine a websearch:
         | https://stackoverflow.com/questions/2158516/delay-before-o-o...
        
           | lucb1e wrote:
           | Thanks! I never use arrows in insert mode so that's an easy
           | choice for me, but removing 'nocompatible' from my vimrc does
           | nothing and setting 'compatible' instead has side effects
           | like not showing what mode I'm in. Not sure I need it, but
           | I'm also wondering what other side effects I'll run into. The
           | help file mentions a ton of things that I frankly don't care
           | enough to comb through. The only thing I randomly spotted
           | (and knew what it meant without digging deeper) is that this
           | also breaks backspace in insert mode. Overall it makes vim
           | feel quite a lot like vi.
           | 
           | Instead, setting nocompatible and timeoutlen=1 (1ms I guess?
           | Help file doesn't say) works fine in my terminal, I guess
           | because it's not over any sort of network connection. I'll
           | give this a go and see if I run into any issues when using
           | these escape-based features (afaik I use those only rarely)
           | over the network.
        
         | [deleted]
        
       | rcgs wrote:
       | gf is a game changer! Great article - hard to soak up so much
       | knowledge at once. Bookmarked.
        
       | khnov wrote:
       | Use nano
        
       | JohnCurran wrote:
       | How does gI differ from I?
        
         | asicsp wrote:
         | `gI` will always go to column 1 whereas `I` will go first non-
         | blank character
        
           | graywh wrote:
           | in other words, I = ^i and gI = 0i
        
         | thomastjeffery wrote:
         | The same way that 0 differs from ^.
        
         | kludgeon wrote:
         | the article has a tricky typo here. it says "The keystroke `I`
         | insert text after the first non-blank characters of the line."
         | 
         | but it should say _before_ the first non-blank, which is
         | equivalent to _after_ the last leading blank.
        
       ___________________________________________________________________
       (page generated 2021-02-27 23:00 UTC)