插入

  • a在当前字符后追加。a在当前行最后追加

  • i在当前字符前插入。i在当前行最前面插入

  • o在当前行下面新开一行。o在当前行上面新开一行

移动

word指以非空白符分隔的单词,word指以空白符分隔的单词

  • w 移动到下一个word开头, 移动到下一个word开头

  • e 移动到下一个word结尾, 移动到下一个word结尾

  • b 回到上一个word开头,可以理解为backword, b移动到下一个word开头

  • 0移动到行首第一个字符,^移动到第一个非空白字符

  • $移动到行尾,g_移动到行尾非空白字符

  • ctrl + b向上翻页,backword

  • ctrl + f向下翻页,forward

  • ctrl + u向上翻半页, up

  • ctrl + d向下翻半页, down

  • zz光标所在行置在屏幕中央

  • zt光标所在行置为屏幕最上

  • zb光标所在行置为屏幕最下

  • gg移动到文件开头,g移动到文件结尾,并可以使用ctrl+o快速返回

  • h/m/l跳转到屏幕的开头,中间和结尾

  • ctrl + O 后退

  • ctrl + I 前进

行内搜索移动

  • 使用f{char}可以移动到char字符上,t移动到char的前一个字符

  • 如果第一次没搜索到,可以使用;继续搜索下一个,使用,搜索上一个

  • f表示反过来搜索前面的字符

搜索替换

  • :[range]s[ubstitude]/{pattern}/{string}/[flags]

    • range表示范围,比如:10,20表示10-20行,%表示全部
  • pattern是要替换的模式,string是替换后的文本

  • flags里面有几个常用的标志

  • g(global)表示全局范围内执行

  • c(confirm)表示确认,可以确认或拒绝修改

  • n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

编辑

  • ctrl+w删除上一个单词

  • ctrl+h删除上一个字符

  • ctrl+u删除当前行

  • daw/dw 删除当前单词(delete a word)

  • d$删除到行尾,d0删除到行首

  • 2dd删除2行

  • dt(删除当前字符到(, 删除直到

  • x删除当前字符

  • 4x删除4个字符

  • u撤销,undo

快速修改

  • 常用有3个, r(replace), c(change), s(substitute)

  • normal模式下使用r可以替换掉一个字符,s替换并进入插入模式 ,ra可以把当前字符替换成a

  • 使用c配合文本对象,可以进行快速修改, caw把当前单词删掉并进行插入模式

分屏

  • :vs竖分屏

  • :sp横着分屏

选择

  • v进行visual模式

  • v行选

  • ctrl+v进行方块选择

  • :bn 切换到下一个文件

  • :bp 切换到上一个文件

  • ctrl + o 跳转到上一次光标所在的位置

  • ^ 移动到当前行第一个非空字符

  • $ 移动到当前行最后一个字符

  • %d 清空文件内容

查询

  • 使用/或者?进行前向或反向搜索

  • 使用n/n跳转到下一个或上个匹配

  • 使用×#进行当前单词的前向和后向匹配

模式切换

  • ctrl + cctrl + [切换到normal模式

  • gi快速跳转到最后一次编辑的地方并使用插入模式

插件快捷键

  • gd goto definition 跳转到定义处

多文件操作

概念

buffer

  • buffer是指打开的一个文件的内存缓冲区

  • vim打开一个文件后会加载所有的文件内容到缓冲区

  • 之后所有的修改都是针对内存中的缓冲区,并不会直接保存到文件

  • 只有使用:w后才会把修改内容写入到文件里面

如何在buffer中间切换
  • 使用:ls会列举当前缓冲区,然后使用:bn跳转到第n个缓冲区

  • :bpre, bnext, :bfirst, :blast

  • 或者使用:b buffer_name加上tab补全来跳转

窗口

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

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

  • 可以使用ctrl+ws水平分割,ctrl+wv垂直分割.或者使用:sp:vs

  • 每个窗口可以继续被无限分割

如何切换窗口
  • ctrl-ww 在窗口间循环切换

  • ctrl-wh 切换到左边的窗口

  • ctrl-wj 切换到下边的窗口

  • ctrl-wk 切换到上面的窗口

  • ctrl-wl 切换到右边的窗口

如果重排窗口
  • 重排窗口可以改变窗口的大小:h window-resize查看文档

  • ctrl-w= 使所有窗口等宽、等高

  • ctrl-w_ 最大化活动窗口的高度

  • ctrl-w| 最大化活动窗口的宽度

  • [n]<ctrl-w>_ 把活动窗口的高度设为[n]行

  • [n]<ctrl-w>| 把活动窗口的宽度设为[n]行

tab

  • tab是可以容纳一系列窗口的窗口(:h tabpage)

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

  • tab可以组织窗口为一个工作区

  • vim里面的tab和其他编辑器不太一样,可以想象成linux的虚拟桌面

  • 比如一个tab全用来编辑python文件,一个tab全是html文件

vim里面的text object(文本对象)

  • vim里面也有对象的概念,比如一个单词,一个句子,一个段落

  • 其他编辑器经常只能操作单个字符来修改文本,比较低效

  • 通过操作文本对象来修改要比只操作单个字符高效

操作方式

  • [number]<command>[text object]

    • number表示次数
  • command是命令,d(elete),c(hange),y(ank)

  • text object表示要操作的文本对象,比如单词w,句子s,段落p

  • iw表示inner word, 如果键入viw命令,那么首先v将进入选择模式,然后iw将选中当前单词

  • aw表示a word,它不但会选中当前单词,还会包含当前单词之后的空格

插件

配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
" 用空格代替tab
set expandtabs
" 统一缩进为4
set softtabstop=4
" tab键的宽度
set tabstop=4
set shiftwidth=4
" 设置缩进为4
set softtabstop=4
" 自动缩进
set autoindent
" 显示行号
set nu
" 搜索忽略大小写 
set ignorecase