vim编辑器的三种工作模式:命令模式、输入模式、末行模式
打开文件:将准备打开的文件指定为命令行上的一个参数。# vim /etc/hosts
编辑文本
在命令模式中,键的映射不是为了插入所按下的字符,而是为了执行某类操作的命令。
要切换到插入模式,有以下命令
键 | 结果 |
i | 切换到插入模式,并在当前光标位置之前开始插入(插入)。 |
a | 切换到插入模式,并在当前光标位置之前开始插入(附加)。 |
I | 将光标移至当前的开头位置,并切换到插入模式。 |
A | 将光标移至当前的结尾位置,并切换到插入模式。 |
R | 从光标下的字符开始,切换至替换模式。处于替换模式时,不会插入文本,所输入的每个字符均将替换掉当前文档中的字符。 |
o | 在当前行的下方新打开一个行,并切换至插入模式。 |
O | 在当前行的上方新打开一个行,并切换至插入模式。 |
注意:按Esc将会始终取消当前命令,或者返回至命令模式。常见做法是按两下Esc(或按更多下),以确保返回至命令模式。
命令行模式操作
操作 | 操作类型 | 按键指令 | 用途 |
光标 跳转
| 移动光标 | 上下左右键头 | 上下左右 |
光标行内跳转 | Home键或^、数字0 | 跳转到光标所在行行首 | |
End键或者$ | 跳转到光标所在行行尾 | ||
h | 光标向左移动一个位置 | ||
l | 光标向右移动一个位置 | ||
全文翻页 | PgUp、PgDn | 向上翻页、向下翻页 | |
光标行间跳转 | 1G或gg | 跳转至文件的首行 | |
G | 跳转至文件的末行 | ||
#G或#gg | 跳转到文件的#行 | ||
j,#j | 光标向下移动一行,#行 | ||
k | 光标向上移动一行 | ||
移动 |
| w | 将光标移动到下一单词的开头(W包含标点符号) |
| b | 将光标移动到上一单词的开头(B包含标点符号) | |
| ( | 将光标移到当前或上一句子的开头 | |
| ) | 将光标移到下一句子的开头 | |
| { | 将光标移到当前/上一段落的开头 | |
| } | 将光标移到当下一段落的开头 | |
|
|
|
|
复制、粘贴、删除
| 复制 | yy、#yy | 复制光标处的一行、复制当前光标向下#行 |
粘贴 | p、P | 粘贴至光标之后,之前 | |
删除 | x/delete | 删除光标处的单个字符 | |
dd、#dd | 删除光标处的一行、#行(其实是剪切) | ||
d^ | 从光标处删至行首 | ||
d& | 从光标处删除至行尾 | ||
C(大写) | 从光标处删除至行尾,并且进入插入模式 | ||
dj | 删除当前行和下一行 | ||
合并 | 合并行 | J | 合并当前行和下一行 |
查找/撤销/保存
| 文本查找 | /word | 向后查找字符串”word” |
n/N | 跳至后/前一个结果 | ||
| * | 将立即向前搜索光标处的单词 | |
撤销编辑 | u | 撤销最近的一次操作,能多次使用 undo | |
U | 撤销对当前行的所有操作 | ||
ctrl+r | 取消前一次的撤销操作,即重做 redo 对使用u命令撤销操作进行恢复 | ||
.(句点) | 将对当前行恢复最近一个编辑操作。这可用于对多行轻松执行同一编辑操作。 | ||
保存退出 | ZZ | 保存修改并退出 | |
可视化选择 | 选取操作 | v | 取连续的多个字符 |
V | 取连续的多行 | ||
Ctrl+v | 取连续的多列,例:取多列,指进行注释 | ||
gv | 重复上次选取 | ||
|
|
| |
针对选取文本的操作 | d | 删除 | |
y | 复制 |
每一个命令都可通过在实际命令前键入重复次数来重复执行一定的次数,称为计数。
替换文本——按c键(change),后面加上光标移动。
cw:将当前光标位置更改到当前单词的末尾,要替换的文本被删除(放置到未命名寄存器中),同时切换至插入模式,键入要替换的内容。
按两下c(cc),将开始以行范围的方式替换,也适用于其他命令
大多数移动命令可以带上i和a前缀,以选择inner或a版本的移动。Ciw将替换整个当前单词,而不仅仅是从当前光标位置起,caw则执行相同的功能,但包含周围的任何空白区。
要替换到行末止,使用c$,但C可执行相同功能,也适用于其他命令
要仅替换光标处的字符,可按r,再键入新的字符。
要改变光标处字符的大小写,可按~
复制操作称为拖拉(y),粘贴称为旋转(p)
5yaw:将复制当前单词,及后面4个单词(共5个)
Vim提供26个命名寄存器,以及多个特殊用途的寄存器。拥有多个寄存器可让用户更加高效地执行剪切和粘贴,而不必担心丢失数据,如果未指定要使用的寄存器,则将使用“未命令”的寄存器。常规寄存器称为a到z,通过在命令的计数和实际命令之间放“registername来选择;如;3“tyy要复制当前行和后面两行到t寄存器中
要放置命名寄存器中的内容,只需在旋转命令之前加上”registername,如:“sp 将在光标位置后面放置s寄存器中的内容。
重要注意:每次使用命名寄存器时,未命名寄存器也会更新。
删除和更改操作也可加上寄存器选择作为前缀。未指定寄存器时,将仅使用未命名寄存器。当使用寄存器的大写版本时,被剪切或拖拉的文本将附加到该寄存器,而不是覆盖它。
特殊寄存器
有10个数字编号的寄存器(0~9)。寄存器“0将始终拥有最近拖拉的文本的副本,而寄存器”1则具有最近删除的文本的副本。当新的文本被更改或删除时,“1的内容将移到”2中,“2的内容将移到”3中,以此类推。
重要注意:与命名寄存器不同,数字编号寄存器的内容不会在会话之间保存。
末行模式操作:
| 操作类型 | 按键指令 | 用途 |
复制 |
| :1,3y | 复制1-3行 |
删除 |
| :1,3d | 删除1-3行 |
保存/退出/文件操作
| 存盘及退出 | :w | 保存当前文件 write |
:w /路径/文件 | 另存为 | ||
:q! | 放弃已有更改后强制退出 quit | ||
:wq或:x | 保存已有修改后并退出 | ||
:wq! | 强制保存退出 | ||
文件操作 | :w /root/newfile | 另存为其他文件 | |
:r /路径/文件 | 读入其他文件内容 | ||
:e /路径/文件 | 打开其他文件编辑 | ||
字符串替换substitute
| 行内替换 | :s/old/new | 替换当前行第一个old为new |
:s/old/new/g | 替换当前行所有old为new | ||
区域内替换 | :n,m s/old/new/g | 替换第n-m行所有的old为new | |
:% s/old/new/g | 替换全文所有的old为new,对替换动作不提醒 | ||
:% s/old/new/gc | 替换全文所有的old为new,对每个替换动作进行提醒 | ||
开关参数 的控制
| 编辑器设置 | :set all | 可查看所有可配置的参数 |
:set nu|nonu | 显示/不显示行号 | ||
set ai|noai | 启用/关闭自动缩进 autoindent 可缩写为 ai | ||
:syntax on| off | 启用/关闭语法高亮 | ||
:set hls| nohls | 开启/关闭查询结果高亮显示 hlsearch 可缩写为 hls | ||
执行外部命令 |
| :! 命令 | 在vim中可以执行外面命令行命令 |
| :r ! 命令 | 在vim中可以读入外部命令行的执行结果到当前的文本 | |
其他 |
| :X | 加密 |
Vim中的搜索和替换通过ex模式实施,其使用的语法与用户通过sed搜索和替换时所用的相同,包括使用正则表达式进行搜索的功能:ranges/pattern/string/flags
Range可以是行号、行号范围、搜索条件、%(当前文档中的所有行;搜索和替换通常仅针对当前行操作),或’<,’>(当前的可视选择)。
两个最为常见的flags:g(替换一行中多个位置上的pattern)、i(使当前的搜索区分大小写)
例:在所有行中搜索每个位置上的“cat”,将它替换成“dog”,不区分大小写,但仅针对完整词语而不是单词中的一部分,可使用命令::%/\<cat\>/dog/gi
yy2p 复制当前行,并粘贴2次
:1,5 s/^#//g ==> 删除第1~5行行首的#
:1,5 s/^/#/g ==> 在第1~5行行首插入#
:%s/MAN/man/g %要处理每一行 s/MAN/man/搜索和替换的内容 g此替换操作可在一行中操作多次