Skip to content

Instantly share code, notes, and snippets.

@nickangtc
Created April 29, 2024 20:24
Show Gist options
  • Save nickangtc/afca697a06162a44b30bbf5122db03a8 to your computer and use it in GitHub Desktop.
Save nickangtc/afca697a06162a44b30bbf5122db03a8 to your computer and use it in GitHub Desktop.
Notes taken entirely in Vim mode in VS Code while learning Vim :D

Notes learning Vim

Vim's modes enable Vim to have sane keyboard shortcuts instead of Cmd + Shift + whatever the hell next. In Normal mode, w jumps to the next word. In Visual mode, w highlights from current cursor position to the next word. In Insert mode, well w types out the w character.

j goes down instead of up - is this an arbitrary decision? I think not? My intuition says it's down instead of up, and k is up instead of down, because we go down much more often then go up, and it makes sense to let the stronger middle finger do that.

Navigating up with k skips to start of paragraph?? This surprised me. I also got annoyed quickly not being able to move up a line by hitting k or h (left), which you can do in a normal text processor. I'm sure there is a way to do this I don't know about... Yes! b (move back one word, which is like the reverse of w) does something like that.

Motions are commands that you use in Normal mode for navigating faster. There must be a way to go back on cursor position up to the previous line, or something paradigm-shifting to do something similar...

Commands (normal mode)

e - end of next word

ge - end of previous word

w - next word

W - next WORD

f{character} - find next occurrence of character in same line

F{character} - find previous occurrence of character in same line

t{character} - till next occurrence of character in same line, but not further

T{character} - reverse of t{character}

; - next character search (e.g. fd then ; means fdfd)

, - previous character search (e.g. fd thhen , means fdFd)

0 - move to first character of a line

$ - move to last character of a line

^ - move to first non-blank character of a line

g_ - move to last non-blank character of a line

Jumping around fast

} - jump one paragraph down

{ - jump one paragraph up

Ctrl D - jump half page Down

Ctrl U - jump half page Up

/{pattern} + Enter - jump to next occurrence of pattern (regex OK)

?{pattern} + Enter - jump to previous occurrence of pattern

n - jump one occurrence in direction of previous command

N - jump one occurrence in opposite direction of previous command

gg - jump to top of file

G - jump to bottom of file

{line}gg - jump to specific file line

* - jump to next occurrence of word under cursor

# - jump to previous occurrence of word under cursor

Jumping around semantically

Vim apparently doesn't just let you navigate around like you're wading around a bunch of text; it's able to let you navigate around taking into account the semantic meaning of the text.

For example, here's a very typical snippet of JavaScript:

const users = [
  { id: 1, name: "foo" },
  { id: 2, name: "bar" },
];
const userIds = users.map((u) => u.id);

% - jump to end/start/end/start of nearest enclosing {} or [] or ()

gd - go to definition

Enabling smart relative line numbers

In VS Code > User settings JSON, add this:

"vim.smartRelativeLine": true

With this I'm able to jump to very specific lines with {count}{command} pattern, like 21j brings me 21 lines down to the exact line I want. The cool part is that the 21 line number is relative to my current cursor position!

Undo / redo

u - undo

Ctrl r - redo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment