【VIM编辑功能总结】

【一】Vim功能介绍

【1】什么是VIM

  • vi和vim是Linux下的一个文本编辑工具

  • VIM(Vi IMproved)是Linux下的一个文本编辑工具,相当于Windows系统下的记事本或Word文档。

  • 它是Vi编辑器的增强版。

【2】为什么要使用VIM?

  • 因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置(其实就是修改文件内容)。
  • 也就是说如果没有vi/vim,我们很多工作都无法完成。
  • PS: vim是学习linux最重要的命令之一

【3】VI与VIM有什么区别?

  • vi和vim都是文本编辑器,只不过vim是vi的增强版,比vi多了语法高亮显示,其他编辑功能几乎无差,所以使用vi还是vim取决个人习惯。(相当于windows系统下的文本编辑软件“记事本”与”notepad++”的区别)
  • PS:因为前期最小化安装CentOS系统,所以默认情况下没有vim命令
  • 但可以使用yum install vim -y安装

【4】如何使用VIM编辑器?

  • 在使用VIM之前,我们需要先介绍下VIM的三种模式:
    • 普通模式、编辑模式、命令模式
  • 每种模式分别支持多种不同的快捷键,要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法。

【5】VIM模式三种模式介绍

1.普通模式:

  • 主要是控制光标移动,可对文本进行复制、粘贴、删除等工作。
  • 使用vim filename 编辑一个文件时,一进入该文件就是普通模式了。
  • 在这个模式下,可以进行光标移动、复制、删除、粘贴操作。

2.编辑模式:

  • 主要进行文本内容编辑和修改
  • 从普通模式进入编辑模式,只需你按一个键即可(i, I, a, A, o, O)
  • 当进入编辑模式时,会在屏幕的最下一行会出现 “INSERT”标记
  • 从编辑模式回到普通模式只需要按键盘左上方的 ESC 键即可。

3.末行模式:

  • 主要用于保存或退出文本。
  • 在普通模式下,输入 “:” 或者 “/“ 即可进入命令模式。
  • 在命令该模式下,可进行的操作有,显示行号、搜索、替换、保存、退出。

【6】vim编辑打开文件整体流程

  • 1.默认打开文件处于普通模式
  • 2.从普通模式切换至编辑模式需要使用a、i、o
  • 3.编辑模式修改完毕后需要先使用ECS返回普通模式
  • 4.在普通模式输入”:”或”/“进入命令模式,可实现文件的保存与退出。
  • PS: 在vim中,无法直接从编辑模式切换到命令模式。

【二】VIM模式使用

【1】普通模式

(1)命令光标跳转

G        #光标跳转至末端
gg       #光标跳转至顶端
5gg      #光标跳转至当前文件内的第5行
$        #光标跳转至当前光标所在行的尾部
0        #光标跳转至当前光标所在行的首部
  • G:跳转至文件末尾
  • gg:跳转至文件开头
  • Ngg:跳转至当前文件内的第N行
  • $:跳转至当前行的末尾
  • ^ 或者 0:跳转至当前行的开头

(2)文件内容较多

ctrl+f  #往下翻页(行比较多)
ctrl+b  #往上翻页
  • ctrl+f:向下翻页(适用于行数较多的情况)
  • ctrl+b:向上翻页

(3)复制与粘贴

yy       #复制当前光标所在的行
5yy      #复制当前光标以及光标向下4行

p        #粘贴至当前光标下一行   
P        #粘贴至当前光标上一行
  • yy:复制当前行
  • Nyy:复制当前行及往下的N-1行
  • p(小写):粘贴至当前光标下一行
  • P(大写):粘贴至当前光标上一行

(4)删除、剪贴、撤销

dd       #删除当前光标所在的行   
4dd      #删除当前光标所在的行及往下的3行
dG       #删除当前光标以后的所有行
D        #删除当前光标及之后的内容  
x        #删除当前光标标记之后的字符
X        #删除当前光标标记之前的字符
dd & p   #剪切、先删除dd(number dd),后粘贴p
u        #撤销上一次操作
  • dd:删除当前行
  • Ndd:删除当前行及往下的N-1行
  • dG:删除当前光标后的所有行
  • D:删除当前光标及之后的内容
  • x:删除当前光标后的字符
  • X:删除当前光标前的字符
  • u:撤销上一次操作

(5)替换

r        #替换当前光标标记的单个字符
R        #进入REPLACE模式,连续替换,ESC结束
  • r:替换当前光标标记的单个字符
  • R:进入REPLACE模式,连续替换(按ESC键结束)

【2】编辑模式(从普通模式进入到编辑模式)

i   #进入编辑模式,光标不做任何操作
a   #进入编辑模式,将当前光标往后一位
o   #进入编辑模式,并在当前光标下添加一行空白内容


I   #进入编辑模式,并且光标会跳转至本行的头部
A   #进入编辑模式,将光标移动至本行的尾部
O   #进入编辑模式,并在当前光标上添加一行空白内容
  • i:在当前光标位置前插入
  • a:在当前光标位置后追加
  • o:在当前光标下插入一行空白内容
  • I:在当前行首插入
  • A:在当前行尾追加
  • O:在当前行上方插入一行空白内容

【3】命令模式(主要用于搜索/保存/退出文件)

(1)文件保存与退出

:w       		#保存当前状态
:w!      		#强制保存当前状态
:q       		#退出当前文档(文档必须保存才能退出)
:q!      		#强制退出文档不会修改当前内容
:wq      		#先保存再退出
:wq!     		#强制保存并退出
:x       		#先保存再退出
ZZ       		#保存退出, shfit+zz    
:number  		#跳转至对应的行号
:set nu  		#显示行号
:set nonu		#不显示行号
  • :w:保存当前状态
  • :w!:强制保存当前状态
  • :q:退出当前文档(需要先保存)
  • :q!:强制退出文档(不保存)
  • :wq:先保存再退出
  • :wq!:强制保存并退出
  • :x:先保存再退出
  • ZZ:保存并退出文件(快捷方式,按Shift+zz)

(2)文件内容查找

/string #需要搜索的内容(查找)
n       #按搜索到的内容依次往下进行查找
N       #按搜索到的内容依次往上进行查找
  • /string:搜索指定内容的字符串
  • n:顺序向下查找匹配内容
  • N:顺序向上查找匹配内容

(3)文件内容替换

:1,5s#sbin#test#g   #将1-5行中所有的 "sbin" 替换为 "test"
:1,5s#sbin#test#    #将1-5行中第一个出现的 "sbin" 替换为 "test"
:%s#sbin#test#g     #将整个文件中所有的 "sbin" 替换为 "test"
:%s#sbin#test#gc    #全局替换并提示是否需要替换
  • 这些命令用于在Vim编辑器中进行文件内容的替换操作。
  • 替换命令的基本语法是 :[range]s/pattern/replacement/[flags]
    • 其中 pattern 是要查找的内容
    • replacement 是要替换成的内容
    • flags 是可选的标志。
  • 示例: 假设有以下文本文件内容:
1. sbin
2. sbin
3. sbin
4. sbin
5. sbin
  • 执行命令 :1,5s#sbin#test#g 后,文件变为:
1. test
2. test
3. test
4. test
5. test
  • 执行命令 :1,5s#sbin#test# 后,文件变为:
1. test
2. sbin
3. sbin
4. sbin
5. sbin
  • 执行命令 :%s#sbin#test#g 后,文件变为:
1. test
2. test
3. test
4. test
5. test
  • 执行命令 :%s#sbin#test#gc 后,将逐个匹配替换,提示是否替换:
1. test (y/n/a/q/l/^E/^Y)?
  • 在提示中
    • 可以选择替换(y)
    • 不替换并进入下一个匹配(n)
    • 替换所有剩余的匹配(a)
    • 结束替换过程(q)
    • 向后查找匹配(l)
    • 向前查找匹配(^E)
    • 显示剩余的匹配(^Y)

(4)文件内容另存

:w /root/test.txt  #将当前文件内容另存为 /root/test.txt 文件
  • 这个命令用于将当前编辑的文件内容另存为指定的文件。
  • 使用 :w 命令可以将文件保存,后面跟上文件路径即可另存为指定路径的文件。
  • 示例:
    • 假设当前正在编辑一个名为 example.txt 的文件,并且想将其另存为 /root/test.txt
    • 执行命令 :w /root/test.txt 即可将文件内容保存到 /root/test.txt

(5)文件内容读入

:r  /etc/hosts  #将 /etc/hosts 文件的内容插入到当前光标所在行的下面
:5r /etc/hosts  #将 /etc/hosts 文件的内容插入到当前文件的第五行下面
  • 这些命令用于将指定文件的内容读入到当前编辑的文件中。
  • 示例:
    • 假设当前正在编辑一个文件,并且要在当前光标所在行的下面插入 /etc/hosts 文件的内容
    • 执行命令 :r /etc/hosts 即可实现。
  • 假设当前正在编辑一个文件,并且要将 /etc/hosts 文件的内容插入到当前文件的第五行下面
    • 执行命令 :5r /etc/hosts 即可实现。

【4】视图模式(从普通模式进入视图模式),主要进行批量操作

(1)ctrl+v 进入可视块模式,选中需要注释的行

  • 1.插入:按shift+i进入编辑模式,输入#,结束按ESC键
  • 2.删除:选中内容后,按x或者d键删除
  • 3.替换:选中需要替换的内容, 按下r键,然后输入替换后的内容

(2)shift+v 进入可视行模式,选中整行内容

  • 1.复制:选中行内容后按y键及可复制。
  • 2.删除:选中行内容后按d键删除。

【三】VIM扩展知识

【1】环境变量临时生效

:set nu             #显示行号
:set ic             #忽略大小写, 在搜索的时候有用
:set ai             #自动缩进
:set list           #显示制表符(空行、tab键)
:set no[nu|ic|ai…]  #取消临时设定的变量
  • 显示行号::set nu
  • 忽略大小写,在搜索时非常有用::set ic
  • 自动缩进::set ai
  • 显示制表符、空行和Tab键::set list
  • 取消临时设定的环境变量,例如取消行号设置::set nonu

【2】环境变量永久生效。

  • ~/.vimrc 个人环境变量(优先级高)
  • /etc/vimrc 全局环境变量
# vim  ~/.vimrc #当下次再打开文件自动显示行号并忽略大小写
set nu
set ic

#如果个人vim环境没有配置, 则使用全局vim环境变量配置。
#如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量。

【3】如何同时编辑多个文件

vim -o file1 file2  #水平分割
vim -O file1 file2  #垂直分割

#ctrl+ww 文件间切换
  • 在Vim中,你可以使用以下命令来同时编辑多个文件:

    • 水平分割打开文件:
      • vim -o file1 file2 这会将 file1 和 file2 水平分割在不同的窗口中,并同时编辑这两个文件。
    • 垂直分割打开文件:
      • vim -O file1 file2 这会将 file1 和 file2 垂直分割在不同的窗口中,并同时编辑这两个文件。
  • 在打开多个文件后,你可以使用 ctrl+ww 快捷键在不同的文件之间进行切换。

  • 例如,要同时编辑 file1 和 file2,可以在终端中输入以下命令:

【4】相同文件之间差异对比

  • 相同文件之间差异对比,通常用于对比修改前后差异
# diff      #文件对比   
# vimdiff   #以vim方式打开两个文件对比,高亮显示不同的内容
  • 文件对比:diff

    • 以 Vim 方式打开两个文件并进行差异对比:vimdiff
  • 文件对比:diff

    • 可以使用 diff 命令进行文件的对比。
    • 该命令会显示出两个文件之间的差异,并标识出不同的内容。
  • 以 Vim 方式打开两个文件并进行差异对比:vimdiff

    • 使用 vimdiff 命令可以以 Vim 的方式打开两个文件进行差异对比。
    • Vimdiff 会高亮显示不同的内容,并方便地进行修改和合并操作。
  • 例如,要对比文件 file1 和 file2 的差异,可以在终端中输入以下命令:

    vimdiff file1 file2
    

【5】非正常退出后处理.swp文件

  • 如果在Vim中发生非正常退出(例如使用 ctrl+z 挂起或强制退出终端),可能会留下一个名为 .filename.swp 的临时文件,其中 filename 是你编辑的文件的名称。
  • 为了解决此问题,你可以执行以下命令来删除同名的 .swp 文件:
#假设打开filename文件被以外关闭,需要删除同文件名的.swp文件即可解决
# rm -f .filename.swp
  • 通过运行上述命令,你可以删除产生的 .swp 文件,以避免后续的冲突或错误。
  • 请记住,.swp 文件通常用于在 Vim 正常退出前自动保存未保存的更改,因此在非正常退出后可以使用 .swp 文件来恢复丢失的数据。

【四】VIM练习示例

【1】练习一

1.将/etc/passwd 复制到/root/目录下,并重命名为test.txt
2.用vim打开test.txt并显示行号
3.分别向下、向右、向左、向右移动5个字符,分别向下、向上翻两页
4.把光标移动到第10行,让光标移动到行末,再移动到行首,移动到test.txt文件的最后一行,移动到文件的首行
5.搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索
6.把从第一行到第三行出现的root 替换成–od–,然后还原上一步操作
8.把整个文件中所有的root替换成–od–
9.把光标移动到20行,删除本行,还原上一步操作
10.删除第19行,还原上一步操作
11.删除从5行到10行的所有内容,还原上一步操作
12.复制2行并粘贴到11行下面,还原上一步操作(按两次u)
13.复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)
14.把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)
15.光标移动到首行,把/sbin/nologin改成/bin/bash
16.在第一行下面插入新的一行,并输入”# Hello!”
17.保存文档并退出

【2】练习示例2

(1)文件

[root@www ~]# cat proxy.conf
server {
    Listen 8080;
    Server_Name vim.OldboyEDU.com;
    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.html;
    }
    location = /proxy_error.html {
        root /code/proxy;
    }
}

(2)题目

1.使用vim打开proxy.conf文件
2.修改Listen为listen小写,并将8080修改为80
3.修改ServerName为server_name小写。
4.修改vim.OldboyEDU.com为vim.oldboy.com
5.在server_name行下插入一行 root /code;
5.复制5-14行的内容,然后将其粘贴到14行下面
6.删除与proxy_set_header相关的两行全部删除
7.如上操作完成后,在13-20行前面加上#号
8.删除21-23的行,然后保存当前文件

【3】解析

(1)练习一

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

cp /etc/passwd /root/test.txt
  • 在上述命令中,cp 是用于复制文件的命令,/etc/passwd 是要复制的源文件路径,/root/test.txt 是复制后的目标文件路径。
  • 通过执行此命令,/etc/passwd 文件将被复制到 /root/ 目录下,并重命名为 test.txt

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

vim -N /root/test.txt
  • 上述命令中,vim 是打开 Vim 编辑器的命令,-N 参数用于显示行号,/root/test.txt 是要打开的文件路径。
  • 通过执行此命令,使用 Vim 打开了 test.txt 文件,并显示了行号。

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

使用下列命令和操作实现:

  • 向下移动5行:按下 5j
  • 向右移动5个字符:按下 5l
  • 向左移动5个字符:按下 5h
  • 向右移动5个字符:按下 5l
  • 向下翻两页:按下 2Ctrl + D
  • 向上翻两页:按下 2Ctrl + U

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

使用下列命令和操作实现:

  • 移动到第10行:按下 10G:10
  • 移动到行末:按下 $
  • 移动到行首:按下 0
  • 移动到文件的最后一行:按下 G:$
  • 移动到文件的首行:按下 gg:1

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

grep -i -o 'root' /root/test.txt | wc -l
  • 上述命令中,grep 是用于在文件中搜索匹配模式的命令,-i 参数表示不区分大小写,-o 参数表示只输出匹配到的部分,'root' 是要搜索的模式,/root/test.txt 是要搜索的文件路径,wc -l 用于计算匹配到的行数。
  • 通过执行此命令,可以搜索文件中出现的 "root" 并输出该单词出现的总次数。

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

sed -i '1,3 s/root/-od-/' /root/test.txt
  • 上述命令中,sed 是用于进行文本替换的流编辑器,-i 参数表示直接修改源文件,'1,3 s/root/-od-/' 是指在第一行到第三行之间将所有的 "root" 替换为 "-od-",/root/test.txt 是要进行替换的文件路径。通过执行此命令,可以实现替换操作。

  • 如果需要还原上一步操作,可以使用 Git 进行版本控制或者使用 Vim 的撤销命令 u

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

sed -i 's/root/-od-/g' /root/test.txt
  • 上述命令中,s/root/-od-/g 指示将文件中所有的 "root" 替换为 "-od-",/root/test.txt 是要进行替换的文件路径。
  • 通过执行此命令,文件中的所有 "root" 都会被替换为 "-od-"。

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

先移动到第20行再删除本行:

  • 移动到第20行:按下 20G:20
  • 删除本行:按下 dd

要还原上一步操作,可以使用 Vim 的撤销命令 u

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

sed -i '19d' /root/test.txt
  • 上述命令中,dsed 命令的删除操作符,19d 表示删除第19行,/root/test.txt 是要进行删除操作的文件路径。

  • 通过执行此命令,可以删除第19行。

  • 要还原上一步操作,可以使用 Git 进行版本控制或者使用 Vim 的撤销命令 u

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

sed -i '5,10d' /root/test.txt
  • 上述命令中,5,10d 表示删除从第5行到第10行的所有内容,/root/test.txt 是要进行删除操作的文件路径。
  • 通过执行此命令,可以删除指定行数范围内的内容。
  1. 复制2行并粘贴到11行下面,还原上一步操作(按两次u)
  • 命令:yy;p;p
  • 解释:yy命令用于复制当前行,p命令用于在当前行的下方粘贴复制的内容。因此,yy;p;p表示将当前行复制两次并粘贴到当前行的下方。
  • 案例:
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5

$ vi file.txt
# 光标在第2行
yy;p;p

$ cat file.txt
1. Line 1
2. Line 2
2. Line 2
2. Line 2
3. Line 3
4. Line 4
5. Line 5

还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述复制和粘贴操作。

  1. 复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)
  • 命令:11,15y;8p
  • 解释:11,15y命令用于复制从第11行到第15行的内容,8p命令用于在第8行的上方粘贴复制的内容。因此,11,15y;8p表示将第11行到第15行的内容复制并粘贴到第8行的上方。
  • 案例:
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5

$ vi file.txt
# 光标在第1行
11,15y;8p

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 13
9. Line 14
10. Line 15
11. Line 2
12. Line 3
13. Line 4
14. Line 5

还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述复制和粘贴操作。

  1. 把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)
  • 命令:13,18m$
  • 解释:13,18m$命令用于将第13行到第18行的内容移动到文件的尾部。其中,m表示移动行的命令,$表示文件的尾部。
  • 案例:
$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 13
9. Line 14
10. Line 15
11. Line 2
12. Line 3
13. Line 4
14. Line 5

$ vi file.txt
# 光标在第1行
13,18m$

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 2
9. Line 3
10. Line 4
11. Line 5
12. Line 13
13. Line 14
14. Line 15
  • 还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述移动操作。
  1. 光标移动到首行,把/sbin/nologin改成/bin/bash
  • 命令:gg/\sbin/nologin/s///bin/bash
  • 解释:gg命令用于将光标移动到首行,/\sbin/nologin/用于搜索第一个出现的字符串"/sbin/nologin",s命令用于将搜索到的字符串替换为"/bin/bash"。
  • 案例:
$ cat file.txt
/sbin/nologin
Line 2
Line 3

$ vi file.txt
# 光标在第1行
gg/\sbin\/nologin/s//\/bin\/bash

$ cat file.txt
/bin/bash
Line 2
Line 3
  1. 在第一行下面插入新的一行,并输入”# Hello!”
  • 命令::2put!="# Hello!"
  • 解释::2put!命令用于在当前行的下方插入文本,"# Hello!"表示要插入的文本内容。
  • 案例:
$ cat file.txt
Line 1
Line 2
Line 3

$ vi file.txt
# 光标在第1行
:2put!="# Hello!"

$ cat file.txt
Line 1
# Hello!
Line 2
Line 3
  1. 保存文档并退出
  • 命令::wq
  • 解释::wq命令用于保存对文档的修改并退出Vi编辑器。
  • 案例:
# 光标在文档中,没有命令行提示符
:wq

# 文档已保存并退出Vi编辑器

(2)练习二

  1. 使用vim打开proxy.conf文件:
vim proxy.conf
  1. 修改Listen为listen小写,并将8080修改为80:
:%s/Listen/listen/g             # 将Listen替换为小写的listen
:%s/8080/80/g                   # 将8080替换为80
  1. 修改ServerName为server_name小写,并将vim.OldboyEDU.com修改为vim.oldboy.com:
:%s/Server_Name/server_name/g   # 将Server_Name替换为小写的server_name
:%s/vim\.OldboyEDU\.com/vim.oldboy.com/g    # 将vim.OldboyEDU.com替换为vim.oldboy.com,注意其中的点需要转义
  1. 在server_name行下插入一行root /code;:
13a                              # 在第13行后插入
root /code;                      # 输入要插入的内容
.
  1. 复制5-14行的内容,然后将其粘贴到14行下面:
5,14y                           # 复制5-14行的内容
14p                             # 在14行下面粘贴复制的内容
  1. 删除与proxy_set_header相关的两行全部删除:
11,12d                          # 删除11-12行
  1. 如上操作完成后,在13-20行前面加上#号:
13,20s/^/# /                    # 在13-20行前面添加#号注释
  1. 删除21-23的行,然后保存当前文件:
21,23d                          # 删除21-23行
:wq                             # 保存文件并退出vim编辑器
posted @ 2023-08-22 10:05  Chimengmeng  阅读(209)  评论(1编辑  收藏  举报
/* */