Some Neovim tricks
[nvim]{.spurious-link target=”nvim”} [keymap]{.spurious-link target=”keymap”}¶
\< C-Y > scroll-up¶
\<C-U> scroll-down¶
H, M, L go to high/middle/low it should move to first non empty line¶
d33| | moves the cursor to the specified column in the current line¶
Find replace¶
& stands for the matched words¶
press * and do :%s//xxx/ the search is omitted and it is the current selected word¶
Move around¶
+ - can also be used to move to + Move to first none empty char of next line¶
<CR> can move to head of next line¶
word and WORD¶
The difference between words and WORDS is that the former only include letters, digits and numbers.¶
word can be a sequences of spaces. do dw inside a sequence of space and see what you get. w, b, e, ge are word motions.¶
W move on WORD boudnary. following are WORD helloVimWord(){}, [1,2,3,4,5] etc¶
i a; there is also I and A insert at begin of line and end of line¶
Y yank; it is same as yy; P past above¶
s and S was remapped in hop/leap. s -> cl S -> cc¶
**
X delete char left of cursor (\<BS> in norm mode)¶
command range and g / v command¶
:. current line¶
:% entire file¶
`$~last line¶
*** ~:12` line 12
:12,14s/import/export/g replace from line 12 to 14¶
:.,.+12 from current line to current line + 12¶
:.,$ from current line to eof¶
:g/import/d delete lines include import¶
:g!/import/d delete lines do NOT include import it same as v command :v/import/d¶
motion vs / command¶
all motion can be replace with find / command. e.g dft can also be d/t<cr>¶
delete¶
d0 delete to begin of line¶
use s to delete¶
-
:%s/abc//<CR> -
it can also write as
:%s/abc<CR>
db backward delete word¶
dvb and dve delete inclusive ; dvge;¶
das dap¶
dF* search backward and delete¶
with surround di* ca* da* etc¶
dh delete 1 char to the left; d3h delete 3chars to the right¶
*
#vimg¶
g0 go to 0; same as gg¶
ge jump back end of word¶
g& it similar to macro, a command in Vim that repeats the last substitution (:s) command on all lines in the file. It's equivalent to :%s//~/g, where // reuses the last search pattern, and ~ reuses the last replacement string.¶
gJ join [cnt] lines J: join with remove indent, also works in visual mode¶
gq format text¶
wrap: gj, gk jump inside long lines , g$, g^¶
g<C-A> in visual mode/range, increase number of each line based on fist value in range. e.g. 1 1 1 1 -> 1 2 3 4¶
gu|U + text obj capitalization, e.g. gu$ guW, guu whole line, gU3w, gufk (lowcase to letter k)¶
`g~` similar to gu|U¶
gv re-select text¶
g& apply the replace changes to full document. It is helpful when you need to replace in one line and check if replace is correct and apply to full text¶
*
Search and replace¶
*%s/.$/&;/* .$ match a none empty line `&~is what was matched¶
*** ~:v/^\(/s/\)/;`
-
:vinverse find/^$is empty line -
/s/$/;command ofv; replace EOL to;
\ze: \ze Zero-width ending split the search pattern into two, first half is match can be used later on, e.g. end\ze(if|for) match both endif and endfor but the matched pattern is end so :s/\vend\ze(if|for)/&_/g replace endif to end_if¶
put=range(1,10) add 1~10 to buffer¶
<C-R>= e.g. <C-R>=range(1,10) use register with value of expression¶
indentation¶
v> indent current line to the right¶
>G indent from current line the the end of file to the right¶
=G remove indent from current to eof¶
>{ indent to right from begin of block to current line¶
= in visual mode, indent current line (based on context)¶
>> indent to the right with normal mode¶
https://www.vimgolf.com/challenges/596dd9ca448256000c000011¶
https://www.vimgolf.com/challenges/5ba020f91abf2d000951055c¶
Fugutive diff merge¶
reference http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/¶
Gdiff are used to merge diff conflicts. You can also use Gvdiffsplit! It opens¶
left(the branch you used to work on, or local branch) . The buff is named as fugutive//2¶
middle the current working file,¶
right buffer which is the remote branch that you trying to merged into current branch (remote). the buffer named fugutive://3¶
If the cursor in middle buffer, diffget //2 get changes from left file and use ]c to jump to next merge conflict. and use diffupdate to refresh file¶
when done, use only to close other windows¶
You can use diffput 1 to put changes throught. in fugutive, dp default alias to diffput 1¶
Gwrite!¶
Diffview¶
If git in merge status, DiffViewOpen will show the conflicts files¶
<Leader>co|ct|cb|ca select Ours, Theirs, Base and All or dx choose none¶
**