跳到主要内容

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种模式之间是如何切换的。

Vim 操作方法

三种模式的主要功能如下:

  • 命令模式:复制、粘贴、删除、移动光标、查找
  • 编辑模式:编辑文本
  • 末行模式:保存、退出、替换

命令模式

在命令提示符后直接输入格式为 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(数字可以随意选取)
  • 显示出行号的指令: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 -hhalt 命令时,即要求系统从当前运行级切换至第 0 级。
  • 第 1 级:单用户模式,也即只有 root 用户可以使用系统的模式。
  • 第 2 级:无网络的多用户模式,此模式可以允许多个用户使用系统,但不能配置网络接口及其服务。
  • 第 3 级:完全多用户模式,系统正常启动后可到达该模式,但并未启动图形桌面环境。
  • 第 4 级:未被使用。
  • 第 5 级:图形化界面模式,在第 3 级的基础上启动了图形桌面。
  • 第 6 级:重启模式,当输入 shutdown -rreboot 命令时,即要求系统从当前运行级切换至第 6 级。

Linux 系统在启动时,将会读取 /etc/inittab 文件,根据其中设定的运行级进行初始化,最终系统将会运行在某个运行级别上。因此,/etc/inittab 文件中特别注明了不能在该文件中设定系统运行级为第 0 级和第 6 级。否则可以预见,系统启动后又会马上关闭或重启。

下面将演示如何通过修改 /etc/inittab 文件设置系统默认的运行级,以及如何从某个系统运行级切换至其他运行级。操作步骤如下:

  1. 执行 runlevel 命令,查看当前系统的运行级。

  2. 配置 /etc/inittab 文件。

    以 root 用户的身份登录系统并利用 vim 查看 /etc/inittab 文件,如果当前系统的运行级为 5,则会看到如下内容:

    id:5:initdefault:

    用 vim 编辑器打开 /etc/inittab 文件,并将运行级修改为 1,即:

    id:1:initdefault:

    保存文件后退出。

  3. 重启系统。可利用 init 6 命令将系统运行级切换至第 6 级,即开始重启系统。

  4. 重启后,系统会按照之前的设定进入单用户模式。此时只有 root 用户可以使用系统,因此也不需要验证密码登录。

  5. 重新切换至第 3 级或第 5 级。

    init 3
    init 5
  6. 重新配置 /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 系统中文显示乱码问题。