Vim 新手速查清单

该 Cheatsheet 是我在通过 vimtutor 学习 Vim 以及日常使用中整理出来的,主要面向初学者。

移动

  • 移动到行尾 $,移动到行首 0,移动到行首第一个字符处 ^
  • 移动到段首 {,移动到段尾 }
  • 移动到下一个词 w,移动到上一个词 b,移动到当前单词末尾前一个字符 e
  • 移动到文档开头 gg,移动到文档末尾 G
  • 移动光标到屏幕顶端 H,移动到屏幕中间M,移动到底部L
  • 跳到第 n 行 nggnG 或使用命令 :n
  • 移动到上次编辑文件的位置 双击 `
  • control + f 向下移动一屏,control + b 向上移动一屏
  • control + i 从当前位置前进,control + o 从当前位置后退
  • 光标在 ([{ 处时,使用 % 跳转匹配的 )]}

编辑

  • 在光标位置插入 i,行首插入 I
  • 在光标下一个字符后插入 aea 在下一个单词末尾插入文字),行尾插入 A
  • 在下一行插入新的一行 o,在前一行插入新的一行 O
  • 替换光标后所在字符 rR 进入替换模式,每一个输入的字符都会被删除并替换原有字符
  • 删除一个字符 x,删除一个字符后进入插入模式 s
  • 删除一个单词 dw,删除单词到末尾并进入插入模式 ce,删除整个单词并进入插入模式 cw
  • 删除到行尾 d$ 或者 D,删除到行尾后进入插入模式 c$ 或者 C
  • 删除一行 dd,删除后进入插入模式 ccS
  • 复制 y,复制一行 yy 或者 Y
  • p 粘贴删除或者复制后的内容到光标下一个字符后,P 粘贴到光标前
  • 交换光标后的两个字符 xp,交换两行 ddp
  • 撤销 u,撤销整行 U,重做 control + r(撤销之前的撤销)
  • >> 缩进所在行,按一次之后继续按 . 可以继续缩进
  • << 反缩进所在行
  • 合并两行 J
  • . 在新的光标位置重复上一条操作
  • 按下 q 开始录制模式,选择 a - z 为重复操作快捷键,之后开始录制;再次按下 q 结束录制,然后按下 @ + 之前选择的重复操作快捷键,重复录制的操作

命令模式

  • :h[elp] [command_name] 查看某个命令的帮助文档,比如:
    • :h user-manual 查看帮助文档
    • :h keycodes 查看按键名称
    • :h insert-index 查看插入模式文档
    • :h normal-index 查看普通模式文档
    • :h visual-index 查看 visual 模式文档
    • :h ex-edit-index 查看命令模式文档
  • 查看帮助文档时,双击或者使用快捷键 control + ] 跳转链接,也可以使用前进/后退 (control + i / o) 在文件或者链接间跳转,如果链接是文件则可以使用 g + f 快捷键
  • 查看帮助文档时,按 control + d 获得命令提示,按 tab 进行命令补全
  • control + b 跳到命令开头,control + e 跳到命令末尾,按 control + w 删除光标前一个单词,control + u 重新输入命令
  • / 向后匹配搜索,? 向前匹配搜索,n 匹配下一个,N 反向匹配下一个
  • :set ic 忽略大小写匹配,:set noic 关闭,仅单次搜索忽略大小写加 \c,比如 /keyword\c
  • :set hls 搜索结果高亮,:set nohls 关闭,取消高亮直到下次搜索 :noh
  • :set is 部分结果匹配显示,:set nois 关闭
  • :s/old/new/g + 回车,替换光标所在行匹配到的所有字符
  • :#,#s/old/new/gc 替换所选行 #,# 中匹配到的字符
  • :%s/old/new/g 替换当前文件中所有匹配到的字符,:%s/old/new/gc 每个替换前弹出确认提示
  • :! 执行 Shell 命令,比如 :!ls
  • :w fileName 保存文件;:x 保存并退出,快捷键 ZZ:q! 不保存文件直接退出,快捷键 ZQ
  • :e 重新加载当前文件;:e! 不保存文件重新打开
  • :e fileName 在当前窗口打开(新)文件,使用 :e# 切换到最近的文件,快捷键 control + ^,切换前必须先保存。
  • :r,retrieve 数据并插入到光标所在下一行,数据来源可以是文件或命令结果,比如 :r fileName 或者 :r !ls
  • :ls 列出所有打开的文件,:b n 切换到指定数字下的文件,:bw 关闭当前文件,:qall 关闭所有文件,:wall 保存所有打开的文件
  • :his 查看所有命令历史,:his / 查看所有搜索历史
  • :set 更改当前 vim 配置,比如 :set nu 显示行号
  • :map key1 key2 映射键盘按键,默认的 <leader> 键为 \
  • q: 查看最近命令历史,q/ 查看最近搜索历史,按两次 control + c 退出
  • v 进入 Visual selection 模式,使用方向键进行移动,之后可以对选中的文本进行操作,比如复制 y,删除 d,重选 gv,将选中的行保存为文件 :w fileName
  • V 进入 Visual Line selection 模式
  • control + v 进入 Visual Block selection 模式,可以垂直方向块状选择,使用 I 插入模式,退出后所有选中的行都会插入相同内容。
  • :f 显示文档信息和当前所在位置,或者使用快捷键 control + g

多窗口

  • vim -o file1 file2,水平方向多窗口打开多个文件,-O 垂直方向多窗口打开多个文件
  • :split fileName 在打开的文件中打开水平多窗口,快捷键 contorl + w, s,不加 fileName 则默认使用当前文件
  • :vsplit fileName 在打开的文件中打开垂直多窗口,快捷键 contorl + w, v,不加 fileName 则默认使用当前文件
  • contorl + w, h j k l 或方向键,上下左右切换窗口,连按两次 contorl + w 切换下一个窗口,也可以使用光标对窗口进行选择
  • control + w + shift + -,窗口垂直最大化;control + w + =,垂直方向等分显示。
  • :close 关闭当前窗口,快捷键 contorl + w, c 或者 shift + 双击 z
  • :only 关闭其它窗口,快捷键 contorl + w, o

其它 Tips

  • :set textwidth=<n> 设置字符换行最大长度,之后按 gql 就可以将使得当前行超出部分自动换行
  • :retab 格式化 Tab 为空格,使得当前文件符合 .vimrc 中的 tabstop 等配置

iTerm 快捷键

  • command + / 高亮当前文件中光标所在的位置
  • command + ; 获得代码提示

Vim 插件

插件管理器:Vim-Plug

Core

  • editorconfig-vim: EditorConfig plugin for Vim. :h editorconfig
  • vim-commentary: Comment stuff out. gcc, :h commentary
  • auto-pairs: Insert or delete brackets, parens, quotes in pair. :h autopairs
  • vim-surround: change - cs'" |delete: ds' |add - ysiw". :h surround
  • vim-visual-multi: Multiple cursors plugin. <C-Down> / <C-Up>, :h visual-multi
  • nerdtree: A tree explorer plugin for vim. :h nerdtree
  • vim-gitgutter: A Vim plugin which shows git diff markers in the sign column. :h gitgutter
  • lightline.vim: A light and configurable statusline/tabline plugin for Vim. :h lightline
  • rainbow: Rainbow Parentheses. :h rainbow
  • vim-man: View man pages in vim. :Man Command, :h man

Others

Vim 配置

用户目录下新建文件 .vimrc,然后加入以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
syntax enable
filetype on
filetype plugin on
filetype indent on

imap jk <Esc>
vmap jk <Esc>
nnoremap <C-L> :set nu
nnoremap <C-H> :set nonu

set nocompatible
set number
set cursorline
set ruler
set mouse=nicr
set clipboard=unnamed
set backspace=indent,eol,start
set ignorecase
set smartcase
set hlsearch

set autoindent
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4

set hidden
set wildmenu
set laststatus=2
set report=0
set synmaxcol=200
set updatetime=100
set dir=~/.cache/vim

set title
set confirm
set showmode
set ttyfast
set lazyredraw
set list

" Colorize Vim
if !has('gui_running')
set t_Co=256
endif

在 Vim 中查看 vimrc 示例文件 :e $VIMRUNTIME/vimrc_example.vim,更多配置见 :h vimrc-intro

键盘映射

我们可以通过键盘映射给一些常用的命令添加快捷操作。

键盘映射的基本语法是:

1
map {lhs} {rhs}

我们知道 Vim 有不同的编辑模式 (normal/insert/replace/visual/select/command-line/operator-pending),我们可以根据不同的模式设定键盘映射的范围。比如,将插入模式下输入的 jk 映射为 <Esc> 键:

1
imap jk <Esc>

映射默认是 recursive 的,意思是如果有两个相互映射的按键,它们会相互循环映射彼此。比如 x 映射成 y,y 映射成 x,这样,当你输入 x 的时候,y 也会被输入,之后 x 会被输入,这样就会循环输入下去。好处是可以执行一些需要递归执行的任务。

如果你不需要递归映射,可以使用 non-recursive 的映射模式,用 nore 表示。比如 normal 模式下的非递归映射:

1
2
# 将 normal 模式下的键盘输入 control + L 替换为输入命令 set nu
nnoremap <C-L> :set nu

帮助命令

1
2
h mapping
h recursive_mapping