(1)vi的简介
Vi是Visual interface 的简称,可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的功能。
Vi不是一个排版程序,不像MS Word 或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是-一个文本编辑程序。
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
vim 的官方网站 (https://www.vim.org) 自己也说vim 是一个程序开发工具而不是文字处理软件。
(2)进入vi
下表列出了进入vi文本编辑器的方式及说明。
进入Vi文本编辑器的方式 | |
方 式 | 说 明 |
vi | 进入Vi的默认模式 |
vi filename | 打开新建文件filename,并将光标置于第一行首 |
vi n filename | 打开文件flename,并将光标置于第n行首 |
vi filename | 打开文件filename,并将光标置于最后一行首 |
vi /pattern filename | 打开文件filename,并将光标置于第一个与pattern匹配的串处 |
vi -r filename | 打开上次用Vi编排时发生系统崩溃的文件flename,并恢复它 |
(3)vi/vim的3种运行模式
Vi有3种基本工作模式:普通(normal)模式、插入(insert) 模式和命令行(command-line 或Cmdline)模式,如下图所示。
进入Vi之后,首先进入的就是普通模式。进入普通模式后Vi 等待编辑命令输入而不是文本输入,也就是说这时输入的字母都将作为命令来解释。在普通(normal)模式里,可以输入所有的普通编辑命令。普通模式亦称为命令(command) 模式。
进入普通模式后光标停在屏幕第一行首位上(用_表示),其余各行的行首均有一个“~”符号,表示该行为空行。最后一行是状态行,显示出当前正在编辑的文件名及其状态。如果是[New File], 则表示该文件是一个新建的文件。如果输入Vi之后带有文件名参数,文件已在系统中存在,则在屏幕上显示出该文件的内容,并且光标停在第一行的首 位,在状态行显示出该文件的文件名、行数和字符数。
在普通模式下输入插入命令i、附加命令a、打开命令0、修改命令C、取代命令r或替换命令s都可以进入插入模式。在插入模式下,用户输入的任何字符都被Vi当作文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令行模式下,按<Esc> 键即可。
在普通模式下,执行ex命令使用“:",查找使用“?”和“/”,调用Shell命令使用“!”。多数文件管理命令都是在此模式下执行的。末行命令执行完后,Vi 自动回到普通模式。
若在命令行模式下输入命令过程中改变了主意,可用<Back space>键将输入的命令全部删除,之后再按一下(Back space) 键,即可使Vi回到普通模式。
(4)普通模式下的操作
下面的各个表分别列出了普通模式下的几类命令。
普通模式下进入插入模式 | |
命令 | 说 明 |
i | 从光标所在位置前开始插入文本 |
I | 将光标移到当前行的行首,然后在其前插入文本 |
a | 用于在光标当前所在位置之后追加新文本 |
A | 将光标挪到所在行的行尾,从那里开始插入新文本 |
o | 将在光标所在行的下面新开一行,并将光标置于该行的行首,等待输入文本 |
O | 在光标所在行的上而插入一行,并将光标竖于该行的行首,等待输入文本 |
普通模式下的光标定位 | |||
命令 | 说 明 | 命令 | 说 明 |
G | 将光标移至最后一行行首 | $ | 移动到光标所在行的行尾 |
nG | 光标移至第n行首 | ^. | 移动到光标所在行的第-一个字符(非空格) |
n | 光标下移n行 | h,j,k,l | 分别用于光标左移、下移、上移、右移一个字符 |
n- | 光标上移n行 | H | 将光标移至当前屏幕首行的行首(即左上角) |
n$ | 光标移至第n行尾 | M | 将光标移至屏幕显示文件的中间行的行首 |
0 | 移动到光标所在行的行首 | L | 将光标移至当前屏幕的最底行的行首 |
普通模式下的替换和删除 | |||
命令 | 说明 | 命令 | 说明 |
rc | 用字符c替换光标所指向的当前字符 | nrc | 用字符c替换光标所指向的前n个字符 |
x | 删除光标处的字符 | nx | 删除从光标位置开始向右的n个字符 |
dw | 删除一个单词 | ndw | 删除n个指定的单词 |
db | 删除光标所在位置之前的一个词 | ndb | 删除光标所在位置之前的n个词 |
dd | 删除光标所在的整行 | ndd | 删除当前行及其后n-l行的内容 |
dG | 删除光标位置到最后一行的所有内容 | dIG | 删除光标所在位置到第一行的所有内容 |
d$ | 删除光标位置到当前行的末尾的内容 | d0 | 删除光标位置到当前行的开始的内容 |
普通模式下的复制和粘贴 | |
命令 | 说明 |
yy | 将当前行的内容复制到缓冲区 |
nyy | 将当前开始的n行内容复制到缓冲区 |
yG | 将当前光标位置到最后--行的所有内容复制到缓冲区 |
yIG | 将当前光标位置到第一行的所有内容复制到缓冲区 |
y$ | 将当前光标位置到当前行末尾的内容复制到缓冲区 |
y0 | 将当前光标位置到当前行开始的内容复制到缓冲区 |
P | 将缓冲区的内容写出到光标所在的位置 |
普通模式下的字符串搜索 | |||
命令 | 说明 | 命令 | 说明 |
/str | 往右移动到有str的地方 | n | 向相同的方向移动到有str的地方 |
?str | 往左移动到有str的地方 | N | 向相反的方向移动到有str的地方 |
普通模式下的撤销和重复 | |||
命令 | 说 明 | ||
u | 取消前一次的误操作或不合适的操作对文件造成的影响,使之恢复到这种误操作或不合适操作被执行之前的状态 | ||
. | 再执行一次前面刚完成的某个命令 | ||
在普通模式下退出Vi | |||
命令 | 说 明 | 命令 | 说 明 |
ZZ | 存盘退出 | ZQ | 不保存退出 |
(5)命令模式下的操作
下列各表中列出了在命令模式下的常用命令。
在命令模式下跳行 | |
命令 | 说 明 |
:n | 直接输入要移动到的行号即可实现跳行 |
在命令模式下搜索和替换字符串 | |
命 令 | 说 明 |
:/str/ | 从当前光标开始往右移动到有sr的地方 |
?str? | 从当前光标开始往左移动到有str的地方 |
:/str/w file | 将包含有str的行写到文件file中 |
:/str1/str2/w file | 将从strl开始到st2结束的内容写入f.le文件中 |
:s/str1/str2 | 将找到的第1个str1替换为str2 |
:s/str1/str2/g | 将找到的所有str1替换为str2 |
:n1,n2s/str1/st2g | 将从n1行到n2行找到的所有的srl替换为str2 |
:1,s/str1/str2/g | 将从第I行到当前位置的所有的srl替换为st2 |
:sSs/str1/str2/g | 将从当前位置到结尾的所有的str1替换为stur2 |
:1,$s/str1/str2/gc | 将从第1行到最后一行的所有的str1替换为stur2,并在替换前询问 |
在命令模式下复制、移动和删除文件行(块) | |
命 令 | 说 明 |
:nl,n2 co n3 | 将从n1开始到n2为止的所有内容复制到n3后面 |
:n1,n2 m n3 | 将从n1开始到n2为止的所有内容移动到n3后面 |
:d | 删除当前行 |
:nd | 删除从当前行开始的n行 |
:n1,n2d | 删除从n1开始到n2为止的所有内容 |
:.,$d | 删除从当前行到结尾的所有内容 |
:/str1/,/str2/d | 删除从str1开始到str2为止的所有内容 |
在命令模式下的文件相关命令 | |
命 令 | 说 明 |
:w | 将当前编辑的内容存盘 |
:w file | 将当前编辑的内容写到file文件中 |
:n1,n2w file | 将从n1开始到n2结束的行写到file文件中 |
:nw file | 将第n行写到file文件中 |
:1,.w file | 将从第1行起到光标当前位置的所有内容写到file文件中 |
:.,$w file | 将从光标当前位置起到文件结尾的所有内容写到file文件中 |
:r file | 打开另一个文件file |
:e file | 新建file文件 |
:f file | 把当前文件改名为file文件 |
在命令模式下执行Shell命令 | |
命 令 | 说 明 |
:!Cmd | 运行Shell命令Cmd |
:n1,n2 w ! Cmd | 将n1到n2行的内容作为Cmd命令的输入,如果不指定n1和n2,则将整个文件的内容作为命令Cmd的输入 |
:r! Cmd | 将命令运行的结果写入当前行位置 |
在命令模式下设置Vi环境 | |
命令 | 说 明 |
:set autoindent | 缩进每一行,使之与前一行相同。常用于程序的编写 |
:set noautoindent | 取消缩进 |
:set number | 在编辑文件时显示行号 |
:set nonumber | 不显示行号 |
:set ruler | 在屏幕底部显示光标所在的行、列位置 |
:set noruler | 不显示光标所在的行、列位置 |
:set tabsto=value | 设置显示制表符的空格字符个数 |
set wrapmargin=value | 设置显示器的右页边。当输入进入所设置的页边时,编辑器自动回车换行 |
:set | 显示设置的所有选项 |
:set all | 显示所有可以设置的选项 |
在命令模式下退出Vi | |
命 令 | 说 明 |
:q | 退出Vi |
:wq | 保存退出Vi |
:q! | 不保存退出Vi |