VI: Visual Interface,文本编辑器
文本: ASCII, Unicode
vi是一个功能强大的全屏幕文本编辑工具,一直以来都作为类UNIX操作系统的默认文本编辑器,vim(ViImproved)是vi编辑器的增强版本。在vi的基础上扩展了很多实用的功能,但是习惯上也将vim称作vi。
文本编辑种类
行编辑器: sed
全屏编辑器:nano, vi
其他编辑器
gedit 一个简单的图形编辑器
gvim 一个vim编辑器的图形版本
vi相关工具
vipw
vipr
一、vim编辑器的工作模式
1、模式介绍
命令模式(Command Mode):启动vi编辑器后默认进入命令模式。该模式中主要完成如光标移动、字符串查找、以及删除、复制、粘贴文件内容等相关操作。
插入模式(Insert Mode):该模式中主要的操作就是录入文件内容,可以对文本文件正文进行修改或者添加新的内容。处于输入模式时,vi编辑器的最后一行会出现“——INSERT——“的状态提示信息。
末行模式(Last Line Mode):该模式中可以设置vi编辑环境、保存文件、退出编辑器,以及对文件内容进行查找、替换等操作。处于末行模式时,vi编辑器的最后一行会出现冒号”:“提示符。
2、模式切换
命令模式 → a、i、o 、A、I、O → 插入模式
插入模式 → Esc → 命令模式
命令模式 → : → 末行模式
末行模式 → Esc → 命令模式 按两次Esc可快速返回到命令模式
二、vim打开保存文件
1、打开单个文件
vim [选项] 文件名
直接使用vim会打开一个有提示信息的空文档,保存退出时需要在末行模式下使用w选项先保存,再退出文件。
使用vim可以使用如下选项打开文件:
+# : 打开文件后,直接让光标处于第#行的行首
+/PATTERN : 打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首
vim + file :直接打开file,光标在最后一行
vim –b file :二进制方式打开文件
vim –d file1 file2… :比较多个文件,多窗口打开
vim -m file : 只读方式打开文件
单文件窗口分割:
Ctrl+w,s: split, 水平分割
Ctrl+w,v: vertical, 垂直分割
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
: wqall 退出
2、打开多个文件
vim 选项file1 file2 ... 用vim同时打开多个文件
-o:横向打开多个文件
-O:纵向打开多个文件
ctrl+w+方向箭头 多个文件之间切换
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 退出所有
:wqall
3、编辑二进制文件
以二进制方式打开文件
vim –b binaryfile
扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
:%!xxd –r 转换回二进制
编辑二进制文件
~]# xxd /tmp/profile
4、保存文件
当编辑一个文件时,如果该文件存在,文件被打开并显示文件内容;如果该文件不存在,当编辑后第一次存盘时创建它。
退出编辑器。需要退出vi编辑器时,可以执行“:q”命令。若文件内容已经修改保存,仅使用“:q”命令将无法成功退出,这时需要使用“:q!”命令强行退出(不保存即退出)。
末行模式:(输入”:”进入末行模式)
:w 保存文件,当文件已经存在时,使用此命令
:w new_filename 将文件另存为
:! 强行操作
:w! 强行保存文件
:q 退出
:q! 强行退出
:wq 或 :x 保存退出
:x!
命令行模式:(Esc)
ZZ 保存退出
ZQ:不保存退出
三、命令模式中的操作命令
1、输入模式切换
在命令模式中,使用a、i、o等按键可以快速切换至输入模式,同时确定插入点的方式和位置,以便录入文件内容。需要返回命令模式时,按Esc键即可。
常见的几个模式切换键及其作用如下:
a:在当前光标位置之后插入文内容
A:在光标所在行的末尾(行尾)插入内容
i:在当前光标位置之前插入内容
I:在光标所在行的开头(行首)插入内容
o:在光标所在行的后面插入一个新行(小写字母o)
O:在光标所在行的前面插入一个新行(大写字母O)
2.、移动光标
字符间跳转
直接使用键盘的四个方向键完成相应的光标移动。
h: 将光标向左移动一格
l: 将光标向右移动一格
j: 将光标向下移动一格
k: 将光标向上移动一格
#COMMAND:跳转由#指定的个数的字符
单词间跳转
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数
Ctrl+COMMAND:以连续字符算一个单词
当前页跳转
H:将光标移动到该屏幕的页首
M:将光标移动到该屏幕的中间行首
L: 将光标移动到该屏幕的最后一行行首
行首行尾跳转
^: 跳转至行首的第一个非空白字符(相对行首)
0或 home键: 数字0,将光标移动到该行的行首(绝对行首)
$ 或 end键: 将光标移动到该行的行末(绝对行尾)
其中home和end键同样适用于vi的输入模式
行间移动
#G:#为数值,跳转至由#指定行的行首
G:将光标移动到文章的最后一行
1G 或 gg: 将光标移动到文章的第一行
Enter:移至下行行首
句间移动,以“.”为分隔符
):下一句
(:上一句
段落间移动
}:下一段
{:上一段
翻页操作
Ctrl+F 或 page down: 向文件尾部翻一屏
Ctrl+B 或 page up: 向文件首部翻一屏
Ctrl+D: 向文件尾部翻半屏
Ctrl+U:向文件首部翻半屏
其中PageDown和PageUp键同样适用于vi的输入模式
删除操作
x 或 del键:删除光标处的单个字符
#x: #为数值,删除光标处后面的#个字符(包含光标处字符)
X: 删除当前光标前的单个字符
dd: 删除当前光标所在行
#dd:#为数值,删除从光标处开始后面#行内容
d^: 删除当前光标之前到行首的所有字符
d$: 删除当前光标处到行尾的所有字符
dCOMMAND:命令可为h,l,j,k,分别表示删除光标前后单个字符、上下一行内容
d后面结合方向键可以删除当前光标处前一字符、后一字符、上两行、下两行
d0: 删除到行首
dw: 删除整个单词,如光标不在词首,则删除从当前到词尾
de: 光标后面的单词,如光标不在词首,则删除从当前到词尾
db: 删除光标前面的单词,如光标不在词尾,则删除从当前到词首
D:从当前光标位置一直删除到行尾
2d6 从第二行开始删除,一共删除6行
替换命令(r, replace)
r: 替换光标所在处的单个字符
R: 切换成REPLACE模式,连续替换后面字符,按Esc结束
xp: 交换光标所在处的字符及其后面字符的位置(x删除,p粘贴)
~: 转换大小写
gU 变大写
gu 变小写
复制、剪切、粘贴
Y 复制光标所在行整行内容
yy 复制光标所在行整行的内容
#yy 复制从光标处开始的#行内容
#yw 例如:2yw就是复制两个单词
y$ 复制光标所在处到行尾的内容
y0 复制光标前一个字符到行首的内容(绝对,包括制表符)
y^ 复制光标前一个字符到行首的内容(相对)
ye 从当前位置拷贝到本单词的最后一个字符
yw 复制当前光标所在位置到单词尾字符的内容,相当于复制一个单词
100ic [ESC] 在当前位置向后粘贴“ c” 100次
p 粘贴到光标位置处之后
P 粘贴到光标位置处之前
:3,5y 复制第三行到第五行内容
撤销操作
u: 用于取消最近一次的操作,多次重复按u键恢复已进行的多步操作
#u:撤销之前多次更改
U: 取消对当前行所做的所有编辑
Ctrl+R 可以恢复对使用u命令的操作
. 重复前一个操作
n. 重复前一个操作n次
其他命令
CTRL+s 锁定
Ctrl+q 解锁
四、命末行模式中的操作命令
:r filename 读文件内容到当前文件中(当前行的下面)
:r!command 将执行命令的结果写入到文件中
:!command 不退出vim执行命令
:set nu number,显示行号
:set nonu nonumber,取消显示行号
:set autoindent 缩进每一行,使之与前一行相同。常用于程序的编写。
:set noautoindent 取消缩进
:set number 在编辑文件时显示行号
:set nonumber 取消行号显示
:set ruler 在屏幕底部显示光标所在的行、列位置
:set noruler 不显示光标所在的行、列位置
:n1,n2 co n3 将从n1开始到n2为止的所有内容复制到n3后面
:n1,n2 m n3 将从n1开始到n2为止的所有内容移动到n3后面
:n1,n2 d 删除从n1开始到n2为止的所有内容
:n 直接输入要移动到的行号即可实现跳行
:/str/ 从当前光标开始往后移动到有 str 的地方
:?str? 从当前光标开始往前移动到有 str 的地方
:setsm showmatch,成对匹配
:setnosm 取消成对匹配
:setai 启用自动缩进
:setnoai 禁用自动缩进
:set hlsearch 启用高亮搜索
:set nohlsearch 取消高亮搜索
:syntax on 启用语法高亮
:syntax off 禁用语法高亮
:set ic 启用忽略字符的大小写
:set noic 不忽略字符的大小写
五、可视化模式
允许选择的文本块
v 面向字符
V 面向行
ctrl-v 面向块
可视化键可用于与移动键结合使用:
w, ) , },箭头等
突出显示的文字可以被删除,复制,变更,过滤,搜索/替换等
六、扩展模式:地址定界
:start_pos,end_pos
#: 具体第#行,例如2表示第2行;
#,#: 从左侧#表示行起始,到右侧#表示行结尾
#,+#: 从左侧#表示的行起始,加上右侧#表示的行数
:2,+3 表示2到5行
.: 当前行
$: 最后一行
.,$-1 当前行到倒数第二行
%: 全文, 相当于1,$
/pat1/,/pat2/
从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/
/pat/,$
使用方式:后跟一个编辑命令
w file: 将范围内的行另存至指定文件中
r file:在指定位置插入指定文件中的所有内容
七、搜索查找替换
查找
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向,查找下一个
N:与命令反方向,查找下一个
s: 在扩展模式下完成查找替换操作
格式: s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用\1,\2, ...
等后向引用符号;还可以使用“ &”引用前面查找时查找到的整个内容
修饰符:
i: 忽略大小写
g: 全局替换;默认情况下,每一行只替换第一次出现
gc:全局替换,每次替换前询问
查找替换中的分隔符/可替换为其它字符,例如
s@/etc@/var@g
s#/boot#/#i
示例:
:s/old/new 用new替换行中首次出现的old
: s/old/new/g 用new替换行中所有出现的old
:3,9 s/old/new/g 用new替换从第3行到第9行中出现的old
:% s/old/new/g 用new替换整篇中出现的old
:s/old/new/gc 替换关键词之前替换
八、vim的寄存器
有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享。
用a, b,…,z表示,用“寄存器表示,放在数字和命令之间
如: 3"tyy 表示复制3行到t寄存器中;"tp 表示将t寄存器内容粘贴
未指定,将使用无命名寄存器
有10个数字寄存器,用0, 1, …, 9表示, 0存放最近复制内容, 1存放最近删除内容。当新的文本变更和删除时, 1转存到2, 2转存到3,以此类推。数字寄存器不能在不同会话间共享。
九、定制vim的工作特性
当使用vim打开文件时可以输入set COMMAND设置vim的工作特性,这些都是临时生效的,关闭文件后设置的特性都失效了,要想永久生效可以把命令写入到文件中。
配置文件:永久有效
全局: /etc/vimrc
个人: ~/.vimrc 同时存在,个人配置生效
十、了解更多
vi/vim内置帮助
:help set
:help
:help topic
~]$vimtutor