vi 常用命令总结。

光标移动

单个字符移动

  • h: 向左移动
  • l: 向右移动
  • j: 向下移动
  • k: 向上移动
  • xh: 向左移动x个字符距离

单词移动

  • w: 将光标移动到下一个单词的开头
  • b: 将光标移动到前一个单词的开头
  • e: 将光标移动到下一个单词的词末
  • E: 将光标移动到单词的结尾(忽略标点符号)
  • ge: 将光标移动到上一个单词的词末
  • xw: 指定移动的次数x

行移动

  • $: 将光标移动到当前行的行尾
  • 0: 将光标移动到当前行的行首
  • ^: 将光标移动到当前行的第一个非空字符
  • x|: 移动到当前行的第x列
  • fx: 将光标移动到当前行的第一个x字符上
  • nfx:将光标移动到当前行的第n个x字符上
  • tx: 将光标移动到目标字符x的前一个字符上

    注:fx和tx都可以通过;和,进行重复移动,一个为正向重复,一个是反向重复

文本块移动

  • (: 移动到当前句子的开头
  • ): 移动到下一个句子的开头
  • {: 移动到当前一段的开头
  • }: 移动到下一段的开头
  • [[: 移动到当前节的开头
  • ]]: 移动到下一节的开头

屏幕中移动

  • xG: 跳转到指定的第x行
  • G: 移动到文件的末尾
  • ``: 返回到跳转前的位置
  • gg: 移动到文件开头
  • x%: 按百分比将光标移动到文件某个位置,例50%
  • H: 移动到home
  • M: 移动到屏幕中间
  • L: 移动到屏幕末尾
  • ctrl+G:查看当前的位置状态

滚屏与跳转

  • 半屏滚动:ctrl+u/ctrl+d
  • 全屏滚动:ctrl+f/ctrl+b
  • 定位光标位置
    zz:将光标置于屏幕的中间
    zt:将光标置于屏幕的顶部
    zb:将光标置于屏幕的底部
  • 设置跳转标记
    mx,my,mz设置位置
    x,y,`z跳转到指定位置

文本插入操作

  • i:在当前光标的前面插入字符
  • a:在当前光标的后面追加字符
  • o:在当前光标的下一行行首插入字符
  • I:在一行的开头添加文本
  • A:在一行的结尾添加文本
  • O:在光标当前行的上一行插入文本
  • s:删除当前光标处的字符并进入到插入模式
  • S:删除光标所在处的行,并进入到插入模式
  • u:撤销修改

文本删除操作

字符删除

  • x: 删除当前光标所在处的字符
  • X: 删除当前光标左边的字符

单词删除

  • dw: 删除一个单词(从光标处到空格)
  • daw:无论光标在什么位置,删除光标所在的整个单词
  • diw:删除整个单词文本,但是保留空格字符
  • d2w:删除从当前光标开始处的2个单词
  • d$: 删除从光标到一行末尾的整个文本
  • d0: 删除从光标到一行开头的所有单词
  • dl: 删除当前光标处的字符=x
  • dh: 删除当前光标左边的字符==X

行删除

  • dd: 删除当前光标处的一整行==D
  • 5dd:删除从光标开始处的5行代码
  • dgg:删除从光标到文本开头
  • dG: 删除从光标到文本结尾

行合并

  • J: 删除一个分行符,将当前行与下一行合并

文本复制、剪切与粘贴

  • y: 复制 p: 粘贴
  • yw: 复制一个单词
  • yxw:复制x个单词
  • y$: 复制从当前光标到行结尾的所有单词
  • y0: 复制从当前光标到行首的所有单词
  • yy: 复制一整行
  • xyy:复制从当前光标所在行开始的第x行
  • 剪切:剪切操作为删除操作+粘贴操作组成,即文本被删除后会存放在剪切板中,按p即可粘贴

复制文本块

  1. 首先进入visual模式:v
  2. 移动光标选择文本
  3. 复制与粘贴

文本修改与替换

  • cw: 删除从光标处到单词结尾的文本并进入到插入模式
  • cb: 删除从光标处到单词开头的文本并进入到插入模式
  • cc: 删除一整行并进入到插入模式
  • ~: 修改光标下字符的大小写
  • r: 替换当前光标下的字符
  • R: 进入到替换模式
  • xp: 交换光标和下一个字符

组合命令的使用

各个命令间可以根据语义组合使用

c d y 作用
cH dH yH 屏幕顶端
cL dL yL 屏幕低端
c+ d+ y+ 下一行
c5| d5| y5| 本行的第5列
2c) 2d) 2y) 往下第2个句子
c{ d{ y{ 上一段
cG dG yG 文件结尾
c13G d13G y13G 第13行


文本查找与替换

  • /string:正向查找
  • ?string:反向查找

设置高亮显示

  • :set hls(按下[*]将当前光标处的单词高亮显示,使用n浏览下一个查找高亮的结果)
  • :s/old/new: 将当前行的第一个字符串old替换为new
  • :s/old/new/g: 将当前行的所有字符old替换为new
  • :90s/old/new/g: 将指定行的所有字符old替换为new
  • :90,93s/old/new/g:将指定范围的行的所有字符old替换为new
  • :%s/old/new/g: 将文本中所有的字符串old替换为new
  • :%s/old/new/gc: 依次替换每个字符串关键字
  • :%s/^struct/int/g:将所有行首以struct开头的第一个struct替换为int

修改的撤销、重做和保存

  • u: 撤销上一步的操作
  • ctrl+r:将原来的撤销重做一遍
  • U: 恢复一整行原来的面貌(即文件打开时的文本状态)
  • q: 若文件没有修改,直接退出
  • q!: 文件已经被修改,放弃修改退出
  • wq: 文件已经被修改,保存修改并退出
  • e!: 放弃修改,重新回到文件打开时的状态

修改的撤销、重做和保存

文件和缓冲区的区别

  • 文件是保存在磁盘上的,而vim打开的文件则存放在内存中
  • vim支持打开多个文件
  • :buffers: 查看缓冲区列表==ls
  • :buffer N: 根据缓冲区列表的编号跳转到指定文件
  • :bnext/bprev: 遍历缓冲区列表
  • :bfirst/blast:分别跳到缓冲区列表的开头和结尾
  • :write: 将缓冲区的修改保存到磁盘
  • :edit! e!: 放弃缓冲区的修改,恢复到文件打开时的状态
  • :edit file: 编辑另一个文件
  • :wnext: 保存当前缓冲区的修改并跳转到缓冲区列表中的下一个文件
  • :set autowrite:设置自动保存

标签页与折叠栏

标签页

  • 标签页的新建:tabedit file/tab spilt
  • 标签页的切换:tabn/tabp(命令模式:gt/gT)
  • 标签页的关闭:tabclose(关闭当前)tabonly(关闭所有)

折叠栏

  • 创建一个折叠:zf200G(将光标和200行间的代码折叠起来)
  • 折叠的打开与关闭
    za: 打开和关闭折叠
    zr/zm: 一层一层地打开和关闭折叠
    zR/zM: 分别打开和关闭所有的折叠
  • 折叠的光标移动
    zj: 跳转到下一个折叠处
    zk: 跳转到上一个折叠处
  • 删除折叠
    zd: 删除光标下的折叠
    zD: 删除光标下的折叠以及嵌套的折叠
    zE: 删除所有的折叠标签

注意:创建的折叠在退出vim之后就失效了。


多窗口操作

  • 分割窗口: spilt/vspilt filename
  • 窗口间跳转
    ctrl+w hjkl
    ctrl+w w
  • 移动窗口
    ctrl+w HJKL
  • 调整窗口尺寸
    ctrl+w +/-:调整窗口的高度
    ctrl+w </>:调整窗口的宽度
    ctrl+w = :所有的窗口设置相同的尺寸
    :resize n :将当前窗口尺寸跳转为n行
  • 关闭窗口
    close : 关闭一个窗口
    qall : 退出所有窗口
    qall! : 放弃修改,退出所有窗口
    wqall : 保存并退出所有窗口
    wall : 保存所有窗口