Linux 操作系统 005-使用vi进行文本编辑
本节关键字:Linux、文本编辑、vi、命令模式、字符串替换、字符串查找
 本节相关指令:vi
vi的介绍
vi是一款由加州大学伯克利分校,Bill Joy研究开发的文本编辑器。vi是unix/linux操作系统中最经典的文本编辑器,只能是编辑字符,不能对字体、段落进行排版;它既可以新建文件,也可以编辑文件;它没有菜单,只有命令,且命令繁多。虽然vi的操作方式与其他常用的文本编辑器(如gedit)很不相同 ,但是由于其运行于字符界面,并可用于所有unix/linux环境,仍被经常使用。
vi的模式
vi 有三种命令模式:
- Command (命令)模式
- Inser(插入)模式
- Visual(可视)模式
Command(命令)模式,用于输入命令
命令模式是启动vi后进入的工作模式,并可转换为文本编辑模式和最后行模式。在命令模式下,从键盘上输入的任何字符都被当作编辑命令来解释,而不会在屏幕上显示。如果输入的字符是合法的vi命令,则vi就会完成相应的动作;否则vi会响铃警告。
Insert(插入)模式,用于插入文本
文本编辑模式用于字符编辑。在命令模式下输入i(插入命令)、a(附加命令)等命令后进入文本编辑模式,此时输入的任何字符都被vi当作文件内容显示在屏幕上。按Esc键可从文本编辑模式返回到命令模式。
Visual(可视)模式,用于视化的的高亮并选定正文
在命令模式下,按“:”键进入最后行模式,此时vi会在屏幕的底部显示“:”符号年作为最后行模式的提示符,等待用户输入相关命令。命令执行完毕后,vi自动回到命令模式。
为了实现跨平台操作兼容不同类型的键盘,在vi编辑器中无论是输入命令还是输入内容都是用字母键。例如按字母键“i”在文本编辑模式下表示输入字母“i”,如果在命令模式下则表示将工作模式转换为文本编辑模式。
vi的常用快捷键
光标移动
当我们按ESC进入Command模式后,我们可以用下面的一些键位来移动光标:
| 快捷键 | 说明 | 
|---|---|
| j | 向下移动一行 | 
| k | 向上移动一行 | 
| h | 向左移动一个字符 | 
| l | 向右移动一个字符 | 
| ctrl+b | 向上移动一屏 | 
| ctrl+f | 向下移动一屏 | 
| 向上箭头 | 向上移动 | 
| 向下箭头 | 向下移动 | 
| 向左箭头 | 向左移动 | 
| 向右箭头 | 向右移动 | 
我们编辑一个文件时,对于 j、k、l和h键,还能在这些动作命令的前面加上数字,比如 3j,表示向下移动3行。
插入模式(文本的插入)
| 快捷键 | 说明 | 
|---|---|
| i | 在光标之前插入 | 
| a | 在光标之后插入 | 
| I | 在光标所在行的行首插入 | 
| A | 在光标所在行的行末插入 | 
| o | 在光标所在的行的下面插入一行 | 
| O | 在光标所在的行的上面插入一行 | 
| s | 用输入的文本替换光标所在字符 | 
| S | 用输入的文本替换光标所在行 | 
文本内容的删除操作:
| 快捷键 | 说明 | 
|---|---|
| x | 删除光标处的一个字符 | 
| #x | 删除几个字符,#表示数字,比如3x | 
| dw | 删除一个单词 | 
| #dw | 删除几个单词,#用数字表示,比如3dw表示删除三个单词 | 
| dd | 删除一行; | 
| #dd | 删除多个行,#代表数字,比如3dd 表示删除光标行及光标的下两行 | 
| d$ | 删除光标到行尾的内容 | 
| J | 清除光标所处的行与下一行之间的换行,行尾没有空格的话会自动添加一个空格。 | 
| #J | 表示合并#(数字)行。 | 
退出保存
在命令模式下按 shift+: 文本底端出现冒号
| 快捷键 | 说明 | 
|---|---|
| :w | 保存; | 
| :w | filename 另存为filename; | 
| :wq! | 保存退出; | 
| :wq! | filename 注:以filename为文件名保存后退出; | 
| :q! | 不保存退出; | 
| :x | 应该是保存并退出,功能和:wq!相同 | 
撤销操作
| 快捷键 | 说明 | 
|---|---|
| u | 取消最近一次的操作,可以使用多次来恢复原有的操作 | 
| U | 取消所有操作 | 
| Ctrl+R | 恢复对使用u命令的操作 | 
复制操作
| 快捷键 | 说明 | 
|---|---|
| yy | 复制当前整行的内容到vi缓冲区 | 
| p | 粘贴复制的内容 | 
| yw | 复制当前光标所在位置到单词尾字符的内容到vi缓存区,相当于复制一个单词 | 
| y$ | 复制光标所在位置到行尾内容到缓存区 | 
| y^ | 复制光标所在位置到行首内容到缓存区 | 
| #yy | 例如:5yy就是复制5行 | 
| #yw | 例如:2yw就是复制两个单词 | 
如果要复制第m行到第n行之间的内容,可以在末行模式中输入m,ny例如:3,5y复制第三行到第五行内容到缓存区。
内容查找
vi的查找和替换功能主要在末行模式完成:
 自上而下的查找
 /要查找的字符串,其中/代表从光标所在位置起开始查找,例如:/work
 自下而上的查找
 ?要查找的字符串 例如:?work
内容替换
| 命令 | 说明 | 
|---|---|
| :s/old/new | 用new替换行中首次出现的old | 
| :s/old/new/g | 用new替换行中所有出现的old | 
| :#,# s/old/new/g | 用new替换从第#行到第#行中出现的old | 
| :% s/old/new/g | 用new替换整篇中出现的old | 
如果替换的范围较大时,在所有的命令尾加一个c命令,强制每个替换需要用户进行确认,例如:s/old/new/c 或s/old/new/gc
文件恢复
vi在编辑某一个文件时,会生成一个临时文件,这个文件以 .开头并以 .swp结尾。正常退出该文件自动删除,如果意外退出例如忽然断电,该文件不会删除,我们在下次编辑时可以选择一下命令处理:
| 快捷键 | 说明 | 
|---|---|
| O | 只读打开,不改变文件内容 | 
| E | 继续编辑文件,不恢复.swp文件保存的内容 | 
| R | 将恢复上次编辑以后未保存文件内容 | 
| Q | 退出vi | 
| D | 删除.swp文件 | 
或者使用vi -r 文件名 来恢复未保存的内容
跳转
| 快捷键 | 说明 | 
|---|---|
| G | 跳转到最后一行 | 
| gg | 跳转到第一行 | 
| n shift+g | 跳转到指定行,n为行号 |