VIM操作速查
vim下的模式
insert模式、normal模式、visual模式、command模式
-
进入insert
a/i/o、A/I/O;a【append】、i【insert】、o【在下一行插入】;
-
进入normal
esc。默认模式就是normal
-
进入visual
v,V【选择行】,ctrl+v【进行方块选择】
-
进入command
按【:】
【:wq】保存退出、【:e!】重新加载并且不保存当前文件
分屏
【:vs】vertical split 【:sp】split
替换
% s/php/go/g 全局替换;%表示全部文件,s执行替换,g表示全局
insert模式小技巧
- ctrl+h删除光标前一字符
- ctrl+w删除光标前一单词
- ctrl+u删除光标前的一行
终端命令行小技巧
- ctrl+h删除光标前一字符
- ctrl+w删除光标前一单词
- ctrl+u删除光标前的一行
- ctrl+a光标到命令开头
- ctrl+e光标到命令结尾
- ctrl+b光标前移
- ctrl+f光标后移
normal模式小技巧
-
gi 快速切换到上次insert模式下的编辑位置
-
hjkl移动。最常用的是下移,所以右手食指是j下移
-
w/W移到下一个word/WORD开头
-
e/E下一个word/WORD尾
-
b/B到上一个word/WORD开头,b->backword
word指以非空白符分割的单词,WORD以空白符分割的单词
移动
行间搜索移动
-
f+char :char->你要搜索的字母/字符
-
F+char :反过来从行尾向行首搜索字符,当光标在行尾时需要
-
t移动到char的前一个字符
如果第一次没搜索到,可以用【;】和【,】进行上一个/下一个切换
快速到行首行尾
-
0移动到行首第一个字符,^ 移动到第一个非空白字符(0+w也可以实现 ^ 功能)
-
$移动到行尾,g_移动到行尾非空白字符
其实常用的的记住0和$就可以
垂直移动
- 使用 ( ) 在句子之间移动,使用 { } 在段落之间移动
- 也可使用easy-motion插件移动,使用这个插件这些命令就不用记忆啦
页面移动
- gg/G移动到文件的开头和结尾,可以使用ctrl+o快速返回上一个位置
- H/M/L跳转到开头、中间、结尾
- ctrl+u、ctrl+f上下翻页、zz把屏幕置为中间
可以用:help来查看帮助。比如 使用 :help ( 就可以查看(的帮助说明了
删
- x删除一个字符,可搭配数字多次执行
- d删除一个单词,可搭配数字多次执行
- dd:删除一整行
- d$:删除到行尾
- d0:删除到行首
- dt):delete to );也可以dt"、dt>等等
- dw(diw的简写)、diw、daw。根据范围文本对象删
范围文本对象
iw(inside the word)当前单词、aw(around the word)当前单词及空格
改
r(replace)、c(change)、s(substitute)
- r+char:替换字符
- s:删除当前字符并进入插入模式
- R+char1、char2、char3:相当于多个r的操作连续起来
- S:整行删除,并进入插入模式
- c可以配合文本对象,删除并进入插入模式
- cw、caw、ct"
- C删除整行来进行插入操作
查
/ ? n N * #
set hls(high light search)
set incsearch (一边搜索一边高亮)
搜索替换
substitute命令允许我们查找并且替换掉文本,并且支持正则
:[range] s[ubstitute]/{pattern}/{string}/{flags}
-
range -> :10,20 表示10-20行,%表示全部
-
pattern -> 要替换的模式
-
string -> 替换后的文本
-
flags -> g全局范围内执行;c(confirm);n(number)报告匹配到的次数而不替换,可以用来查询匹配次数
:% s/php/go/g
:1,6 s/php/go/g
:1,6 s/php//n -> 会报告出有多少个匹配
:% s/<quick>/jiao/g ->正则匹配替换
多文件操作
文件操作的概念:buffer、window、tab
vim每打开一个文件,其实是把这个文件内容从硬盘放到内存里面,buffer就是这个文件在内存中的缓冲区,窗口是各个buffer可视化的一个分割区域,tab是组织窗口为一个工作区
buffer<window<tab
切换buffer
- :ls,查看buffer
- :b 2,跳转到第2个缓冲区
- :bpre :bnext :bfirst :blast
- :b 文件名(可以使用tab补全,使用文件名跳转)
- :e 文件名(再打开一个文件,即增加了一个缓冲区)
分割windows
- <ctrl+w>s 水平分割,<ctrl+w>v垂直分割。或者:sp和:vs
切换window
- <ctrl+w>w 在窗口之间循环切换
- <ctrl+w>h 切换到左窗口
- <ctrl+w>j 切换到下窗口
- <ctrl+w>k 切换到上窗口
- <ctrl+w>l 切换到右窗口
移动window
- <ctrl+w>H 把窗口移到左边
- <ctrl+w>J 把窗口移到下边
- <ctrl+w>K 把窗口移到上边
- <ctrl+w>L 把窗口移到右边
操作tab
- <ctrl+w>T 把当前窗口移到一个新标签页
- :tabe[dit] 文件名 在新标签页中打开文件
- :tabc[lose] 关闭当前标签页和其中的所有窗口
- :tabo[nly] 只保留活动标签页,关闭所有其他标签页
- :tabn[ext] {N} 或者normal模式下 {N}gt 切换到编号为{N}的标签页
- :tabn 或者normal模式下 gt 切换到下移标签页
- :tabp[revious] 或者normal模式下 gT 切换到上一标签页
文本对象
[number]
-
number:次数
-
command:命令,d(delete),c(change),y(yank),v(visualuuu)
-
text object:文本对象,单词w,句子s,段落p
iw(inner word):单词
aw(around word):单词和单词之后的空格以下例子中[ ]表示作用范围
iw This ia a [test] sentence
aw This ia a [test ] sentence
iW This ia a [...test...] sentence
aW This ia a [...test... ] sentence
is ..................
as ..................
ip ..................
ap ..................i( or i) —— 选择括号里的内容
a( or a) —— 选择括号和括号里的内容
i< or i> —— ................
a< or a> —— .................
i{ or i} —— ................
a{ or a} —— .................
[] " ` 等等
应用举例:
vaw ——环绕选中单词
viw ——选中单词
3daw ——删除3个单词
cw —— 删除单词并进入insert模式,c(change)编辑改变单词
ci" —— 删除""里的单词并进入insert模式
ci{ —— 删除{}里的单词并进入insert模式
复制粘贴&寄存器
normal下复制粘贴
y(yank)、p(put)、d(剪切)、x(剪切字符)
可以先使用visual模式选中再y复制p粘贴
配合文本对象:yiw复制一个单词,yy复制一行
insert下复制粘贴
粘贴有个坑:如果vimrc设置了autoindent,粘贴代码会导致缩进混乱。这时候使用:set paste和:set nopaste解决
寄存器
vim里操作的是寄存器不是系统剪贴板,这一点和其他编辑器不同
默认使用d删除或者y复制的内容都放到了“无名寄存器”
小tips
用x删除一个字符放到无名寄存器中,然后再p粘贴,可以调换左右俩字符
有名寄存器【a-z】
"{register} —— 可以指定寄存器,不指定默认用无名寄存器
"ayiw —— 复制一个单词到寄存器a中
"bdd —— 删除当前行到寄存器b中
"" 指的是无名寄存器,默认情况就是无名寄存器,平时基本用不上""
查看寄存器
使用:reg a来查看register中的内容
其他寄存器
除了有名寄存器a-z,vim中还有一些其他常见的寄存器
- 复制专用寄存器:"0 ——使用y复制文本同时会被拷到复制寄存器
- 系统剪贴板 :**"+ ** —— 可以在复制前加上 "+复制到系统剪贴板,前提是vim支持clipboard。echo has('clipboard') 如果输出是1,vim就支持系统剪贴板,然后设置clipboard=unnamed
- 当前文件名寄存器如:"% (不常用)
- 上次插入的文本寄存器:".(不常用)
宏macro
场景:给许多url加上双引号
https://www.imooc.com/video/19455
https://home.cnblogs.com/u/abzor
https://time.geekbang.org/column/article/14271
宏可以看作是一系列命令的结合
可以使用宏【录制】一系列操作,然后用于【回放】
宏可以非常方便的把一系列命令用在多行文本上
①vim中使用q来录制宏,同时也是q结束录制
②使用q{register}选择要保存的寄存器,把录制的命令保存其中。qa,就是把录制的命令放到a寄存器中
③@{register}回放寄存器中保存的一系列命令
使用:
先使用q录制,再给一行加上双引号,之后使用q退出,在剩下的所有行中回放宏的录制
但是每一行都按一次@{register}比较麻烦,那么:
- V+G(全选剩下所有行)
- :(进入命令行模式)
- 输入normal @
上面的场景不使用宏也可以:
- V+G(全选所有文本)
- :(进入命令行模式)
- 输入normal I"(在行首插入双引号)
- :->ctrl+p(显示上一个vim命令)
- 输入normal A"(所有行尾也都加上了")
vim补全
ctrl+n和ctrl+p补全单词,根据当前文件里的关键词,来补全
ctrl+x ctrl+f 文件路径补全
ctrl+x ctrl+o补全代码,这种需要开启文件类型检查(:filetype on),并安装插件比如vim-go
google搜索vim input current path,就能搜索到怎么在vim中插入当前文件名或路径