【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编辑器

__EOF__

本文作者Chimengmeng
本文链接https://www.cnblogs.com/dream-ze/p/17647815.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @ 2023-08-22 10:05  Chimengmeng  阅读(264)  评论(1编辑  收藏  举报