Linux系统中的vi/vim指令【详解】
vi是Unix世界里极为普遍的全屏幕文本编辑器,vim是它的改进版本Vi IMproved的简称。几乎可以说任何一台Unix机器都会提供这套软件。
只要简单的在Shell下执行vi就可以进入 vi 的编辑环境。在实际操作之前先对它有个了解会比较好。
vi 有两种模式,输入模式以及指令模式。输入模式即是用来输入文字资料,而指令模式则是用来下达一些编排文件、存档、以及离开 vi 等等的操作指令。当执行 vi 后,会先进入指令模式,此时输入的任何字元都视为指令。
第一步:
1、文本编译工具vi使用
vi的名字取自于visual,意为“直观”,它是一个全屏幕编辑程序。还有gedit、emacs在Linux系统中vi是最常用的编辑程序,它的文本编辑功能十分强大,但使用起来比较复杂。
2、Linux系统中的vi其实是vim,是vi的增强版。vi编辑程序有两种工作模式:
命令模式(指令模式):此模式下的按键当作指令来处理。
输入模式:此模式的按键作为真正的输入。
第二步:
vi操作模式的切换,要进入输入模式,可以按如下命令键:
新增:‘a’,从光标后开始输入文本。‘A’,从光标所在行末尾输入新的文本。
插入:‘i’,从光标前开始插入文本。‘I’,从光标行的第一个非空格字符前开始插入文本。
开始:‘o’,从光标所在行下新增一行并进入输入模式。‘O’,从光标所在行上新增一行并进入输入模式。
第三步:
从输入模式按ESC进入命令模式
第四步:
进入和退出vi
进入vi,在提示符下:
vi
vi 文件名
退出vi,在指令模式下:
:q,退出
:wq,存盘后退出
:q!,不存盘强制退出
:x,强制存盘退出
第五步:
删除和修改文本
指令模式下:
x:删除光标处的一个字符
dd:删除光标所在行
r:修改光标所在字符
R:进入改写状态
s:删除光标所在字符,并进入输入状态
S:删除光标所在行,并进入输入状态
第六步:
光标移动
1、指令模式下:
h:向左移动一列
j 或+:向下移动一行
k 或-:向上移动一行
l:向右移动一列
组合:nh,nj,nk,nl。分别是移动n行(列)
在有方向键的键盘上,无论指令模式或输入模式都可以用方向箭头来移动光标
2、光标按行移动
指令模式下:
:n回车:将光标移动到第n行
:$回车或者L:将光标移动到最后一行
M:将光标移动到中间一行
H:将光标移动到第一行
:set number:显示行号
:set nonumber:取消显示行号
3、光标按单词移动
指令模式下:
w:将光标移动到下一个单词头
b:将光标移动到前一个单词头
e:将光标移动到下一个单词尾
组合:nw、nb、ne
4、光标按字符移动
指令模式下:
$:将光标移动到当前行尾
^或0:将光标移动到当前行首
n|:将光标移动到当前行的第n个字符
fm:将光标移动到当前行的下一个字符m处
光标返回原处
两个单引号‘’
第七步:
文本编辑
1、翻页
指令模式下:
Ctrl+d:下翻半屏
Ctrl+u:上翻半屏
Ctrl+f:下翻一屏
Ctrl+b:上翻一屏
2、查找
指令模式下:
/string:从当前位置向前查找字符串string
?string:从当前位置向后查找字符串string
继续查找:
n:沿前述查找方向继续查找同一字符串
N:沿前述查找方向的反方向继续查找同一字符串
3、删除文本
指令模式下:
x:删除字符
dw:删除单词
dd:删除行
D:删除从光标到行末所有字符
dfm:删除从光标到第一个字符m间的文本
:5d:删除第5行
:5,$d:删除从第5行到最后一行
可以和整数n组合
4、撤销和重复命令
指令模式下:
u:撤销最后一个更改操作
U:撤销对本行的所有修改
5、文本替换
指令模式下:
m:替换当前字符为m,替换后仍为命令模式
R:替换当前字符后的一系列字符,替换后变为输入模式。
s:多个字符替换单个字符
cw:单词替换
cc:行替换
C:替换当前行剩余部分
cfm:替换当前字符到指定的字符m
6、文本删除与替换对比
命令类型 删除 替换
字符 x r
单词 dw cw
行 dd cc
从光标到行尾 D C
从光标到字符m dfm cfm
7、全局替换
指令模式下:
搜索当前行的第一个实例
:s/bash/sch把当前行的第一个bash换为sch
搜索指定行的第一个实例
:1,10s/bash/sch 把1到10行bash换为sch
:5,$s/bash/sch 把5到末行bash换为sch
设置过滤条件进行搜索
:g/var/s/bash/sch把包含var行中的bash替换为sch
同一行中替换所有实例
:s/bash/sch/g把当前行中所有bash替换为sch
替换整个文件中的所有实例
:1,$s/bash/sch/g把整个文件中的bash替换为sch
8、移动和复制文本
指令模式下:
yy:复制当前行
dd:剪切当前行(删除)
p、P:粘贴当前行
9、复制和移动文本块
指令模式下:
把某(几)行复制并粘贴到某行后
:5 copy8 把5行复制并粘贴到第8行后
:1,5 copy$ 把1-5行复制并粘贴到末行后
:.,$ copy0 把当前行到末行复制并粘贴到文件头
把copy改为move即为移动文本块(注:.表示当前行,0表示文件头,$表示文件尾)
第八步:
文件保存
指令模式下:
:w 保存文件
:wq或者:x或者ZZ 保存并退出vi,返回linux提示符
:w f1.c 把当前文件另存为f1.c
:q! 放弃对文件的保存,直接退出
1、保存文本块
指令模式下:
:2,5 write f2 把第2到第5行另存为文件f2
保存文本块,并直接覆盖掉已有(如果有)文件
:2 write! f2 把第2行强行另存为文件f2
向文件追加文本
:2 write >> f2 把第2行追加到文件f2末尾
第九步:
与shell交互
指令模式下:
读某文件的内容到当前打开文件
:5 read a 把文件a中的内容读到当前打开文件的第5行后
在vi中执行shell命令
:!pwd
在vi中执行shell命令,并把结果添加到vi中
:5 read! pwd把pwd执行结果插入到第5行后
:e 在vi中编辑某文件时,不退出vi而建立新文件
:n 在vi中编辑某文件时,不退出vi而加载新文件