vi是 Linux 和Unix系统内置的不可或缺的文本编辑命令,VIM 是 vi 的加强版本,兼容 vi 的所有指令。
vi/vim不仅能编辑文本文件,而且还具有 shell 编程功能,编辑时会用不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性,提高了工作效率。
vi是Visual interface 的简称,因为它是由POSIX标准指定的,所以绝大多数的linux/unix都遵循此标准,默认都会安装它。红帽系统中默认会安装vim-minimal软件包,这是一个轻量化的版本,可以用vi filename进行文件编辑。如果我们需要一个更完整功能、一个在线帮助系统和一个教程程序,我们应该安装vim-enhanced软件包,可以用vim filename进行文本编辑。
二、VIM四种模式
vi/vim 四种模式:命令模式/普通模式(command mode)、输入模式/编辑模式(input mode)、末行模式/底线命令模式(last line mode)和可视模式(visual mode)
命令模式(Command mode)
vim filename命令执行后,默认处于命令模式,在此模式下,可以使用上、下、左、右键或者KJHL键进行光标移动,还可以对文件内容进行复制、粘贴、替换、删除等操作。
kjhl助记(k=kick up,j=jump down,h=hand back,l=leap forward)
输入模式(Insert mode)
vim filename命令模式打开文件后,文件是处于不可自由编辑状态,输入“i”,进入编辑模式,键入的所有文本将变为文件内容。键盘的上下左右箭头可以移动光标到指定位置,编写完成后,按Esc键即可返回命令模式。
未行模式(Last line mode)
在命令模式下(输入模式,按Esc可转命令模式),输入”:”,vim窗口的左下方会出现一个”:”符号,输入wq(保存并退出),或输入q!(不保存退出)
可视模式(visual mode)
在命令模式下,输入v键,就进入到可视模式,可在文本内容中选择多个字符进行文本操作。使用Shift+v也就是说输入大写V,选择多行(行模式),使用ctrl+v可以选择文本块(块模式)。用v/Shift+v/ctrl+v或Esc键可以退出可视模式。
各模式之间的转换示意图如下:
三、命令格式
vim [选项] 文件
vim 文件名 不存在,则为新建;存在 ,则为修改文件
四、VIM命令模式
命令模式/一般模式(command mode)
维度 | 命令 | 说明 |
---|---|---|
光标定位类 | ||
G | 将光标跳到最后一行 | |
1G | 将光标跳到第一行 | |
$ | 将光标跳到本行行尾 | |
0|^ | 将光标跳到本行行首 | |
gg | 将光标跳转到文件顶端 | |
字符搜索类 | ||
/abcd | 将向下查找字符串abcd所在位置, | |
N或n | 按n,继续往前查找,按N,往回找 | n~=next |
ctrl+f | 向下翻页 | |
ctrl+b | 往上翻页 | |
编辑类 | ||
x | 删除光标处的单个字符 | |
dd | 删除光标所在的行,3dd表示从当前行向后2行,总计删除3行 | |
yy | 复制当前行到缓冲区,若有3行,按3yy | |
p | 将缓冲区的内容粘贴到光标所在行的上/下行 | p(小写),光标的下一行 P(大写),光标的上一行 |
u | 撤销最近的编辑,小写u,按一次,撤销一次 | 大写U,按一次,撤销当前行所做的变更 |
r | 替换当前光标标记的单个字符 |
五、VIM编辑模式
插入模式/(insert mode)
维度 | 命令 | 说明 |
---|---|---|
i | 光标所在处前面开始插入 | |
I | 光标跳到本行开关,并进入插入模式 | |
a | 光标所在处后面开始插入 | |
A | 光标跳到行尾,在行尾增加 | |
o | 从光标所在行下面新插入一行 | |
O | 从光标所在行上面新插入一行 |
六、未行模式
维度 | 命令 | 说明 |
---|---|---|
:wq | 保存后退出 | |
:w! | 强制保存 | |
:q! | 不保存退出 | |
:wq! | 强制保存并退出 | |
ZZ | 若修改,保存后退出(shift+zz) | 有点像快捷方式 |
:set nu | 显示行号 | |
:set nonu | 取消显示行号 | |
:%s/sbin/bin/g | 替换文本文件中所有”sbin“为“bin” | |
:数字 | 快速跳到指定的行 |
七、可视模式
可视模式(visual mode)
命令字符 | 说明 |
---|---|
o | 重新定义光标起始位置 |
x或d | 剪切或删除字符,方向键配合进行操作,指令操作完会自动退回到普通模式 |
y或Y | 复制,y只复制字符,Y复制选定行,方向键配合进行操作,指令操作完会自动退回到普通模式 |
p或P | 在当前位置粘贴剪贴板里内容,p粘在光标后面,P粘在光标前面 |
r | 所有选中字符替换为新字符,方向键配合进行操作 |
c | 修改选中的字符,方向键配合进行操作 |
I | 在选中文本前插入 |
A | 在选中文本后插入 |
>> | 按2次,文本向右移动 |
<< | 按2次,文本向左移动,缩进 |
八、VI编辑使用
普通编辑模式,修改目标文件httpd.conf,要求:
-
找到”Listen 80“行,把80修改为8080
-
找到”User apache“行,把apache修改为www
-
找到”Group apache”行,把apache修改为www
-
找到”DocumentRoot “/var/www/html”行,把/var/www/html修改为/data/html
-
找到”<Directory “/var/www/html”>”行,把/var/www/html修改为/data/html
-
复制355行内容,把它粘贴到文件的最后一行
-
复制337行(含)之后的三行内容,把它们粘贴到文件的355行的上一行处
-
删除该文件中含有”memory-mapping“字符的行
-
保存文件
[myansible@rhel92-236 liuguohua.com]$ cat httpd.conf
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:https://www.liuguohua.com/docs/2.4/> for detailed information.
...
#Listen 12.34.56.78:80
Listen 80
...
User apache
Group apache
# 'Main' server configuration
...
DocumentRoot "/var/www/html"
#
# Relax access to content within /var/www.
#
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
# Further relax access to the default document root:
<Directory "/var/www/html">
...
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files. This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults if commented: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
EnableSendfile on
# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
底线命令行模式
#保存
:w
#保存
:x
#退出
:q
#保存并退出
:wq
#强制保存并退出
:wq!
#保存为另外一个文件
:w newfilename
#不保存
:q!
#放弃所有修改
:e!
可视模式练习
用vim打开/opt/test-shell-c.sh文件,在所有行前面加#号
# vim /opt/test-shell-c.sh
for i in {1..5000000}
do
echo $i
echo "$i" > ./qw/txt${i}.txt
done
操作步骤如下:
(1) Ctrl + v进入块选择模式
(2) 向上或向下移动光标选择多行
(3) 移动光标到行的起始位置(或输入指令^)
(4) 然后按大写 I进入行首插入模式
(5) 插入注释符
(6) 按Esc回到命令模式
用vim打开/opt/test-shell-c.sh文件,把echo字符更换为print
# vim /opt/test-shell-c.sh
for i in {1..5000000}
do
echo $i
echo "$i" > ./qw/txt${i}.txt
done
操作步骤如下:
(1) Ctrl + v进入块选择模式
(2) 向上或向下移动光标到第5行的echo字符中的e处,按o键,重新定义
(3) 将光标移动到第6行的echo字符的o处
(4) 然后按c进入字符更换模式
(5) 输入print
(6) 按Esc回到命令模式
九、vi异常中止处理
在使用vi/vim时,经常会碰到网络不通,机器宕机等意外情况,造成编辑异常中断,如果我们再重新用vi filename格式,编辑同一个文件时,系统会给出如下提示,我们输入’r’键,就可以恢复该文件的编辑,编辑完,视情况保存。
再次编辑同一个文件,也可用‘ vim -r haha’格式,进入后,无须再按’r’键。
确认文件没有问题后,我们需要用’ls -l -a’命令,查找一下文件所在目录下,存在的隐藏临时交换文件,以.开头,以swp结尾,把这个文件删除,否则后续再次编辑该文件,还会报出提示信息。
myansible@rhel92-236 liuguohua.com]$ ls -al .
total 32
drwxr-xr-x. 2 myansible myansible 64 Sep 22 09:44 .
drwxrwxrwt. 14 root root 4096 Sep 22 09:38 ..
-rw-------. 1 myansible myansible 12288 Sep 22 09:37 .haha.swp
-rw-r--r--. 1 myansible myansible 12005 Sep 14 20:20 httpd.conf
-rw-r--r--. 1 myansible myansible 107 Sep 14 20:18 test-shell-a.sh
myansible@rhel92-236 liuguohua.com]$ rm .haha.swp