vim cheatsheet https://vim.rtorr.com/

Mode

vim 有四种模式

  • normal,普通模式,按下 escctrl + [ 可以进入 normal mode
  • insert,插入模式 i, a, o, insert, append, open a line below
  • command-line,使用 : 可以进入 command-line mode,可以进行很多操作
  • visual,块状选择,v 以字符为单位选择,V 选中行,ctrl + v 选择每一行相同位置的连续字符

插入模式下的

Move Arount

  • j, k, h, l
  • gj, gk(折行文本)

单词操作

  • w/W 移动到下个单词开头/单词含标点
  • e/E 移动到下个单词结尾/单词含标点
  • b/B 移动到上个单词开头/单词含标点
  • ge/gE 移动到上个单词结尾/单词含标点
  • dw/W 删除一个单词/单词含标 点,可搭配数字使用
  • dt{char} delete until
  • d$/0 删除到行尾/首
  • r, c, s, replace, change(c(a)w 删除一个单词并进入插入模式,ct" 删除 “” 内容并进入插入模式), substitute(替换一个字符并进入插入模式)

行内操作

  • 0/^ 移动到行首/行首非空白符
  • $/g_ 移动到行尾/行尾非空白字符
  • f{char} 行间搜索,快速跳转,; 跳转到下一个,, 向前查找
  • F{char} 反向搜索
  • t{char} 跳转到目标字符的前一个字符,快速跳转,;/n 跳转到下一个,`

垂直移动

  • () 在句子中移动
  • {} 在段落之间移动

页面操作

  • gg/G 移动到文件开头和结尾,ctrl + o 快速返回
  • H/M/L 移动到当前页面 顶部/中间/底部 (Head/Middle/Lower)
  • zt/zz/zb 屏幕光标在当前位置 居顶/居中/居底 (top, bottom)
  • Ctrl + e/y 屏幕向 下/上 移动一行(保持光标不动)
  • Ctrl + b/f 屏幕向 上/下 滚动一屏 back/forward
  • Ctrl + u/d 屏幕向 上/下 滚动半屏 up/down

其他

  • gd 跳转到局部定义
  • gD 跳转到全局定义

Search/Replace

  • / 或者 ? 可以进行查找,后面输入需要查找的内容
  • n/N 跳转到下一个/上一个匹配的位置

除了可以查找,还可以进行替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:[range]s[ubstitute]/{pattern}/{string}/[flags]

# range 表示范围,如 :10,20表示 10-20 行,% 表示全部
# pattern 表示要替换的模式
# string 是替换后的文本
# flags 表示替换的方式
# - g(global) 表示全局范围内执行
# - c(confirm) 表示确认,可以确认或拒绝修改
# - n(number) 报告匹配到的次数二不替换,可以用来查询匹配次数

:%s/self/this/g # 表示将所有的 self 替换为 this
:%s/self/this/gc # 表示逐个将 self 替换为 this
:1,6s/self/this/g # 表示将 1 到 6 行所有的 self 替换为 this
:1,6s/self//n # 统计 1 到 6 行的 self 出现次数
:%s/\<quack\>/jiao/g

Multiple File

buffer 指打开的一个文件的内存缓冲区,vim 打开一个文件后会加载文件内容到缓冲区,之后的修改都是针对内存中的缓冲区,并不会直接保存到文件

  • :w 保存
  • :ls 列举当前缓冲区
  • :b n 跳转到第 n 个缓冲区
  • :bpre :bnext :bfirst :blast
  • :b buffer_name 加上 tab 补全跳转

窗口是 buffer 可视化的分割区域

一个窗口可以分割成多个窗口,每个窗口也可以打开不同缓冲区

  • <ctrl +w> s 水平分割, 或 :sp
  • <ctrl +w> v 垂直分割,或 :vs
  • <ctrl +w> h/j/k/l
  • <ctrl +w> w 窗口间循环切换
  • <ctrl +w> h/j/k/L 将当前窗口移动到 左/… 边,交换
  • <c-w>= 使所有窗口等宽、登高
  • <c-w>_ 最大化活动窗口的高度
  • <c-w>| 最大化活动窗口的宽度

tab 可以组织窗口为一个工作区,可以理解为虚拟桌面,比如可以一个 tab 用来编辑 go,一个用来编辑 html

Text Object

\[number\]\<command\>\[text object\]

  • number 表示次数
  • command 表示命令,如 d(elete), c(hange), y(yank)
  • text object 是要操作的文本对象,比如 w(单词), s(句子), p(段落)

例子

  • viw 选中单词(v visual 模式,i inner); vip 选中段落
  • viw 选中单词包括后面的空格(v visual 模式,a around)
  • 3yiw 复制三个个单词,yy 复制一行

Register

在 vim 中,将复制、删除的内容暂时放在了寄存器中,如果不指定,内容默认放在了 “无名寄存器”,通过 "{register} 前缀可以指定寄存器,不指定默认使用无名寄存器

  • normal 模设计下 y(yank), p(put), d, p
  • yiw 复制一个单词,yy 复制一行
  • insert 模式
1
2
3
4
5
6
7
8
9
10
11
12
"ayiw 复制一个单词到寄存器 a 中
"bdd 删除当前行到寄存器 b 中
:reg {register} 查看寄存器中的内容

"ap 粘贴 a 寄存器中的内容

"+ 复制到系统剪切板
"% 当前文件名
". 上次插入的文本

插入模式下
ctrl r +

Macro

macro 可以看成是一系列命令的集合,我们可以使用宏“录制”一系列操作,然后用于“回放”,即将一系列命令用在多行文本上

normal 模式下

  • q 录制,q 结束录制
  • q{register} 选择要保存的寄存器,把录制的命令保持在其中
  • @{register} 回放寄存器中保持的一系列命令

eg. 给多行 url 连接加上双引号

1
2
3
4
5
6
7
8
9
10
11
qa # 开始录制
I
"
esc
A
"
esc
q # 结束录制
j
vG
:normal @a # 回放
1
2
3
VG
:normal I"
:normal A"

Config

1
2
3
4
5
6
7
8
9
set number
syntax on
colorscheme hybrid
" F2 进入粘帖模式
set pastetoggle=<F2>
" 高亮搜索
set hlsearch
" 设置折叠方式
set foldmethod=indent

可以在 command-line mode 下 :h option-list 查看可配置的选项

自定义映射

  • map 基本映射,指 normal 模式下的映射。unmap 取消映射
  • nmap/vmap/imap,如 :vmap \ U 在 visual 下将选中文本转换为大写。存在递归映射
  • nnoremap/vnoremap/inoremap 非递归映射
1
2
3
4
5
6
7
let mapleader=';' # 定义 ; 为 Leader 键
inoremap <leader>w <Esc>:w<cr> # leader + w(;w) 映射为 <ESC> + : + w 即进入 normal mode 并保存

inoremap jj <Esc> # jj 进入 normal node

noremap <C-h> <C-w>h # 将 ctrl-h 映射为 ctrl-w + h
noremap <C-j> <C-w>j # 将 ctrl-j 映射为 ctrl-w +

还可以自定义 vimscript 函数、配置插件,现在还不会…

Vim 操作太多了,等用到了再记录…