会vi应该是每个程序员必备的一个技能,记录vim基础操作,用于速查;会写一个系列,大概分为基础操作、配置、插件、高级操作几篇吧
进入与退出
# 进入vim
输入vi或vim
进入之后,默认是normal模式
# 退出vim
按Esc进入Normal模式,按:进入命令模式,按q按回车退出
# 强制退出vim
按:q!
一般是不保存,或只读模式下打开且修改了文件保存不了的情况下
# 保存并退出
按:wq
四种模式
模式分类与切换
- 普通模式,按Esc进入
- 插入模式,按i/a/o进入
- 命令模式,按:进入
- 可视模式,按v进入
编辑模式下的小技巧
# 进入编辑模式
输入i(insert),字符前
输入a(append),字符后
输入o(open a line below),下一行
输入I,行前
输入A,行后
输入O,上一行
# 回到normal模式
按Esc
# 插入模式下,如何快速纠错
ctrl+h,删除上一个字符
ctrl+w,删除上一个单词
ctrl+u,删除当前行
# 终端下的快捷键
ctrl+h,删除上一个字符
ctrl+w,删除上一个单词
ctrl+u,删除当前行
ctrl+a,跳转到行首
ctrl+e,跳转到行尾
ctrl+b,往前移
ctrl+f,往后移
# 快速切换insert和normal模式
ctrl+[来替换Esc
gi,normal模式下跳转到最后一次编辑的地方并进入insert模式
命令模式下的操作
# 保存退出
按:wq
# 分屏
按:vs(vertical split)
按:sp(split)
# 全局替换
按:%s/foo/bar/g
# 语法高亮
:syntax on
# 显示行号
:set nu
# 不显示行号
:set nonu
# 对搜索结果进行高亮
:set hls
# 设置增量搜索,边搜索边高亮
:set incsearch
# 撤销
按u
# 打开b.txt
:e b.txt
可视模式下块状选择,进行批量操作
# 进入可视模式
按v,进行字符选择
按V,进行行选择
按ctrl+v,进行方块选择
普通模式下快速移动大法
# 使用反人类的hjkl来移动
按h,向左移
按j,向下移
按k,向上移
按l,向右移
# 在单词间飞舞
按w/W,移到下一个word/WORD开头
按e/E,移到下一个word/WORD尾
按b/B(backword),移到上一个word/WORD开头
word指的是以非空白符分割的单词,WORD指的是以空白符分割的单词
# 行间搜索移动
按f{char},移动到char字符上
按F{char},从光标处到行首开始搜
按t{char},移动到char的前一个字符上
按分号(;),搜索该行下一个
按逗号(,),搜索该行上一个
# 水平移动
按0,移动到行首
按^,移动到第一个非空白字符
按$,行到到行尾
按g_,移动到行尾非空白字符
# 垂直移动
按(),在句子间移动
按{},在段落间移动
使用easy-motion插件移动
# 页面移动
按gg,移动到文件开头
按G,移动到文件结尾
按ctrl+o,移动到上一个位置
按H(head),跳转到屏幕开头
按M(middle),跳转到屏幕中间
按L(lower),跳转到屏幕结尾
按ctrl+u(upword),上翻页
按ctrl+f(forward),下翻页
按zz,将光标置于文件中间
快速增删改查
快速删除
# 快速删除一个字符或单词
按x,删除一个字符
按daw,删除一个单词
按diw,删除一个单词,不包括空格
按dd,删除当前行
按dt),删除括号内的内容
按d$,删除到行尾
按d0,删除到行首
按4x,删除4个字符
快速修改
按r(replace),替换当前字符
按c(change)
按s(substitute),删除当前字符并进入插入模式
按cw,
查询
按/,进行前向搜索
按?,进行反向搜索
按n,跳转到下一个
按N,跳转到上一个
按*,当前单词的前向匹配
按#,当前单词的后向匹配
搜索和替换
替换命令
:[range]s[ubstitute]/{pattern}/{string}/[flags]
range表示范围,:10,20表示10-20行,%表示全部
pattern是要替换的模式
string是替换后文本
flags,替换标志位
g(global),表示全局范围内执行
c(confirm),表示确认,可以确认或者拒绝修改
n(number),报告匹配到的次数而不替换,可以用来查询匹配次数
替换举例
# quack方法名替换成jiao
:% s/\<quack\>/jiao/g
多文件操作
先认识几个多文件操作的概念
- Buffer,是指打开的一个文件的内存缓冲区
- Window,是Buffer可视化的分割区域
- Tab,可以组织窗口为一个工作区
Buffer - 什么是缓冲区?
- Vim打开一个文件后会加载文件内容到缓冲区
- 之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
- 直到我们执行:w的时候才会反修改内容写入到文件里
buffer的切换
# 列举当前缓冲区
:ls
# 跳转至第3个缓冲区
:b3
:bpre
:bnext
:bfirst
:blast
:b buffer_name,按tab补全
Windows - 同时编辑多个文件
- 一个缓冲区可以分割成多个窗口,每可窗口可以打开不同缓冲区
- <ctrl+w>s水平分割,<ctrl+w>v垂直分割,或:sp和:vs
- 每个窗口可以无限分割
Windows的切换
- <ctrl+w>w,循环切换
- <ctrl+w>h,切换到左边的窗口
- <ctrl+w>j,切换到下边的窗口
- <ctrl+w>k,切换到上边的窗口
- <ctrl+w>l,切换到右边的窗口
窗口的移动
- <ctrl+W>l,将当前窗口移动到右边
窗口的重排
<ctrl+w>=,使所有窗口等宽、等高
<ctrl+w>_,最大化活动窗口的高度
<ctrl+w>|,最大化活动窗口的宽度
[N]<ctrl+w>_,把活动窗口的高度设置为[N]行
[N]<ctrl+w>|,把活动窗口的宽度设置为[N]列
Tab - 将窗口分组
:tabe[dit] {filename} 在新标签页中打开{filename}
<ctrl+w>T 把当前窗口移到一个新标签页
:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其他标签页
:tabn[ext] {N} 切换到编号为{N}的标签页
{N}gt
:tabn[ext] 切换到下一标签页
gt
:tabp[revious] 切换到上一标签页
gT
文本对象(text object)
- Vim里的文本对象,比如一个单词、一个兔子、一个段落
- 操作文本对象比操作单个字符高效
语法
[number]<command>[text object]
number表示次数
command是命令,比如delete,change,yank
text object是文本对象,单词w,句子s,段落p
通过示例来学习
iw表示 inner word,viw命令,先进入选择模式,然后选中当前单词
aw表示 around word,它不但会选中当前单词,还会包含当前单词之后的空格
[]表示使用范围
iw This is a [test] sentence.
aw This is a [test ] sentence.
iW This is a [...test...] sentence.
aW This is a [...test... ] sentence.
is ...sentence. [This is a sentence.] This...
as ...sentence. [This is a sentence. ] This...
ip [This is paragraph. It has two sentences.]
The next.
End of previous paragraph.
ap [This is paragraph. It has two sentences.
]The next.
End of previous paragraph.