vi是linux中非常强大的文本编辑器,必须对该命令的各种操作都达到熟悉的地步,才能更好的展开学习工作。本文仅记录了常用的一些操作。

一、vi简介

vi 编辑器是 Linux/UNIX 环境下经典的编辑器,vi 可以执行输出、删除、查找、替换、块操作等众多文本操作,另外,vim 是 vi 的增强版,与 vi 编辑器完全兼容,所以此处仅记录vi的使用操作。

二、vi工作模式及切换

vi 编辑器有 3 种基本工作模式,分别是命令模式、文本输入模式和末行模式

  • 命令行模式
    使用 vi 命令进入 vi 编辑器状态下的模式,或者在其他模式下按下Esc键也可进入命令模式。该模式下用户可以执行命令,详见下文。
  • 末行模式
    在命令模式下,用户按 键即可进入末行模式下,此时 vi 会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个 作为末行模式的说明符,等待用户输入命令。该模式下,用户可以做一些与输入文字无关的事,入搜索字符串、替换关键词等。末行命令执行完后,vi 自动回到命令模式。
  • 文本输入模式
    命令模式下点击键盘上的 [aoi ]等键,就会进入该模式。在该模式下,用户输入的任何字符都被 vi 当做文件内容保存在该文件中,并将其显示在屏幕上。按下Esc键,即可回到命令模式下。

三、vi的基本使用方法

1. vi的进入、保存、退出

进入:vi filename
保存退出需在末行模式下进行操作,末行模式下输入如下字符
:q   表示直接退出,但是若在文本模式下修改过内容则不能直接退出,即该命令生效条件是,未对文件内容进行任何的编辑操作
:wq  保存该文件后退出
:x   同:wq一样,保存该文件后退出
:q!  不保存内容,强制退出。如:在误修改文件内容后,执行该命令会忽视修改操作,直接退出vi,即文件内容未被修改,与编辑前保持一致。适用于误操作

2. 光标移动操作(重要)

vi中光标的移动既可以在命令模式下,也可在文本模式下,不过方法不尽相同
文本模式下:四个方向键
命令模式下:四个方向键以及如下。注:以下命令在屏幕没有回显
h  左移。若在按h前,按下数字n,则光标左移n个字符
j  下移。若在按j前,按下数字n,则光标下移n行
k  上移。若在按k前,按下数字n,则光标上移n行
l  右移。若在按l前,按下数字n,则光标右移n个字符
0  行首。数字0
$  行尾。
H  屏幕上显示的第一行,不一定是文件头
L  屏幕上显示的最后一行,不一定是文件尾
gg 光标移动到文件头。连续按两下g键
G  光标移动到文件尾。大写状态下按一下G键
nG 光标移动到第n行
w/W 光标移动到下一个单词的词首(大小写对单词的切割符号是不一样的)
e/E 光标移动到下一个单词的词尾(大小写对单词的切割符号是不一样的)
b/B 光标移动到上一个单词的词首(大小写对单词的切割符号是不一样的)
M  光标移动到屏幕的中间一行
{  将光标向前移至上一个段落的开头。一个段落被定义为是以一个空白行开始和结束的片段
}  将光标向前移至下一个段落的开头
末行模式下光标在整个文件中的移动
:0 光标移动到文件的第1行
:$ 光标移动到文件的最后一行
:n 光标移动到文件的第n行

3. 文本插入操作

以下操作会从命令模式切换到文本输入模模式
3.1 插入insert命令
i  插入文本从光标所在位置前开始
I  将光标移到当前行的行首,然后在其前插入文本
3.2 附件append命令
a  在当前光标所在位置之后追加新文本
A  将光标移到当前行的行尾,然后在其后追加新的文本
3.3 打开open命令
o  在光标所在行的下面新开一行,并将光标置于该行的行首,等待输入文本
O  在光标所在行的上面新开一行,并将光标置于该行的行首,等待输入文本

4. 文本的修改

均需在命令行模式下

4.1 文本删除、移动
x   删除光标处的字符。若在x之前加上数字n,则删除从光标所在位置开始向右的n个字符。
X   删除光标前面的那个字符。若在X之前加上数字n,则删除从光标前面那个位置开始向左的n个字符。
dd  删除光标所在的整行。若在dd前加上数字n,则删除当前行及其后的n-1行的内容
d$或D  两者功能一样,删除从光标所在处开始到行尾的内容
d0  删除从光标前一个字符开始到行首的内容
dw  删除一个单词。若光标在某个词的中间,则从光标位置开始删至词尾。若在dw前加上数字n,则删除n个指定的单词

4.2 文本复制、粘贴
yy 复制光标所在的整行。若在yy前加上数字n,则复制当前行及其后的n-1行的内容
p  粘贴。
// dd,yy,p 类似于Windows下的剪切、复制、粘贴

4.3 取消上一命令undo,恢复到误操作之前的状态
u  取消刚才输入的命令。继续多次按u,类似于WPS中一致按ztrl+z,会一直回退,不管被编辑了多少次 
U  取消刚才输入的命令。只能回退一次,即按一次大写U,回退到刚才的状态,再按一次大写U,就又到现在的状态了。

4.4 重复命令 redo
重复命令只能在命令模式下工作,效果是再执行一次刚完成的命令。结果是依赖光标当前位置的
. 即命令模式下按“.”即可

5. 文本的搜索与替换

末行模式下进行操作,有回显

5.1 搜索
/  从光标位置处向文件尾方向搜索
? 从光标位置处向文件头方向搜索
若输入的模式被找到,光标会停在找到的模式上。
n  继续搜索下一个匹配的模式
N  找到上一个匹配的模式
5.2 替换 (所有的文本替换操作均以 : 开头)
:s/text1/text2    将匹配到的第一个text1替换成text2
:s/text1/text2/g  将所有的text1替换成text2
:m,ns/text1/text2/g  将从m行开始到n行结束的所有的text1替换成text2。$代表末行,所以 :1,$s/text1/text2/g 会将文件内所有的text1替换成text2

6. 高级应用技巧

末行模式

:set nu      显示行号
:set nonu    关闭显示行号功能
:set ic      忽略大小写,主要是为了方便搜索
:set noic    不忽略大小写
:syntax on   打开关键字高亮显示功能
:syntax off  关闭高亮显示
Logo

更多推荐