Vim 文本编辑器
本文详细介绍 Linux vim 文本编辑器的使用方法,包括命令模式、编辑模式、末行模式的常用命令操作和注意事项。
vim 简介
vi 是 visual 的缩写。vi 编辑器是 Unix 下使用最为广泛的文本编辑器,而 vim 则是 vi 的升级版(vi improve)。在 Linux 系统中,同时提供了 vi 和 vim 编辑器给用户使用。
实际上,早在 1976 年 vi 就已经被发布,时至今日 vim 编辑器基本还是沿用当时的使用方法,只是功能更为强大了,两者在直观上最明显的差别是 vim 能够以多种颜色显示文本。vim 编辑器相当于 Windows 中的 “记事本”,但由于是在字符终端下使用的编辑器,因此其使用方法与具有图形界面的文本编辑器的使用方法有所不同(最大的不同是鼠标没用了)。不同的 Linux 发行版本可能还会提供其他文本编辑器供人们使用,如 gedit、Emacs、nano 等,从易用性的角度来看,vim 并非最为友好易用的文本编辑器,但 vim 却是 Linux 中最基本的编辑器,这是有原因的。
在系统管理工作中,由于经常需要阅读或修改各类配置文件、日志和说明手册,同时也需要编写各种脚本以满足系统管理的需要,因此管理员首先需要懂得如何使用文本编辑器。但另一方面,在后面的许多实训任务中,如硬盘配额管理、制订周期性作业计划等,可以看到,许多命令和软件都默认调用 vi 编辑器来编辑配置文件。因此,vi 编辑器是系统管理员必须熟练掌握的基本工具之一。再者,基于短小精悍的 vi 且功能增强后的 vim 编辑器能够很好地支持 shell 脚本和 C 程序的编写,因此也深得程序开发人员的喜爱。
使用方法
vim 编辑器有 3 种工作模式:命令模式、编辑模式和末行模式。下图显示了 这3种模式之间是如何切换的。
三种模式的主要功能如下:
- 命令模式:复制、粘贴、删除、移动光标、查找
- 编辑模式:编辑文本
- 末行模式:保存、退出、替换
命令模式
在命令提示符后直接输入格式为 vi [文件路径]
的命令即可启动 vim 编辑器并直接进入命令模式,其中文件路径用于指定所要编辑的文件的所在位置,如果文件不存在则会创建一个新文件。vim 编辑器的内置命令往往只有一个字母,而且按下该命令的字母后也不会在屏幕上有所显示,而是直接处理该命令。
常用的命令有以下几种:
i
:从当前位置开始输入字符,vim 编辑器进入文本编辑模式,编辑器底部将显示-- INSERT --
。a
:从当前位置的下一个位置开始输入字符,vim 编辑器同样会进入文本编辑模式。/字符串
:按下 “/” 键后,屏幕底部出现 “/”,在其后输入要搜索的字符串,按 Enter 键后 vim 编辑器从当前位置向文件底部搜索,并定位在第一个匹配搜索字符串的地方。n
:定位至下一个匹配搜索字符串的地方。
命令模式下的一些操作:
- 光标左移:
h
- 光标右移:
l
- 光标上移:
k
- 光标下移:
j
- 向右移动一个单词:
w
- 向左移动一个单词:
b
- 向右移动 80 个字符:
80 右箭头
(数字和方向,可以随意选取) - 快速向左向右移动光标:
Ctrl + 左右箭头
- 移动光标到行首:
0
- 移动光标到行尾:
$
- 移动光标到文件最后一行:
G
- 移动光标到文件第一行:
1G
(数字可以随意选取) - 复制光标所在行开始的 2 行:
2yy
(数字可以随意选取) - 将复制的行粘贴到光标所在行的下面:
p
(小写 p 表示粘贴到下一行,大写 P 表示粘贴到上一行) - 删除光标所在行开始的 3 行:
3dd
(数字可以随意选取) - 删除光标开始到单词结尾:
dw
- 删除光标开始到行首部分:
d0
- 删除光标开始到行尾部分:
d$
- 撤销上一步的操作:
u
- 重复前一步的操作:
Ctrl + r
- 重复前一步的操作:
Ctrl + r
- 进入块模式:
Ctrl + v
(可以横向或纵向选择一个文本区域) - 查找 root:
/root
回车,再按 n 或 N 向下、向上继续查找(root 是文件中的全部单词)
编辑模式
利用命令模式中的命令进入文本编辑模式后,便可在 vim 编辑器中进行文字处理。如果按 Esc 键则重新回到命令模式。
编辑模式下的一些操作:
- 用鼠标任意的选中某行,就是已经复制完成了,在需要插入的地方按下滚轮即粘贴(Linux 的一种特色);
- 按
Ctrl + n
可以实现单词补全(单词必须是当前文件中的单词,如果不存在则不能补全)。
末行模式
末行模式是通过在命令模式中按冒号 “:
” 字符进入的,此时 vim 会在编辑器底部显示 “:
” 作为该模式的命令提示符,用户在提示符后可输入的主要命令有以下几种。
末行模式下的一些操作(注意,:
符也是指令的一部分):
- 存盘指令:
:w
- 另存指令:
:w 文件名
- 存盘并退出指令:
:wq
- 退出指令:
:q
- 强制退出不存盘指令:
:q!
- 将光标定位到第 3 行 指令:
:3
(数字可以随意选取) - 将光标所在行的第一个 A 字母替换为 B 字母的指令:
:s/A/B
- 如果要替换行中的所有的 A,则需要加上字母 g 为:
:s/A/B/g
- 如果要替换文件中所有的 A,则需要在加上 %s 为:
:%s/A/B/g
- 如果要替换文件中指定的行数,则需要变为:
:2,10s/A/B/g
(数字可以随意选取) - 如果要替换文件中指定的行数到最后一行,则需要变为:
:2,$s/A/B/g
(数字可以随意选取)
- 如果要替换行中的所有的 A,则需要加上字母 g 为:
- 显示出行号的指令:
set nu
在执行上述命令时如果存在错误,vim 也会在编辑器底部显示相关错误。
常见问题
习惯使用 Windows 编辑器的小伙伴,在使用 Linux vim 编辑器时可能会遇到这个问题:在编辑时总是会不小心按下 Ctrl+S,然后整个终端都没有反应了?
其实,在 Linux 系统中,Ctrl+S 是 有特殊的用途的,不能乱按。在 Linux 终端下,执行 Ctrl+S 表示暂停该终端,阻止向该终端输出。此时表现为冻结窗口,不会响应任何输入操作。
那如何解决呢?很简单,按下 Ctrl+Q 就可以了。在 Linux 终端下,Ctrl+Q 表示恢复向终端输出。
综合实训案例
案例1:文件操作命令的综合运用
本案例通过如下一组操作初步演示如何对 cp、mv、rm、cd、ls 等文件操作命令加以综合运用。
mkdir testdir # 新建 testdir 目录
cd testdir/ # 跳转至 testdir 目录
touch test # 新建 test 文件
cp -r /root/testdir/ /tmp/testdir-bak # 将 testdir 目录复制至 /tmp
cd /tmp/testdir-bak/ # 跳转至 testdir-bak 目录
ls # 查看复制结果
mv test test-bak # 将 test 文件改名为 test-bak
cd .. # 返回上一级目录
mv testdir-bak/ testdir-bak-01 # 附加一个序号给 test-bak
cd /root/ # 切换至 /root 目录
rm -r testdir/ # 删除整个 /root/testdir 目录
上述命令操作次序是经过设计的,可以反复执行以提高操作的熟练程度。但要注意每次需要将 /tmp/testdir-bak 目录改名为 test-bak-01、test-bak-02、...... 在每次进行文件管理操作时,可不断通过 ls
命令进行结果确认。同时,为避免输入过长路径名,也可以尽量使用 cd
命令跳转到与目标文件和目录较近的位置进行操作。
案例2:利用 vim 设置系统运行级
vim 编辑器是阅读和修改系统各类配置文件的基本工具之一。作为初学者,可以多在实际应用中使用 vim 编辑器,以此提高操作的熟练程度。
本案例演示如何利用 vim 编辑器修改配置文件 /etc/inittab 中的系统运行级设置。系统运行级是指操作系统当前所运行的状态级别。通过 vim 编辑器可查阅 /etc/inittab
的内容,其中以井号 #
开头的均为注释内容,这些注释告诉读者在 Linux 中共有 0~6 种运行级。
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
对上述注释中的7种系统运行级的含义解释如下:
- 第 0 级:系统关闭模式,当输入
shutdown -h
或halt
命令时,即要求系统从当前运行级切换至第 0 级。 - 第 1 级:单用户模式,也即只有 root 用户可以使用系统的模式。
- 第 2 级:无网络的多用户模式,此模式可以允许多个用户使用系统,但不能配置网络接口及其服务。
- 第 3 级:完全多用户模式,系统正常启动后可到达该模式,但并未启动图形桌面环境。
- 第 4 级:未被使用。
- 第 5 级:图形化界面模式,在第 3 级的基础上启动了图形桌面。
- 第 6 级:重启模式,当输入
shutdown -r
或reboot
命令时,即要求系统从当前运行级切换至第 6 级。
Linux 系统在启动时,将会读取
/etc/inittab
文件,根据其中设定的运行级进行初始化,最终系统将会运行在某个运行级别上。因此,/etc/inittab
文件中特别注明了不能在该文件中设定系统运行级为第 0 级和第 6 级。否则可以预见,系统启动后又会马上关闭或重启。
下面将演示如何通过修改 /etc/inittab
文件设置系统默认的运行级,以及如何从某个系统运行级切换至其他运行级。操作步骤如下:
-
执行
runlevel
命令,查看当前系统的运行级。 -
配置
/etc/inittab
文件。以 root 用户的身份登录系统并利用 vim 查看
/etc/inittab
文件,如果当前系统的运行级为 5,则会看到如下内容:id:5:initdefault:
用 vim 编辑器打开
/etc/inittab
文件,并将运行级修改为 1,即:id:1:initdefault:
保存文件后退出。
-
重启系统。可利用
init 6
命令将系统运行级切换至第 6 级,即开始重启系统。 -
重启后,系统会按照之前的设定进入单用户模式。此时只有 root 用户可以使用系统,因此也不需要验证密码登录。
-
重新切换至第 3 级或第 5 级。
init 3
init 5 -
重新配置
/etc/inittab
文件,切换完成后,由于这种切换是临时性的,因此需要重新以 root 用户的身份登录系统并重新修改/etc/inittab
文件,根据第 2 步的方法设置默认运行级为第 5 级。
需要注意的是,很多 Linux 都是用这种 叫 System V 的机制来启动运行级别,但 Ubuntu 却是用另一种叫 startup 的机制。所以没有
/etc/inittab
文件,取而代之的是/etc/init/rc-sysinit.conf
文件。因此修改 Ubuntu 的运行级时需要特别注意。
案例3:利用 OpenSSH 远程登录 Linux 系统
除了在本地通过字符终端使用 Linux 系统中的 shell,实际上还可以通过字符终端远程登录某个 Linux 系统并使用它所提供的 shell。
这两种使用 shell 的方式在本质上是一样的。但是要实现远程登录 Linux 系统并使用 Linux shell,就需要某种通信协议如 SSH 协议或 Telnet 协议的支持。由于 Telnet 协议的不安全性,在 Linux 系统一般采用 SSH 协议实现远程访问。
SSH 为 Secure Shell 的缩写,专为远程登录会话和其他网络服务提供安全性通信的协议,其功能与 Telnet 协议相类似但因为数据经过加密后传输,因而具有较好的安全性。
OpenSSH 是基于 SSH 协议的一组自由软件,它为用户提供了一组命令,包括 sshd、ssh、scp 等。在 RHEL 系统中一般默认安装了 OpenSSH 的相关服务器和客户端软件。
ssh 命令的使用格式是 ssh 用户名@目标主机名或IP地址
,比如:
ssh root@192.168.3.100
对于第一次连接的主机,ssh
命令将会给出提示 “The authenticity of host ...... Are you sure you want to continue connecting (yes/no)?”,需要用户确认目标服务器是否可信,此时需要输入 yes 以确认继续连接 Linux 系统。成功登录系统后可利用 who
命令查看登录信息。
scp 命令可用于远程传输文件,命令格式为 scp 源文件路径 用户名@目标主机名或IP地址:目标文件路径
,比如:
scp testfile.txt root@192.168.3.100:/tmp/
事实上,由于受地理条件等因素限制,管理员往往需要通过 ssh 服务远程访问并控制某个 Linux 系统,这在许多系统管理应用场合中很常见。
值得一提的是,前面以 OpenSSH 客户端为基础,介绍了通过 ssh 服务远程登录 Linux 系统,但是除此之外还有其他一些客户端软件可供使用,如 PuTTY 软件也是属于自由软件。与 OpenSSH 客户端软件相比,该软件默认使用了 UTF-8 编码,因此更好地解决了使用 OpenSSH 客户端时会出现的 Linux 系统中文显示乱码问题。