# 在 vim 中进行打字
i 从正常模式切换到插入模式,当前方块的前面为具体的插入位置: insert
a 从当前位置的后面进入插入模式,一般使用 a 较多 :append
o 光标移动到下一行开始,切换到插入模式
ctrl + [ 退出插入模式,(右手拇指加食指)
:q 退出文件(会有文件临时存储记录,忘记保存也可以)
:w + 文件名 保存文件
:wq + 空格 + 文件名 存档后离开
将 ESC 键映射为两次 j 键
inoremap jj <Esc>
# VIM 的退出
VIM 的最终操作就是 VIM 的退出,命令模式下执行以下操作就可以实现对应的功能
保存当前对文件的修改,但是不退出文件。 :w
强制保存但是不退出文件。 :w!
保存当前的文件修改到 file 文件当中。 :w file
(例如写了一个 cpp 文件,然后执行这个命令就可以将写好的内容放到另一个已经创建好的 cpp 文件,就是 windows 里面的:test.cpp 已存在,是否覆盖?)
退出文件,对文件的修改不做保存。 :q!
(相当于强制退出)
退出所有的文件,对所有的文件修改都不做保存。 :qa!
(quit all !)
退出文件并保存对文件的修改。 :wq
(这个就是最常用的~)
退出文件并保存对文件的修改。 :x
(功能等价:wq)
打开另一个文件。 :e file
(edit-e)
放弃对文件的所有修改,恢复文件到上次保存的位置。 :e!
(代表文件编辑失效,edit !)
另存为 file。 :saveas file
(saveas 没有空格)
当打开多个文件的时候可以输入 :bn 和 :bp 进行上一个文件或者下一个文件的切换。 :bn 和 :bp
# 在 vim 中进行移动
h j k l 上下左右,熟练即可
3 + 空格 向后跳三个光标
w 跳单词
W 跳完全匹配的单词
b 往前跳
B 完全匹配往前跳
} 右边的大括号跳一个段落
{ 左边的大括号往左侧跳一个段落
G 跑到文章末尾 Graph (相比滚轮方便很多,5G 跳到文本的第五行)
gg 两个小写 g 字母跑到文章起始点
0 跑到一行的行首
$ 跑到一行的行尾
gk 进行视图层级的上下移动, (编辑器会对超过规定长度的文字进行折行)
gj
在 insert 模式下不需要移动,(虽然上下左右可以实现),
操作流程是:打字,离开,移动,插入,打字
# 快速移动光标
几个重要的快捷键
请记住这几个快捷键 h,j,k,l 这几个按键主要是用来快速移动光标的,h 是向左移动光标,l 是向右移动光标,j 是向下移动光标,k 是向上移动光标,h , j , k ,l 在主键盘区完全可以取代键盘上的 ↑ ,↓ ,← , → 的功能(上下左右)。
# 在当前行上移动光标
0
移动到行头 //O 无中央的像素点,而 0 有中间的像素点,正常模式按 0 就可以将光标移动到选中行的行头
^
移动到本行的第一个不是 blank 字符(TY 中间上方,小键盘 6 对应的位置)
$
移动到行尾 (4 对应的符号)
g_
移动到本行最后一个不是 blank 字符的位置
w
光标移动到下一个单词的开头
e
光标移动到下一个单词的结尾 (常用)
fa
移动到本行下一个为 a 的字符处,fb 移动到下一个为 b 的字符处 (find)
nfa
移动到本行光标处开始的第 n 个 字符为 a 的地方(n 是 1,2,3,4 ... 数字)
Fa
同 fa 一样,光标移动方向同 fa 相反
nFa
同 nfa 类似,光标移动方向同 nfa 相反
ta
移动光标至 a 字符的前一个字符
nta
移动到第 n 个 a 字符的前一个字符处
Ta 同 ta 移动光标方向相反
nTa
同 nta
移动光标方向相反
; 和,当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用 ;可以快速跳转到下一个指定的字符,, 是跳到前一个指定的字符
# 跨行移动光标
nG
光标定位到第 n 行的行首
gg
光标定位到第一行的行首
G
光标定位到最后一行的行首
H
光标定位到当前屏幕的第一行行首
M
光标移动到当前屏幕的中间
L
光标移动到当前屏幕的尾部
zt
把当前行移动到当前屏幕的最上方,也就是第一行
zz
把当前行移动到当前屏幕的中间 (常用)
zb
把当前行移动到当前屏幕的尾部
%
匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上
*
和 # 匹配光标当前所在的单词,移动光标到下一个(或者上一个)匹配的单词( *
是下一个,# 是上一个)
8 和 3 对应的额外字符
# 在文件里面搜索文字
编辑器将不会区分大小写,如果你进行该设置之后,进行关键字查询只要是字符相同不会区分大小写都会进行匹配。
:set ic
区分大小写的查询。
:set noic
? + content 触发搜索动作
:set hlsearch 高亮
n 向上跳动搜索结果光标
N 向下跳动搜索结果光标
问号和斜线在同一个位置,使用不同的按键,n 和 N 的作用相反
如果懒得打那个单词的话,就先让光标停留在对应单词位置,使用数字 8 对应的 * 进行查询,编辑器会自动将光标对应单词进行高亮,和这个字母相反的是使用 #
:set nohlsearch
f + 任意字母,光标跳转到行中出现的第一个字母,
F + 任意字母,光标进行向前跳转,
# 替换文字
如果要将搜索的内容进行替换 :{作用范围}s/{目标}/{替换}/{替换的标志}
:n1,n2s/word1/word2/g:
n1 n2 是数字,在第 n1 行与 n2 行之间寻找 word1 这个字符串,并将这个字符串替换为 word2:1,$s/word1/word2/g
将全文的 word1 替换为 word2:1,$s/word1/word2/gc
将全文的 word1 替换为 word2, 替换每一个字符串之前向用户进行询问
选定一个区域进行替换
在可视模式下选择区域后输入 : ,VIM 会自动补全为 :'<,'>
,(可是模式为鼠标可以操作的那个模式)
:'<,'>s/ugly/handsome/g
选区,在可视模式下选择区域后输入 : ,VIM 会自动补全为 :'<,'>
,(可是模式为鼠标可以操作的那个模式)
:'<,'>s/ugly/handsome/g
这个操作咋一看起来有点懵逼,这个操作是可视模式 (Visual-mode) 下选区中的替换操作(可视模式下文会谈到),可视模式下输入:会自动补全 :'<,'> 这个是可视范围下的操作范围,类似于 % 和 n1,n2,代表操作的文本范围,上面的例子就是替换掉可视区域的 ugly 为 handsome。
下面来谈谈替换的标志。
上文中命令结尾的 g 即是替换标志之一,表示全局 global 替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:
空替换标志表示只替换从光标位置开始,目标的第一次出现
:s/ugly/handsome
作用于当前行,从光标处开始查找替换,仅仅替换第一次匹配 ugly 的地方为 handsome 。
:%s/ugly/handsome
替换掉文件中所有行第一次出现 ugly 的地方为 handsome 。
i 表示大小写不敏感查找,I 表示大小写敏感: :%s/ugly/handsome/i
替换掉所有行第一个出现 ugly (不区分大小写) 为 handsome :%s/ugly/handsome/gi
替换掉所有行出现 ugly (不区分大小写) 为 handsome 。
c 表示需要确认,例如全局查找 "ugly" 替换为 "handsome" 并且需要确认:(用来以防万一手抖等等等)
:%s/ugly/handsome/gc
# 使用 ab(长字符串替换)
:ab email 123@gmail.com
:
后面的 ab 是关键字,该命令执行后,然后切换到编辑模式下,输入 email 会把输入的 email 自动替换成 123@gmail.com
。
这个命令主要是处理频繁输入同样的长串字符串。
# 撤销操作和恢复
u
撤销刚才的操作
ctrl + r
恢复撤销操作
# 在 vim 中进行复制粘贴
v 进入 visual 模式 然后就可以使用 之前的光标移动操作进行内容选块操作
V 进入 visual line 模式,使用 hjkl 进行移动的时候按照代码块进行移动
y 复制选中的内容 yank: 猛拉
p 粘贴,粘贴的时候不用调回 insert 模式,直接在当前模式下进行粘贴即可 paste
yy 直接 yank 一整行 ,p 进行粘贴即可 yy5p 粘贴五行相同的内容
# 复制粘贴高级操作
- y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:
- yw 复制一个单词,还有 ynw
- yfa 复制光标到下一个 a 的字符处,还有 ynfa
- yy 复制一行,还有 nyy
y$
复制光标到本行的结尾- yH 复制屏幕显示的第一行文本到光标所在的行
- yG 复制光标所在行到文本的结束
- p ,P 是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来。
- p 在光标后开始复制
- P 大写的 P 光标前开始复制
3yy 复制从光标行之后的三行内容(并不需要选中内容)
y$ 字面意思:把光标到行末的内容 copy 起来
yG 将当前光标开始直到文件末尾的内容全部复制
u 撤回上一步操作:uodo
ctrl + r 撤销撤销操作 redo
"ap 可以调用很多个不同的剪切板
"bp (相对高级的操作,可以自定义用户片段)
:set clipboard=unnamed 将电脑的剪切板和暂存器同步
vim 共有 48 个不同的暂存器,每个暂存器都有不同的效果
# 编辑文字
A 跳到行末 用 I 和 A 来替换 0i 和 $a
O 在当前行上方插入一行并进入插入模式(小写 o 在下一行开始写)
D 将光标后面的行中内容全部删除
x 删除单个字,放到暂存器中
dd 删除当前行
d12 删除当前光标之后的 12 个字符
2dd 删除两行
d + h,l 删除光标左侧的内容或者删除光标右侧的单个字
dG 删除光标之后直到文章末尾
c 删除选中内容并且把内容放到寄存器,直接进入 insert 模式,参数同 d
使用 c 的话删除之后会立即进入 insert 模式,可以少打一下键盘,不用删除文字后再使用
C 和大写 D 的作用相同 (将光标后面的行中内容全部删除,同时进入 insert 模式)
r :replace 替换单个字母,替换之后仍然处于 normal 状态
>> 或者 << 增加或者减少缩进
将所有内容选中之后,进行 = 操作,他们会自动格式化代码
i
是在光标所在的字符之前插入需要录入的文本。I
是在光标所在行的行首插入需要录入的文本。a
是在光标所在的字符之后插入需要录入的文本。A
是在光标所在行的行尾插入需要录入的文本。o
是光标所在行的下一行行首插入需要录入的文本。O
是光标所在行的上一行行首插入需要录入的文本。s
删除光标所在处的字符然后插入需要录入的文本。S
删除光标所在行,在当前行的行首开始插入需要录入的文本
- d 是删除的意思,通常搭配一个字符 (删除范围) 实现删除功能,常用的如下:
- dw 删除一个单词
- dnw 删除 n 个单词,
- dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )
- dnfa 删除光标处到第 n 个 a 的字符处
- dd 删除一整行
- ndd 删除光标处开始的 n 行
d$
删除光标到本行的结尾- dH 删除屏幕显示的第一行文本到光标所在的行
- dG 删除光标所在行到文本的结束
# 删除字符操作和替换
- x 删除光标当前所在的字符
- r 替换掉光标当前所在的字符
- R 替换掉从光标开始以后的所有字符,除非
<ESC>
退出
# 大小写转换
- ~ 将光标下的字母改变大小写
- 3~ 将光标位置开始的 3 个字母改变其大小写
- g~~ 改变当前行字母的大小写
- gUU 将当前行的字母改成大写
- guu 将当前行的字母全改成小写
- 3gUU 将从光标开始到下面 3 行字母改成大写
- gUw 将光标下的单词改成大写。
- guw 将光标下的单词改成小写
# (Visual-mode)
# 可视化模式下操作文本
可视化模式下选择操作区域以后,
按下 d 会删除选择的区域,
按下 y 会复制选择的区域,按下 p 会黏贴选择的区域。
cw ,删除从光标处开始到该单词结束的所有字符,然后插入需要录入的文本(这个命令是两个字符的合体 cw )。相当于 Windows 窗口下的鼠标双击进行的单词替换
ctrl + v 进入 v-block 模式。可以实现竖着的光标选取,即 shift + alt 样式, (注意先关闭 ctrl v 的粘贴映射)
vw 选取一个单词,vwwwwww 就是按照单词进行光标区的扩充
viw 选取光标所处的单词 常用 + c 字母进行对某一个块进行修改
vaw 按照块区选择单词
vi" 选取一个字符串中的内容,哇哇哇,vscode 中选中的话就很不方便
vit 选取 tag 中的所有内容 例如 html 中的内容
vat 相比于 vit 选取之后包含两边的 tag
v+{ 选取下方文本块 (复制一段函数很方便)
v+}
diw ciw 等操作同理
# vim text object
VIM 的重复命令
. 该命令是重复上一个操作的命令
n<command>
重复某个命令 n 次,
如 10p 复制 10 次,10dd 删除十次。
名词:
w = word , s = sentence, p = paragraph t = tag;
单双引号, 双括号,小括号,中括号,大括号
动词:
y = yank , p = paste, d = delete, c = change,
范围:
i= inner a = around
例如合起来的一个操作 yiw
# 其他使用技巧
gg=G 进行文件格式化
ctrl + q 取消当前正在执行的命令
^ 6 跳到行首,(去除空格部分)更加方便的开始再次写代码 代替 0
正则表达式
ctrlf 往后面翻页
ctrlb 往前面翻页
zf 折叠代码段
zd 展开代码段
zf i p 就可以快捷的把一段文本进行折叠,而不用先选中再折叠
. 重复上一个《大动作》
J选中内容后,将多段文字的回车去除
ctrl w 删除一个 word 在 insert 模式下
ctrl u 前面的所有东西全部删除
:! + 想要执行的指令,就可以在 vim 窗口下面执行一些想要执行的指令
:r! + 指令 复制相应的内容
:h + 想要查询的内容
终端下执行:vimtutor zh 进入官方给出的 vim 教程
在正常模式下,按 @a 执行宏录制的一系列动作,将会在第二行执行插入 tab 。
@@ 是对上一次宏使用的重复操作。n@a 就会执行 n 次一系列的动作。使用宏录制可以一次执行一系列的操作,可以针对一些重复度较高的操作进行宏录制。
# vim 多文件
有 tmux 的存在, vim 的多文件以及分屏已经可以被替代
SHOWMORE
# 用 VIM 一次性打开多个文件
现在有多个文件 file1 ,file2 , ... ,filen.
现在举例打开两个文件 file1,file2
vim file1 file2
该方式打开文件,显示屏默认显示第一个文件也就是 file1,
VIM 的正常模式下按下键盘上的冒号 :
这时会在显示屏底部出现冒号 :
(进入了 VIM 的命令模式),
然后在输入 ls (ls 为调出列表命令),
屏幕上会出现打开的所有文件的序号和文件名,我们继续输入冒号 : ,然后输入 bn (这里的 n 需要做一个解释并不是键盘上的 n , 而是文件序号的代指,如 b1 代表显示屏上切换到第一个文件,b2 代表显示屏上切换到第二个文件)。
:ls
上面这个命令将会列出 VIM 打开的所有文件。
:b2
上面的这个命令将会在显示屏上显示第二个文件。
# 在显示屏上一次性显示多个文件
VIM 可以实现分屏操作,一个屏幕被多个文件给分占,有左右和上下两种分屏的方式。
左右分屏如下操作:
vim -On file1 file2 ... filen
这里的 n ( n 是要打开的具体文件的数目:1,2,3 ...)是代表有几个文件需要分屏,从左至右依次显示 n 个文件。
上下分屏如下操作:
vim -on file1 file2 ... filen
这个命令跟上一个命令不同的是其中的参数 -on( n 是要打开的具体文件的数目:1,2,3 ...) 中的 o 是小写,这样将会上下依次显示 n 个文件。
上下分屏显示文件使用小写 o 记号 + n
左右分屏显示文件使用大写 O 记号 + n
vim -O2 test01.cpp test02.cpp
# 分屏操作
SHOWMORE
:e 后面加上文件名,可以在不离开 vim 的情况下打开一个文件
:tabe 多窗口开启一个文件,后面跟文件名就打开那个对应的文件
gt 向后切换 tab 页
gT 向前切换 tab 页
:new 开启页面分割
ctrl w w 循环切换
ctrl w + j 向下切换光标
:vnew 开启右侧页面 (垂直)
ctrl w + l / h 进行切换光标位置
vim -o filename filename 同时打开文档,水平窗口
vim -O filename filename 垂直窗口
vim -p 按照不同的 tab 页打开
可以用 buffer 操作代替多窗口操作
:bp
:bn
:blast \ :bl
:bf
:b filename
:bdelete \ :bd
记住一个重要的组合键 Ctrl + w
, 操作分屏离不开这个组合键 (关于窗口的操作 windows-w)
# vim 文件分屏
按住组合键 Ctrl + w ,然后在按下 s
Ctrl + w s
上面这个命令将会上下分割当前打开的文件。
按住冒号 :
,紧接着输入 sp
, 在键入文件名,如下:
:sp file
上面的这个命令将会上下分割当前文件和新打开的 file 。
按住组合键 Ctrl + w
, 然后在按下 v
Ctrl +w v
上面的这个命令将会左右分割当前的文件
按住冒号 :
,紧接着输入 vsp
, 在键入文件名称,如下:
:vsp file
上面的这个命令将会左右分割当前打开的文件和新打开的文件 file 。
# 切换光标,移动分屏
- 切换左右分屏的光标 :
将当前光标定位到左边的屏幕 Ctrl + w h
将当前的光标定位到右边的屏幕 Ctrl + w l
(因为 vim 和 linux 中使用 hjkl 代表上下左右,所以 ctrl+w+h 代表将光标移动到左屏幕,ctrl+w+l 代表将光标移动到右边的屏幕,而不是使用 lr 代表左右,这里的键盘的地理位置和功能也对应,h 在左,l 在右)
- 移动左右分屏 :
将当前的分屏移动到左边 Ctrl + w H
将当前的分屏移动到右边 Ctrl + w L
与移动光标操作不同的是,需要 caps 进行锁定,大写字母为分屏的相关操作
- 切换上下分屏的光标 :
将当前的光标移动到下面的分屏 Ctrl + w j
将当前光标移动到上面的分屏 Ctrl + w k
- 移动上下分屏:
将当前的分屏移动到下面的分屏 Ctrl + w J
将当前的分屏移动到上面的分屏 Ctrl + w K
# 关闭分屏
这个命令是关闭当前的分屏
Ctrl + w c
(close)
上面的这个命令也是关闭当前的分屏,如果是最后一个分屏将会退出 VI 不太行
Ctrl + w q