1. 初试Vim
首先进入Vim时默认是Normal模式,进入编辑模式后才可以进行正常编辑。
- 使用i(insert)进入编辑模式,开始输入文字
- i表示(insert),a(append),o(open a line below)
- 使用Esc又可以回到 normal模式。使用:wq保存退出
2. Vim的模式
为什么Vim进入之后不想其他编辑器一样直接增删改查?
大部分情况下你是在浏览而不是编辑,所以Vim默认是normal模式,使用Esc从插入回到普通模式,在普通模式下可以进行各种命令操作和移动。
2.1 Insert(插入)模式
插入模式下Vim可以直接编辑,和其他编辑器一样
- 使用i(insert)a(append)o(open a line below)进入插入模式
- 使用Esc退出插入模式到normal模式
2.2 Command(命令)模式
Normal模式下输入冒号之后执行命令,比如保存退出:wq
- 顾名思义该模式下用来执行Vim命令,比如保存:w,退出:q。
- 比如分屏:vs(vertical split) , :sp(split)。
- 比如使用:%s/foo/bar/g全局替换。
2.3 Visual(可视)模式
- 在Normal 模式下使用v进入visual模式来进行选词选句
- 使用V选择整行
- 使用ctrl+v进行方块单词选择
3.Vim基本编辑
3.1 快速修正与纠错(撤回)
- 进入Vim之后首先使用a/i/o之一进入插入模式
- 编辑模式下ctrl+h 删除上一个字符,ctrl+w删除上一个单词,ctrl+u删除当前行
- 命令模式下,u撤回
- 以上快捷键也可以在linux终端下使用
3.2 快速移动大法
众所周知,vim normal模式使用了反人类的hjkl来移动
- 据说编辑器作者在编写vim的时候键盘还没流行上下左右按键
- 左(h),j(下),k(上),右((1),移动也不会让手指脱离主键盘区
- 逼着自己使用hjkl一段时间之后,你会体会到它非常有效率
3.3 在单词之间飞舞
在单词之间移动是我们浏览操作中最常使用的命令
- w/W移到下一个word/WORD开头。e/E下一个word/WORD尾
- b/B回到上一个word/WORD开头,可以理解为backword
- word 指的是以非空白符分割的单词,WORD以空白符分割的单词
3.4 行间搜索移动
同一行快速移动的方式其实是搜索一个字符并且移动到该字符
- 使用f char可以移动到char字符上,t移动到char的前一个字符
- 如果第一次没搜到,可以用分号;/逗号,继续搜该行下一个/上一个
- 大写的F表示反过来搜前面的字符
3.5 Vim水平移动
如何快速移动到一行的行首或者行尾呢?
- 0移动到行首第一个字符,移动到第一个非空白字符
- $移动到行尾,g_移动到行尾非空白字符
- 记住常用的0和$就可以满足日常需求了,0+w配合行首
3.6 Vim页面移动
-
gg/G移动到文件开头和结尾,你可以使用ctrl+o快速返回
-
H/M/L跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)
-
Ctrl+u ctrl+f.上下翻页.(upword/forward)。zz把屏幕置为中间
4. Vim编辑技巧
4.1 增删改查
4.1.1 增加字符就是进入插入模式
- 进入插入模式编辑文本
- 使用a/i/o进入插入模式
4.1.2 如何快速删除一个字符或者单词呢?
- Vim在normal模式下使用x快速删除一个字符
- 使用d(delete)配合文本对象快速删除一个单词dw(daround word),dd删除行,dt)删除直到括号,d$删到行尾,d0删到开头
- d和x都可以搭配数字来执行多次,4x删4个字符
4.1.3 Vim快速修改
相比删除,更常用修改,一般是删除之后改成我们期望的文本
- 常用有三个,r(replace),c(change),s(substitute)
- normal模式下使用r可以替换一个字符。s替换并进入插入模式
- 使用c配合文本对象,我们可以快速进行修改
4.1.4 Vim查询
- 使用/或者?进行前向或者反向搜索
- 使用n/N跳转到下一个或者上一个匹配
- 使用*或者#进行当前单词的前向和后向匹配
4.2 Vim搜索替换
:range s /pattern/string/flags
如: :% s/self/this/g
- range 表示范围比如:10,20表示10-20行,%表示全部
- pattern是要替换的模式,string是替换后文本(string为空时则返回匹配数)
Flag:
- g(global)表示全局范围内执行
- c(confirm)表示确认,可以确认或者拒绝修改
- n(number)报告匹配到的次数而不替换,可以用来查询匹配次数
支持正则,如精确匹配单词:
:% s/\<quack>/jiao/g
5. Vim多文件操作
-
Buffer是指打开的一个文件的内存缓冲区
-
窗囗是Buffer可视化的分割区域
-
Tab 可以组织窗口为一个工作区
5.1 Buffer-什么是缓冲区?
Vim打开一个文件后会加载文件内容到缓冲区
之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
直到我们执行:w(write)的时候才会把修改内容写入到文件里
5.2 如何在 buffer之间切换呢?
使用:ls会列举当前缓冲区,然后使用:bn跳转到第n个缓冲区
:bpre :bnext :bfirst :blast
或者用:b buffer_name加上tab补全来跳转
5.3 Window窗口
窗口是可视化的分割区域
- 一个缓冲区可以分割成多个窗口,每个窗囗也可以打开不同缓冲区
- <Ctrl+w>s水平分割,<Ctrl+w>v垂直分割。或者:sp 和:vs
切换窗口命令
:e b.txt 打开不同的文件
6. Vim文本操作
6.1 文本操作对象
之前我们已经使用过文本对象了,回忆下dw(删除一个单词)
格式 number command text object
- number表示次数,command 是命令,d (elete),c (hange)并进入插入模式,y (yank)
- text object 是要操作的文本对象,比如单词w,句子s,段落p,i表示内部inner
如2dw 、 cw 、 vi"
选择引号内
6.2 Vim复制粘贴与寄存器使用
- normal模式下复制粘贴分别使用y(yank)和p(put),剪贴d和p
- 我们可以使用v(visual)命令选中所要复制的地方,然后使用p粘贴
- 配合文本对象:比如使用yiw 复制一个单词,yy复制一行
- Insert模式下的复制粘贴
很多人会使用鼠标进行选中,然后使用ctrl+v或者cmd+v粘贴
这个和其他的文本编辑器差不多,但是粘贴代码要注意:
-
在vimrc中设置了autoindent,导致粘贴Python 代码缩进错乱
-
这个时候需要使用:set paste 和:set nopaste解决
Vim在普通模式下复制/剪切的内容去哪了?
- Vim里操作的是寄存器而不是系统剪贴板,这和其他编辑不同
- 默认我们使用d删除或者y复制的内容都放到了“无名寄存器”
- 用x删除一个字符放到无名寄存器,然后p粘贴,可以调换俩字符
:set clipboard=unnamed 可以让你直接复制粘贴系统剪贴板内容
6.3 批量操作
如:给所有行加上双引号
-
V G 全选
-
:normal I" 在行首加入”
-
:normal A" 在行尾加入”
6.4 常见的Vim补全
- 使用ctrl+n和ctrl+p补全单词
- 使用ctrl+x ctrl+f补全文件名
- 使用ctrl+x ctrl+o补全代码,需要开启文件类型检查,安装插件
7. Vim更换配色主题
- 使用:colorscheme显示当前的主题配色,默认是default
- 用:colorscheme <ctrl+d>可以显示所有的配色
- 有中意的配色后,用:colorscheme 配色名就可以修改配色
学习自https://www.imooc.com/learn/1129,感谢PegasusWang大佬!