**vi是文本编辑器，只编辑纯ASCII码的文档，没有任何多余的修饰符。**


**首先需要确保系统已经安装了 VI 工具，那么怎样去检查是否已经安装了呢？
使用 rpm 命令查看是否已安装 vi：**

    [root@exercise1 ~]# rpm -qf `which vi`
    vim-minimal-7.4.160-2.el7.x86_64
    
    ###以上输入的查询结果表示已安装好


**vim是vi的==增加版==，最明显的区别就是vim可以==语法加亮==，它完全兼容vi**

    安装
    yum -y install vim


### 模式介绍：
    （1） 首次进入文件 处于“一般模式”。
    （2） 出现 “Insert” 处于“编辑模式”。
    （3） 输入 : 处于“命令行模式”。
    
    即有三种模式：一般模式、编辑模式、命令行模式

### 模式切换
    1. 一般模式 ==> 编辑模式： 
        （1） i：当前字符之前插入 （光标前）
        （2） I：行首插入 （行首）
        （3） a：当前字符之后插入 （光标后）
        （4） A：行尾插入（行尾）
        （5） o：下一行插入 （另起一行）
        （6） O：上一行插入（上一行插入）
    
    2. 在一般模式下做的操作：
        （1） h：光标向左移动
        （2） j ：光标向下移动
        （3） k：光标向上移动
        （4） l ：光标向右移动
        （5） 0 和 home 键：切换到行首， $和 end 键表示切换到行尾
        （6） gg：快速定位到文档的首行 , G 定位到未行
        （7） 3gg：或者 3G 快速定位到第 3 行
        （8） u：撤销一步，每按一次就撤销一次
        （9） r ：替换
        （10） /string(字符串)：找到或定位你要找的单词或内容，如果相符内容比较多，
        我们可以通过 N、n 来进行向上向下查找，并且 vi 会对查找到的内容进行高亮显示，
        取消用 :noh
        （11） /^d：^符号表示以什么开头，查找以字母 d 开头的内容
        （12） /t$：$符号表示以什么结尾，查找以字母 t 结尾的内容

    3.  一般模式---》对文本进行编辑：
​        对于文本的内容编辑主要有：删除、复制、粘贴、撤销、等等常见操作。
​        （1） y：复制（以字符为单位）表示对单个字符进行复制，如果要复制整行，用 yy（以行为单位）
​        （2） Nyy：复制 N 行，比如： 2yy ，表示在光标所在的行往下复制 2 行
​        （3） dd：删除，以行为单位，删除当前光标所在行
​        （4） Ndd：删除 N 行，比如：2dd，表示光标所在行往下删除 2 行
​        （5） p：在光标所在位置往下插入粘贴的内容
​        （7） x：向后删除一个字符，等同于 Delete
​        （8） X：向前删除一个字符
​        （9） D：从光标处删除到行尾
​        （10） u：撤销操作
​        （11） ctrl+r：还原撤销过的操作，将做过的撤销操作再还原回去，也就是说撤销前是什么样，再还原成什么样
​      


​        总结：vi 如何进入其它模式。
​        （1） a、A、o、O、i、I 都是可以进行插入，编辑模式
​        （2） ： 输入冒号进入命令行模式
​        （3） r 擦除、改写，进入替换模式
​        （4） 进入以上模式后，想要退出 ，按 esc

​        4.命令行模式操作
​        （1） :w 保 存 save
​        （2） :w! 强制保存
​        （3） :q 没有进行任何修改，退出 quit
​        （4） :q! 修改了，不保存，强制退出
​        （5） :wq 保存并退出
​        （6） :wq! 强制保存并退出
​        （7） :x 保存退出
​        （8） :w filename 保存到新文件
​        （9） :n1,n10 w filename 将n1到n2的内容保存到新文件


### **<font color="#dd0000">文本替换:</font>**
**格式 : 范围（<font color="#dd0000">其中%代表所有内容</font>）   s分隔符 旧的内容 分隔符 新的内容  （分隔符可以自定义）**

**默认是每一行的第一个符合要求的词   (/g全部)**


    :1,3 s/Jan/Feb              替换第1到3行中出现的第一个Jan进行替换为Feb
    :1,3 s/Jan/Feb/g            替换第1到3行中查找到所有的Jan进行替换为Feb
    :3 s/Jan/January            只把第3行中内容替换了
    :% s/Jan/January/g  	    将文本中所有的Jan替换成January
    :% s/Jan/January/gi	        将文本中所有的Jan替换成January, 并且忽略Jan的大小写
    :% s@a@b@g	                将文本中所有的a替换成b
    :1,$ s/Jan/January/g        替换第一行到最后所有的Jan替换成January


### 块选择
    在一般模式下：
    v       字符选择，会将光标经过的地方选中
    V       行选择，会将光标经过的地方选中
    ctrl+v  可以用长方形的方式选择数据
    shift+v 进入行模式
    y       将选中的地方复制
    d       将选中的地方删除



```
vim异常退出: 
方法1：
vim -r filename 恢复 
方法2：
rm -f .filename.swp 删除 

vim快速跳转至多少行: 

vim proxy.conf +12 


```







### 自定义 vi 使用环境

    临时设置
        （1） :set nu 设置行号
        （2） :set nonu 取消设置行号
        （3） :N 移动到第N行
    
    永久设置
        [root@exercise1 ~]# vi /etc/vimrc #设置后会影响到系统所有的用户
        
        [root@exercise1 ~]# vi ~/.vimrc #在用户的家目录下，创建一个
                                   #以点开头的的文件.vimrc 此修改的应用范围仅生效于
                                   #该用户，~符号表示匹配当前登录用户匹配家目录，
                                   #以.点开头的表示隐藏文件
        
        root用户下所有文件打开默认带行号：
        [root@exercise1 ~]# vi /root/.vimrc   #使用vi命令创建或修改家目录下的.vimrc并添加set nu
        set nu
        [root@exercise1 ~]# cat /root/.vimrc 
        set nu
        [root@exercise1 ~]# vi /etc/passwd    #以上设置完成后，使用vi打开文件，自动会显示行号

### vi/vim经典报错(这些报错有选项提示是用vim操作的)
    情况一：
    如果发现交换文件的占用进程状态是正在运行，说明有人正在修改该文件，一般我们会选择终止，或者退出。否则，
    谁最后退出，就以谁的修改版本为准。这样会造成先提交修改的用户修改的内容丢失。
![vim1.png](https://s2.loli.net/2022/01/10/TIQXP8Kz9kf1dUc.png)

    情况二：
    非正常状态退出vi，导致不正常的保存退出，导致Swap文件残留。
    出现以下提示。此时占据的进程号没有运行，这个是时候，我们一般会利用swp文件进行之前工作的恢复操作R，
    恢复后，即可删除swp文件。也可以直接在报错界面输入:q退出，直接删掉.swp文件。


​    
​    [root@exercise1 opt]# ls -a   #此时没有.swp文件
​    .  ..  1  1d  1e  1f  2  3  4  5  i.bak  id  j  log  log.bak  messages
​    [root@exercise1 opt]# vi /opt/messages   #vi进去以后使用ctrl+z停止 
​    
​    [1]+  已停止               vi /opt/messages
​    [root@exercise1 opt]# vi /opt/messages   #此时进去会报错
​    [root@exercise1 opt]# ls -a   #查看发现多了一个.swp文件
​    .  ..  1  1d  1e  1f  2  3  4  5  i.bak  id  j  log  log.bak  messages  .messages.swp
​    [root@exercise1 opt]# rm -rf .messages.swp   #删掉.swp文件，删完再进去就正常了
​    [root@exercise1 opt]# 
![vim2.png](https://s2.loli.net/2022/01/10/3MXe9Df2IY7xWOS.png)
![vim2_1.png](https://s2.loli.net/2022/01/10/gqWdPKsGz1wpFto.png)



### vi练习示例1

1.将/etc/passwd复制到/opt目录下，并重命名为test.txt

[root@exercise1 opt]# cp /etc/passwd  /opt/

[root@home opt]# mv passwd test.txt



2.用vim打test.txt并显示行号

vim test.txt      :set nu

3.分别向下、向右、向左、向右移5个字符，分别向下、向上翻两页



4.把光标移动到第10行，让光标移动到行末，再移动到行首，移动到test.txt文件的最后一行，移动到文件的首行

10gg     $

5.搜索文件中出现的root并数一下一共出现多少个，不区分大小写搜索

/root /gi   4

6.把从第一行到第三行出现的root替换成-od-，然后还原上一步操作

:1,3 s/root/-ob-/g![image-20220713123924586](C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713123924586.png)

8.把整个文件中所有的root替换成-od-

:% s/root/-ob-![image-20220713124108785](C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713124108785.png)

9.把光标移动到20行，删除本行，还原上一步操作

dd  u

10.删除第19行，还原上一步操作

dd  u

11.删除从5行到10行的所有内容，还原上一步操作

shift+v     d

12.复制2行并粘贴到11行下面，还原上一步操作

shift+v     2行y    11行下面p 

![image-20220713125030150](C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220713125030150.png)

13.复制从11行到15行的内容并粘贴到8行上面，还原上一步操作

shift+v            y             7行下面p 

14.把13行到18行的内容移动文件的尾部，还原上一步操作

：19m12          或 ：13，18m19

15.光标移动到首行，把sbin/nologin改成bin/bash

gg    :1 s/bin/sbin  :1 s/bash/nologin

16.在第一行下面插入新的一行，并输入＂＃Helo!＂

o    

17.保存文档并退出

 :wq 

### vi练习示例2

```
[root@exercise1 opt]# cat proxy.conf
server {
        listen       8080;
        server_name  LOCALhost;
        location / {
        	proxy_pass http://127.0.0.1:8080;
        	proxy_set_header Host $http_host;
        	proxy_set_header X-Forward-for;
        	proxy_intercept_errors on;
			proxy_next_upstream error timeout;
			proxy_next_upstream_timeout 3s;
			proxy_next_upstream_tries 2;
			error_page 500 502 403 404 /proxy_error.htm1;          
        } 
        location =/proxy_error.html {
            root /code/proxy;
        }
    }
```

1.使用vim打开proxy.conf文件

vim proxy.conf

2.修改listen为Listen大写，并将8080修改为80

:% s/Listenlisten/Listen/g        :3 s/8080/80



3.修ServerName为server name小写。

:% s/ServerName/server name/g 

4.修LOCALhost为localhost



5.在server name行下插入一行shift+v  

o    shift+v  

5.复制5-14行的内容，然后将其粘贴到14行下面

shift+v            y   14行下面p 

6.删除与proxy_set_headerj相关的两行全部删除

shift+v       d

7.如上操作完成后，在13-20行前面加上#号



8.删除21-23的行，然后保存当前文件

shift+v      d       ：wq