VIM使用方式
vim键盘图
vim操作文件基本方式
打开文件
-
单个文件
vim file1 -
多个文件
vim file1 file2 ... filen该方式打开文件,显示屏默认显示第一个文件也就是 file1
文件之间的切换
- :ls – 列出 VIM 打开的所有文件
- :bn – 显示屏上显示第n个文件
显示多个文件
-
左右分屏
vim -On file1 file2 ... filen这里的 n 是代表有几个文件需要分屏,从左至右依次显示 n 个文件
-
上下分屏
vim -on file1 file2 ... filen跟上一个命令不同的是 -on 中的 o 是小写,这样将会上下依次显示 n 个文件
分屏操作(ctrl+w系列)
左右分屏
- Ctrl+w+s – 上下分割当前打开的文件
- :sp file – 上下分割当前文件和新打开的 file
上下分屏
- Ctrl+w+v – 左右分割当前打开的文件
- :vsp file – 左右分割当前文件和新打开的 file
移动分屏
大写字母
- Ctrl+w+H – 将当前的分屏移动到左边
- Ctrl+w+L – 将当前的分屏移动到右边
- Ctrl+w+J – 将当前的分屏移动到上边
- Ctrl+w+K – 将当前的分屏移动到下边
在文件间切换光标
小写字母
- Ctrl+w+h – 将当前光标定位到左边的屏幕
- Ctrl+w+l – 将当前光标定位到左边的屏幕
- Ctrl+w+j – 将当前光标定位到左边的屏幕
- Ctrl+w+k – 将当前光标定位到左边的屏幕
关闭分屏
- Ctrl+w+c – 关闭当前的分屏(多个分屏就只关闭光标所在的分屏)
- Ctrl+w+q – 关闭当前的分屏,如果是最后一个分屏将会退出 VIM
vim五大模式
普通模式
用户刚刚启动 vi/vim,便进入了普通模式
此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符
普通模式移动光标
-
快速移动光标
输入[数字n+方向],代表向某个方向移动n
- h / ← / [backspace]:向左移动光标
- j / ↓:向下移动光标
- k / ↑:向上移动光标
- l / → / [space]:向右移动光标
-
在当前行上移动光标
- 0 或功能键[Home] – 移动到行头
- ^ – 移动到本行的第一个不是 blank 字符
- $ 或功能键[End] – 移动到行尾
- g_ – 移动到本行最后一个不是 blank 字符的位置
- w – 光标移动到下一个单词的开头
- e – 光标移动到下一个单词的结尾
- fa – 移动到本行下一个为 a 的字符处
- nfa – 移动到本行光标处开始的第 n 个 字符为 a 的地方
- 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 – 把当前行移动到当前屏幕的尾部
- % – 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上
- * & # – 匹配光标当前所在的单词, ***** 是下一个,# 是上一个
-
翻页操作
- ctrl+u – 向上滚动半页
- ctrl+b – 向上滚动一页
- ctrl+d – 向下滚动半页
- ctrl+f – 向下滚动一页
普通模式操作文本
-
删除
d 是删除的意思,通常搭配一个字符 ( 删除范围 ) 实现删除功能,常用的如下:
- dw – 删除一个单词
- dnw – 删除 n 个单词,
- dfa – 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )
- dnfa – 删除光标处到第 n 个 a 的字符处
- dd – 删除一整行
- ndd – 删除光标处开始的 n 行
- d$ – 删除光标到本行的结尾
- d0 – 删除游标所在处到该行的最前面一个字符
- dH – 删除屏幕显示的第一行文本到光标所在的行
- d1G – 删除光标所在到第一行的所有数据
- dG – 删除光标所在到最后一行的所有数据
- x – 删除光标当前所在的字符**(delete)**
- X – 删除光标前面的一个字符**(backspace)**
- nx – 向后连续删除n个字符
-
复制
y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:
- yw – 复制一个单词,还有ynw
- yfa – 复制光标到下一个 a 的字符处,还有ynfa
- yy – 复制一行,还有nyy
- y$ – 复制光标到本号的结尾
- yH – 复制屏幕显示的第一行文本到光标所在的行
- y1G – 复制光标所在行到第一行的所有数据
- yG – 复制光标所在行到最后一行的所有数据
-
粘贴
p是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来
-
p(小写) – 在光标后开始黏贴
-
P(大写) – 在光标前开始粘贴
-
-
撤销操作和恢复
- u – 撤销刚才的操作
- ctrl+r – 恢复撤销操作
-
大小写转换
- ~ – 将光标下的字母改变大小写
- 3~ – 将光标位置开始的3个字母改变其大小写
- g~~ – 改变当前行字母的大小写
- gUU – 将当前行的字母改成大写
- guu – 将当前行的字母全改成小写
- 3gUU – 将从光标开始到下面3行字母改成大写
- gUw – 将光标下的单词改成大写
- guw – 将光标下的单词改成小写
-
重复操作
- . – 重复上一个操作的命令
- n<command> – 重复某个命令 n 次,如 10p复制 10 次,10dd 删除十次
-
其他
- J – 将光标所在行与下一行的数据结合成同一行
- c – 重复删除多个数据,例如向下删除 10 行,10cj
插入模式
进入插入模式
| 命令 | 说明 |
|---|---|
| i, I | i – 从目前光标所在处输入 I – 在目前所在行的第一个非空格符处开始输入 |
| a, A | a – 从目前光标所在的下一个字符处开始输入 A – 从光标所在行的最后一个字符处开始输入 |
| o, O | o – 在目前光标所在的下一行处输入新的一行 O – 在目前光标所在的上一行处输入新的一行 |
| s,S | s – 删除光标所在处的字符然后插入需要录入的文本 S – 删除光标所在行,在当前行的行首开始插入需要录入的文本 |
| cw | 删除从光标处开始到该单词结束的所有字符,然后插入需要录入的文本 |
插入模式的命令
必须知道的:#是vim中的注释符号
在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
替换模式
进入替换模式
-
R – 进入替换模式,此时新输入的文本将直接替代/覆盖已经存在的内容,点击ESC键返回常规模式
-
r – 进入单字符替换模式,此时新输入的字符将替代光标之下的当前字符,然后自动返回到常规模式
-
gR – 进入虚拟替换模式,其与替换模式最主要的区别在于,对<Tab>键和换行符的不同处理方式
-
gr – 进入单字符虚拟替换模式,在替换光标下的当前字符之后,将自动返回到常规模式
虚拟替换模式
-
<Tab>键
替换模式(REPLACE)下,在原有<Tab>键处输入字母’a’,将直接替代<Tab>键所占用的所有空格的位置
虚拟替换模式(VREPLACE)下,在原有<Tab>键处输入字母’a’,将仅仅替代单个空格
-
<NL>换行
替换模式(REPLACE)下,输入<Enter>回车键将增加新行:
虚拟替换模式(VREPLACE)下,输入<Enter>回车键将用新行替代当前行内容(即清空当前行):
命令模式
在命令模式下按下 :(英文冒号)就进入了底线命令模式
有的命令要输入 / 执行
命令模式常用命令
- :w – 保存文件
- :q – 退出 Vim 编辑器
- :wq – 保存文件并退出 Vim 编辑器
- :q! – 强制退出Vim编辑器,不保存修改
- :set nu – 显示行号
- :set nonu – 取消行号
- :n – 定位到第n行
- :n1,n2d – 删除行号n1至n2之间的内容(n1和n2都代表数字)
按 ESC 键可随时退出底线命令模式
命令模式处理文件
- :w [filename] – 将编辑的数据储存成另一个文件(类似另存新档)
- :r [filename] – 在编辑的数据中,读入另一个档案的数据,即将filenam的内容加到光标所在行后面
- :n1,n2 w [filename] – 将 n1 到 n2 的内容储存成 filename
命令模式搜索文本
- ?{目标字符串} – 向光标之上寻找一个目标字符串
- /{目标字符串} – 向光标之下寻找一个目标字符串
- n – 重复前一个搜寻的动作
- N – 反向进行前一个搜寻动作
- :set ic – 编辑器将不会区分大小写
- :set noic – 编辑器将区分大小写
命令模式替换文本
格式::(作用范围)s/{目标}/{替换}(/替换的标志)
-
替换的作用范围
标志 作用 s 当前行替换 %s 全文替换 n1,n2s 指定行替换,替换n1到n2间所有行的目标,n2可以是$,代指最后一行 ’<,’>s 指定区域替换 -
替换的标志
标志 作用 [无] 只替换作用范围内,每行第一次出现的目标 g 一次性替换所有作用范围内所有的目标 i 大小写不敏感查找 I 大小写敏感查找 c 对作用范围内的目标逐个替换,替换前需进行确认 替换标志可以使用多个,比如/gic
命令模式执行linux命令
-
:![command]
打开终端窗口并打印执行命令的结果,不会改变当前编辑的文件的内容
可以使用
:!bash打开bash shell并执行命令:!date //执行 date 命令显示时间,执行完命令以后按下键盘上的 Enter 就会返回到文件 -
:r ![command]
将shell命令command的结果插入到当前行的下一行
:r !date //读取系统时间并插入到当前行的下一行 -
n1,n2 ![command]
将n1至n2行范围内的内容交给命令command处理,并将处理结果替换起始行号和结束行号指定范围中的内容
:1,4 !sort //将第1行到第4行的内容进行排序可以只指定起始行
:1 !tr [a-z] [A-Z] //将第1行的小写字母转为大写字母可以用.表示当前光标所在行 (输入
!!会变成:.!):. !tr [a-z] [A-Z] //将当前行的小写转为大写 -
n1,n2 w ![command]
将起始行号和结束行号所指定范围的内容作为命令command的输入,不会改变当前编辑的文件的内容
可以使用
:1 w !bash,将会把第1行的内容作为bash命令来执行并显示结果,而且不会改变当前编辑的文件的内容同样的
: . w !bash将当前行的内容作为bash命令来执行 -
!!
重新执行最近一次运行过的命令
-
:shell / :terminal
打开命令终端(输入exit结束并返回vim)
使用
:version命令(按q退出),查看是否包含+terminal关键字,以确认是否能使用:terminal
命令模式定义快捷键
-
基本格式
模式 基本格式 描述 普通模式 :nmap <key> <command>仅在普通模式下有效,定义普通模式下的快捷键 插入模式 :imap <key> <command>用于定义插入模式下的快捷键 可视模式 :vmap <key> <command>用于定义可视模式下的快捷键 命令行模式 :cmap <key> <command>用于定义命令行模式下的快捷键 总体映射 :map <key> <command>定义快捷键,适用于普通、可视、操作和选择模式,但不建议用于有冲突的情况。 总体不可递归映射 :noremap <key> <command>类似 :map,但是不会递归地扩展已经存在的映射,避免意外行为。普通模式不可递归 :nnoremap <key> <command>在普通模式下使用,避免递归映射 插入模式不可递归 :inoremap <key> <command>在插入模式下使用,避免递归映射 可视模式不可递归 :vnoremap <key> <command>在可视模式下使用,避免递归映射 缩写 :ab [缩写] [完整文本]输入缩写后空格,自动扩展为完整文本。例如: :ab email xxxx@gmail.com什么是<key>?
<key> 对应的是 ^[A-Z] , 定义快捷键时使用ctrl+v+[a-z],使用快捷键时用对应的ctrl+[a-z]
什么是递归映射?
:nmap j gg :nmap Q j如果已经做了以上映射,那么按下Q,执行的将是gg而不是j
为了避免以上问题,应该这样定义:
:nnoremap j gg :nnoremap Q j -
几个例子
-
:map ^D Ahelloworld<ESC>在文件的光标所在行的行尾,添加 helloworld 字符串,按住组合键 ctrl + d 就会执行操作
-
:map ^M I#<ESC>在文件光标处所在行的行首插入#,按住组合键 ctrl + m 就会执行操作
-
:ab email xxxx@gmail.com输入 email+空格 会把输入的 email 自动替换成 xxxx @gmail.com
-
可视化模式
进入可视化模式
可视化模式可以分为以下三种:
- v – 字符可视化模式,文本选择是以字符为单位的
- V – 行可视化模式,文本选择是以行为单位的
- ctrl-V – 块可视化模式,可以选择一个矩形内的文本
在任意可视化模式下使用以上命令,将会切换到对应模式
在任意可视化模式下使用I(大写i),将会切换到插入模式
- gv – 进入上一次的可视化模式,并选中当时选中的文本**(命令模式也能用此命令)**
按 ESC 键可随时退出可视化模式
可视化模式下移动光标
命令模式下的光标移动方法仍然适用
进入任意可视化模式,移动光标,会从当前位置开始,以相应方式高亮选中字符
-
o – 移动光标到已经选取的文本的结尾处或者开头处(根据现在光标所在位置确定)
如果是块可视化模式,移动光标到对角处 -
O – 在块可视化模式下,移动光标到同一行的结尾处或者开头处
可视化模式下编辑
大部分命令模式对内容操作的命令都能在可视化模式下使用,比如:
-
d – 删除高亮文本
-
D – 删除一整行文本,即使只有一部分被选中了
-
c – 删除高亮文本并进入插入模式
-
y – 复制高亮文本
-
Y – 复制一整行文本
-
p – 黏贴复制的文本
-
~ – 对高亮文本进行大小写转换
-
> / < – 对高亮文本增加/减少缩进,幅度为一个Tab键
-
r – 输入单个字符,把高亮文本所有字符逐个替换为该字符
vim宏录制
宏录制的录制操作
假设需要将文本的每一行的行首插入入一个 tab 键
- 先将光标移动到第一行,在普通模式下按下 q 键(宏录制是 q 键启动的)
- 按一个 a (字母随意),表示该宏注册为 a
- 按下 I 在行首插入一个 tab 键
- 按下ESC退出编辑模式
- 按下 j 将光标移动到下一行行首
- 按下 q 键完成录制操作(宏录制是 q 键结束的)
主要步骤:q(开始)-> a(命名) -> 操作 -> q(结束)
宏录制的使用
- @a – 执行a宏录制的一系列动作,注意a是录制的操作名称
- n@a – 执行n次a宏
- @@ – 重复上一次使用的宏操作
VIM相关案例
vim缓存泄露
vim交换文件
在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
现在用vim打开文件1.txt,直接关闭终端,再次试图用vim打开1.txt时会出现如下提示:
选择恢复(R),弹出如下提示:
Vim 中,当处理同一个文件发生多次异常退出时,它会依次使用不同的后缀来命名交换文件。按照你给出的模式,首次产生的交换文件名为 .index.php.swp,再次意外退出后产生 .index.php.swo,第三次产生的交换文件为 .index.php.swn。
从第四次开始及之后的交换文件,Vim 会循环使用这三个后缀(.swp, .swo, .swn)
例题
使用以下命令获取网站中的vim文件缓存:
wget http://xxx/.index.php.swp -P /home //-P指定下载位置
使用vim -r恢复文件并打开:
vim -r .index.php.swp
获取到网站源码后,进行代码审计即可