vim
vim
- Vi IMproved, a programmer’s text editor
Move
Basic - h
j
k
l
Word - w
b
e
ge
Line - ^
$
0
g
G
Paragraph - {
}
Screen - Ctrl+d
Ctrl+u
Ctrl+f
Ctrl+b
Char - f
F
t
T
;
Parenthesis - %
Window - H
M
L
Search
/
?
n
N
*
#
- search with cursor word
Replace
:%s/foo/bar
Insert
i
a
o
I
A
O
Edit
dd
yy
p
x
u
Scroll
z<CR>
zt
zz
zb
Visual
v
V
aw
as
ap
a'
a"
iw
iW
- inner
w
- wordW
- WORDs
- sentencep
- paragraphb
-(...)
blockB
-{...}
blockt
-<>...</>
block<
-<...>
block[
-[...]
block'
-'...'
single quoted string"
-"..."
double quoted string-
`
-`...`
string in backticks ~
- switch CASE
A WORD is always delimited by whitespace.
A word is delimited by non-keyword characters, which are configurable.
Split
:sp
:vsp
Ctrl + w
+ h
/j
/k
/l
Ctrl + w
+ +
/-
/>
/<
/=
/_
/|
Buffers
:bn
:bp
b1
:buffers
:ls
bd
bd!
- delete
Tabs
:tabnew [file]
gt
gT
<N>gt
:tabs
- List the tab pages and the windows they contain.
:tabm[ove] {count}
- move tab to index {count}
:tabc[lose][!] {count}
- close tab
:tabo[nly][!]
- close other tabs
:tabn[ext] {count}
- Go to tab page {count}
{count}
- 1
, +
, -
, +3
, -3
, $
:help tab-page-intro
Leader
\
- default
1
let mapleader = ","
1
:nnoremap <leader>h :noh<CR>
Links
<c-]>
<c-o>
:cmd
:help
:set all
:set {option}!
:set invlist
: ^I
表示一个tab
:noh
: 关闭 search highlight
:!command
: run shell command
:verbose
:verb
: 检查某个命令是谁执行的: verb set cocu
.vimrc
1
2
3
4
5
6
7
set number
set expandtab
set tabstop=2
set softtabstop=2
set shiftwidth=2
syntax on
set hlsearch
- reload:
:source ~/.vimrc
Plugins
vim-plug
1
2
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
1
2
3
4
5
6
7
8
9
10
11
12
call plug#begin('~/.vim/plugged')
Plug 'vim-airline/vim-airline'
Plug 'preservim/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'
Plug 'Yggdroot/LeaderF'
Plug 'airblade/vim-gitgutter'
Plug 'tpope/vim-fugitive'
Plug 'Raimondi/delimitMate'
Plug 'tpope/vim-surround'
call plug#end()
PlugInstall
airline
1
let g:airline#extensions#tabline#enabled = 1
NERDTree
:NERDTree
t
- Open in new tab
A
- FullScreen
m
- Menu ()
1
:nnoremap <leader>n :NERDTree<CR>
Git
1
Plug 'Xuyuanp/nerdtree-git-plugin'
1
let g:NERDTreeGitStatusUseNerdFonts = 1
Highlight
1
Plug 'tiagofumo/vim-nerdtree-syntax-highlight'
LeaderF
1
Plug 'Yggdroot/LeaderF'
<leader>f
<leader>b
<c-t>
- Open in new tab
<c-x>
- Open in split
<c-]>
- Open in vertical split
<c-j>
, <c-k>
or the arrow keys to navigate the result list.
:Leaderf <subcommand>
1
2
let g:Lf_StlSeparator = { 'left': '', 'right': '' }
let g:Lf_ReverseOrder = 1
Rg
1
:LeaderF rg
.ripgreprc
1
2
3
--max-columns=150
--max-columns-preview
--glob=!*[.-]min.js
1
export RIPGREP_CONFIG_PATH=$HOME/.ripgreprc
indentLine
indentLine will overwrite concealcursor
1
2
let g:indentLine_setConceal=2
let g:indentLine_concealcursor = 'nc'
Git
https://github.com/airblade/vim-gitgutter
https://github.com/Xuyuanp/nerdtree-git-plugin
https://github.com/tpope/vim-fugitive
https://github.com/mhinz/vim-signify
fugitive
:G
- status
?
- help
<CR>
- Open File
s
u
-
- stage/unstage
=
- Inline Diff
X
- Discard Change
gu
- go to Untracked
gU
0 go to Unstaged
gs
0 go to Staged
cc
- create a commit
:G commit
:G push
gitgutter
1
2
3
4
5
highlight clear SignColumn
highlight GitGutterAdd ctermfg=2
highlight GitGutterChange ctermfg=3
highlight GitGutterDelete ctermfg=1
highlight GitGutterChangeDelete ctermfg=4
1
:GitGutterLineHighlightsToggle
Markdown
1
2
Plug 'godlygeek/tabular'
Plug 'plasticboy/vim-markdown'
1
2
3
4
5
let g:vim_markdown_toc_autofit = 1
let g:vim_markdown_new_list_item_indent = 2 # type o to new indent line
let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_fenced_languages = ['css', 'rb=ruby', 'javascript', 'js=javascript', 'typescript', 'ts=typescript', 'json=javascript', 'ruby', 'sass', 'xml']
:Toc
]]
- go to next header.
[[
- go to previous header.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function s:TocToggle()
if index(["markdown", "qf"], &filetype) == -1
return
endif
if get(getloclist(0, {'winid':0}), 'winid', 0)
" the location window is open
lclose
else
" the location window is closed
Toc
endif
endfunction
command TocToggle call s:TocToggle()
Folding
zr
- reduces fold levelzR
- open all folds
zm
- increases fold levelzM
- close all folds
zo
- open one fold under the cursorzO
- recursively
zc
- close one fold under the cursorzC
- recursively
za
- toggle one foldzA
- recursively
Coc
:CocList extensions
1
:CocInstall coc-json coc-tsserver coc-emmet coc-jedi coc-html coc-vetur coc-solargraph
ruby
1
gem install solargraph
Vista
1
Plug 'liuchengxu/vista.vim'
Others
surround.vim
ds
- delete surroundcs
- change surroundys
- you surround
** alias **
b
-)
B
-}
r
-]
a
->
** notes **
yss
will ignore leading whitespacef
surround with functionysiWfprint<CR>
Visual-mode
S
- surround
delimitMate
automatic closing of quotes, parenthesis, brackets, etc.
1
let delimitMate_expand_cr = 1
nerdcommenter
<leader>c<space>
- toggle
Theme
VS Code
1
Plug 'tomasiser/vim-code-dark'
.vimrc
1
2
colorscheme codedark
let g:airline_theme = 'codedark'
Icons
1
Plug 'ryanoasis/vim-devicons'
Vim Script
Variables
let
- set a variable
const
- set a constant variable
g:var
- global.a:var
- function argument.l:var
- local to function.b:var
- local to buffer.w:var
- local to window.t:var
- local to tab.s:var
- local to script.v:var
- Predefined by Vim.
:echo v:
- list all Vim variables
:echo g:
- list all global variables
:h variable-scope
Data Types
Number
-123
0x10
0177
Float
123.456
1.15e-6
String
"hello"
'world'
Operators
1
2
3
4
<string> == <string> " equal
<string> != <string> " not equal
<string> =~ <pattern> " match
<string> !~ <pattern> " not match
#
- match case
?
- don’t match case
1
echo 'Hello ' . 'world' " concat
Funcref
1
2
:let MyFunc = function("strlen")
:echo MyFunc('foobar) " 6
List
1
2
3
:let mylist = [1, 2, ['a', 'b']]
:echo mylist[0] " 1
:echo mylist[-2] " 2
Dict
1
:let mydict = {'blue': "#0000ff", 'foo': {999: "baz"}}
Bool
There is no Boolean
type. Numeric value 0
is treated as falsy, while anything else is truthy.
If
1
2
3
4
5
6
7
if <expression>
" ...
elseif <expression>
" ...
else
" ...
endif
For
1
2
3
4
5
6
7
8
9
for <var> in <list>
continue
break
endfor
for [var1, var2] in [[1, 2], [3, 4]]
" on 1st loop, var1 = 1 and var2 = 2
" on 2nd loop, var1 = 3 and var2 = 4
endfor
While
1
2
while <expression>
endwhile
Try-Catch
1
2
3
4
5
6
7
try
" ...
catch <pattern (optional)>
" HIGHLY recommended to catch specific error.
finally
" ...
endtry
1
2
" throw new exception
throw "Wrong arguments"
Functions
function!
- overwrite a function
call <function>
- execute a function
1
2
3
function! <Name>(arg1, arg2, etc)
" <function body>
endfunction
1
{x -> x * x} " lambda
Classes
Vim doesn’t have classes built in.
1
2
3
4
let MyClass = {foo: "Foo"}
function MyClass.printFoo() dict
echo self.foo
endfunction
Misc
\
- escape line break
1
2
" regexp substitute
:substitute/hello/Hello/
1
2
" The arguments are "events", "patterns", rest is "commands"
autocmd BufWritePost $MYVIMRC source $MYVIMRC
1
2
3
"
let line = 3
execute line .. 'delete'
1
2
3
" play back a sequence of normal mode commands
" `!` to ignore user mappings
normal! ggddGp
1
wincmd L
1
2
" current word under cursor
echo expand('<cword>')
1
2
3
" turn off autoindent when you paste code
:set paste
:set nopaste
map
<silent>
- Execute {command} silently
Syntax
highlight
1
2
3
4
5
6
function! SynStack()
if !exists("*synstack")
return
endif
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc
Tips
clipboard
1
set clipboard+=unnamedplus
+y
- copy
+p
- paste