Vi是第一个为Unix编写的全屏文本编辑器,尽管它的目的是小而简单,但对于专门使用GUI文本编辑器(例如NotePad++或gedit)的朋友来说,使用起来可能有点困难。
要使用Vi,必须首先了解这个强大的程序运行的3种模式,以便稍后开始学习其强大的文本编辑程序。
请注意,大多数现代Linux发行版都附带了Vi的变体,称为Vim(“ Vi 改进版”),它比原始Vi支持更多功能。因此,在本教程中,我们将互换使用Vi和Vim。
如果你的发行版没有安装Vim,可以按如下方式安装:
$ sudo apt install vim [Debian、Ubuntu和Mint] $ sudo yum install vim [RHEL/CentOS/Fedora和Rocky/AlmaLinux] $ sudo emerge -a sys-apps/vim [Gentoo Linux] $ sudo apk add vim [Alpine Linux] $ sudo pacman -S vim [Arch Linux] $ sudo zypper install vim [OpenSUSE]
为什么要学习Vi?
学习Vi编辑器至少有以下两个方面的原因:
- Vi始终可用(无论使用什么发行版),因为POSIX需要它。
- Vi不会消耗大量的系统资源,并且允许我们执行任何可以想象的任务,而无需将手指从键盘上移开。
另外,Vi有非常丰富的内置手册,可以在程序启动后立即使用:help
命令启动。该内置手册比Vi/Vim的手册页包含更多信息。
启动Vi编辑器
要启动Vi,请在命令提示符中键入Vi:
# vi
然后按i
进入插入模式,就可以开始打字了。
启动Vi/Vim 的另一种方法是:
# vi filename
这将打开一个名为filename的新缓冲区(稍后将详细介绍缓冲区),你可以之后将其保存到磁盘。
了解Vi模式
Vi编辑器有多种模式,每种模式都有不同的用途并允许用户执行特定的操作。以下是你应该注意的主要模式:
Vi命令行模式
在命令模式下,Vi允许用户浏览文件并输入Vi命令,这些命令是一个或多个字母的简短且区分大小写的组合。几乎所有命令都可以以数字为前缀来重复该命令的次数。
例如,yy(或Y)复制整个当前行,而3yy(或3Y)复制整个当前行以及接下来的两行(总共3行)。
我们始终可以通过按Esc键进入命令模式(无论正在使用哪种模式)。事实上,在命令模式下,键盘按键被解释为命令而不是文本,这一事实往往会让初学者感到困惑。
Vi Ex模式
在Ex模式下,我们可以操作文件(包括保存当前文件和运行外部程序)。要进入此模式,必须在命令模式下键入冒号 ( :
),后面紧跟需要使用的前模式命令的名称。之后,Vi自动返回到命令模式。
Vi插入模式
在插入模式下(通常使用字母i
进入该模式),只需输入文本即可。大多数击键都会导致屏幕上出现文本(一个重要的例外是Esc键,它可以退出插入模式并返回到命令模式)。
Vi命令用法
下表显示了常用的Vi命令列表。文件编辑命令可以通过在命令后附加感叹号来强制执行(例如,:q!
强制退出而不保存)。
按键命令 | 功能描述 |
h或向左箭头 | 向左移动一个字符 |
j或向下箭头 | 往下走一行 |
k或向上箭头 | 上升一行 |
l(小写L)或右箭头 | 向右移动一个字符 |
H | 转到屏幕顶部 |
L | 转到屏幕底部 |
G | 转到文件末尾 |
w | 向右移动一个字 |
b | 向左移动一个单词 |
0(零) | 转到当前行的开头 |
^ | 转到当前行的第一个非空白字符 |
$ | 转到当前行的末尾 |
Ctrl-B | 返回一屏幕 |
Ctrl-F | 前进一屏幕 |
i | 在当前光标位置插入 |
I(大写的i) | 插入到当前行的行首 |
J(大写j) | 将当前行与下一行连接(移动下一个队列) |
A | 追加到当前光标位置之后 |
o(小写O) | 在当前行之后创建一个空行 |
O(大写o) | 在当前行之前创建一个空行 |
r | 替换当前光标位置的字符 |
R | 在当前光标位置覆盖 |
x | 删除当前光标位置的字符 |
X | 删除当前光标位置之前(左侧)的字符 |
dd | 剪切(以便稍后粘贴)整个当前行 |
D | 从当前光标位置剪切到行尾(该命令相当于d$) |
yX | 发出移动命令X,从当前光标位置复制(复制)适当数量的字符、单词或行 |
yy或Y | 复制(复制)整个当前行 |
p | 粘贴到当前光标位置之后(下一行) |
p | 粘贴到当前光标位置之前(上一行) |
. | 重复上一个命令 |
u | 撤消最后一个命令 |
U | 撤消最后一行中的最后一个命令。只要光标仍在线上,此操作就会起作用。 |
n | 查找搜索中的下一个匹配项 |
N | 查找搜索中的上一个匹配项 |
:n | 下一个文件,当指定多个文件进行编辑时,该命令加载下一个文件 |
:e文件 | 加载该文件来代替当前文件。 |
:r文件 | 将文件内容插入到当前光标位置之后(下一行) |
:q | 退出而不保存更改 |
:w文件 | 将当前缓冲区写入文件,要附加到现有文件,请使用:w>>file |
:wq | 写入当前文件的内容并退出,相当于x!和ZZ |
:r! | 执行命令并将输出插入到当前光标位置之后(下一行) |
Vi选项
以下选项在运行Vim时会派上用场(需要将它们添加到~/.vimrc文件中)。
# echo set number >> ~/.vimrc # echo syntax on >> ~/.vimrc # echo set tabstop=4 >> ~/.vimrc # echo set autoindent >> ~/.vimrc
- 当Vi打开现有文件或新文件时,set number显示行号。
- 语法打开打开语法突出显示(对于多个文件扩展名)以使代码和配置文件更具可读性。
- set tabstop=4将制表符大小设置为4个空格(默认值为8)。
- set autoindent将先前的缩进延续到下一行。
在Vi中搜索和替换文本
Vi能够根据搜索将光标移动到特定位置(在单行或整个文件上),它还可以在有或没有用户确认的情况下执行文本替换。
在一行内搜索
f
命令搜索一行并将光标移动到当前行中下一个出现的指定字符。
例如,该命令会将光标移动到当前行中fh
字母的下一个实例。请注意,你要搜索的字母f
和h
字符都不会出现在屏幕上的任何位置,但按Enter后该字符将突出显示。
例如,这是我在命令模式下按f4
后得到的结果。
搜索整个文件
使用/
命令,后跟要搜索的单词或短语。可以使用带有n命令的前一个搜索字符串或后一个(使用N命令)来重复搜索。这是在命令模式下输入/Jane
的结果。
搜索和替换文本
Vi使用命令(类似于sed)对一系列行或整个文件执行替换操作。要将整个文件的单词“ big
”更改为“ small
”,必须输入以下命令:
:%s/big/small/g
注意:命令开头的冒号。
冒号 ( :
) 开始ex命令,s
在本例中(用于替换),%
是一个快捷方式,意思是从第一行到最后一行(范围也可以指定为n
,m
表示“从第n行到第m行”),big是搜索模式,而small是替换的文本,g
表示在文件中每次出现搜索字符串时执行替换操作。
或者,可以将c
添加到命令末尾,以在执行任何替换之前要求确认。
:%s/big/small/gc
在用新文本替换原始文本之前,vi/m会向我们显示以下消息。
- y:执行替换(是)
- n:跳过本次出现并转到下一个(否)
- a:在此模式以及该模式的所有后续实例中执行替换
- q或Esc:退出替换
- l:执行此替换并退出(最后一次)
- Ctrl-e、Ctrl-y:分别向下和向上滚动以查看建议替换的上下文。
在Vi中编辑多个文件
可以在命令提示符中输入vim file1 file2 file3:
# vim file1 file2 file3
首先,vim将打开file1。要切换到下一个文件(file2),需要使用:n
命令。当我们想要返回到之前的文件时,:N
就会完成这个任务。
为了从file1切换到file3,可以进行以下操作。
:buffers
命令将显示当前正在编辑的文件的列表:
:buffers
命令:buffer 3
(末尾不带s
)将打开file3进行编辑。
在上图中,井号 ( #
) 表示该文件当前已打开但在后台,而%a
则表示当前正在编辑的文件。此外,文件编号后面的空格(上图中的3)表示该文件尚未打开。
临时Vi缓冲区
要将几行连续的行(例如4行)复制到名为a (不与文件关联)的临时缓冲区中,并将这些行稍后放置在当前Vi部分中的文件的另一部分中,需要进行以下操作:
- 按
ESC
键以确保我们处于Vi命令模式。 - 将光标放在我们要复制的文本的第一行上。
- 键入“ a4yy ”将当前行以及后续3行复制到名为a的缓冲区中。我们可以继续编辑文件-不需要立即插入复制的行。
- 当到达复制行的位置时,在p或P之前使用“ a”将复制的行插入名为a的缓冲区中:
- 键入“ ap”将复制到缓冲区中的行插入到光标所在的当前行之后。
- 键入“ aP”将复制到缓冲区 a 中的行插入到当前行之前。
如果愿意的话,可以重复上述步骤,将缓冲区的内容插入到文件中的多个位置。当当前窗口关闭时,临时缓冲区(例如本节中的缓冲区)将被释放。
总结
正如我们所看到的,Vi/Vim是一个强大且多功能的CLI文本编辑器,在Linux系统中被广泛的应用。另外,VI编辑器还有一些扩展技能,如果感兴趣的话,可以搜索相关资料进行了解。