【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
-
上述命令中,
d
是sed
命令的删除操作符,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
是要进行删除操作的文件路径。 - 通过执行此命令,可以删除指定行数范围内的内容。
- 复制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键),这将撤销上述复制和粘贴操作。
- 复制从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键),这将撤销上述复制和粘贴操作。
- 把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键),这将撤销上述移动操作。
- 光标移动到首行,把/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
- 在第一行下面插入新的一行,并输入”# 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
- 保存文档并退出
- 命令::wq
- 解释::wq命令用于保存对文档的修改并退出Vi编辑器。
- 案例:
# 光标在文档中,没有命令行提示符
:wq
# 文档已保存并退出Vi编辑器
(2)练习二
- 使用vim打开proxy.conf文件:
vim proxy.conf
- 修改Listen为listen小写,并将8080修改为80:
:%s/Listen/listen/g # 将Listen替换为小写的listen
:%s/8080/80/g # 将8080替换为80
- 修改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,注意其中的点需要转义
- 在server_name行下插入一行root /code;:
13a # 在第13行后插入
root /code; # 输入要插入的内容
.
- 复制5-14行的内容,然后将其粘贴到14行下面:
5,14y # 复制5-14行的内容
14p # 在14行下面粘贴复制的内容
- 删除与proxy_set_header相关的两行全部删除:
11,12d # 删除11-12行
- 如上操作完成后,在13-20行前面加上#号:
13,20s/^/# / # 在13-20行前面添加#号注释
- 删除21-23的行,然后保存当前文件:
21,23d # 删除21-23行
:wq # 保存文件并退出vim编辑器
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17647815.html