首页 > 教程 > FreeBSD 教程 > FreeBSD 基础 > 文本编辑器 > FreeBSD vi 文本编辑器详解

FreeBSD vi 文本编辑器详解

vi 是 FreeBSD 系统中的标准的文本编辑器。在 FreeBSD 中使用的 vi 是真正的 vi,而不是 vim,(在 Linux 系统中 vi 是对 vim 的符号链接)。在 FreeBSD 中使用的 vi 是其实是 nvi(New vi),它是 BSD 系统中对传统 vi 的重新实现,保持了向后兼容性。

vi 编辑器的程序还提供了另外两个命令入口 exview

  • ex:行编辑器模式,以行为单位编辑文本
  • view:以只读模式查看文件,等同于 vi -R

确认 vi 命令的程序

想要查看系统中使用的 vi 是标准的 vi 程序,还是对 vim 的符号连接,可以使用 whatis 命令查看。

标准 vi 程序

运行 whatis 命令:

whatis vi

输出类似如下的内容:

vi, ex, view, nex, nvi, nview(1) - text editors

vim 命令符号链接

运行 whatis 命令:

whatis vi

输出类似如下的内容:

vi (1)               - Vi IMproved, a programmer's text editor

启动 vi 编辑器

可以使用如下几种方式启动 vi 文本编辑器:

vi filename        # 编辑指定文件
view filename      # 以只读模式查看文件(等同于使用 vi -R)
vi -r filename     # 恢复因系统崩溃未保存的更改

推荐启动后例如输入如下内容,启用详细配置:

:set verbose showmode

编辑器显示详细的错误信息和当前模式。

vi 的运行模式

vi 是一款模式化的文本编辑器,它有两种不同的运行模式,两种模式之间可以进行切换,理解 vi 的运行模式,是能够掌握 vi 的关键。

模式详解

vi 的运行模式分为命令模式和输入模式,而命令模式又分为 vi 命令模式和 ex 命令模式。在 vi 命令模式下,输入 : 就进入的 ex 命令模式,也就是说:所有以 : 开头的命令都是在 ex 形式下执行的。在 vi 命令模式下,可同时执行 vi 命令和 ex 命令。

命令模式:

  • 启动 vi 后自动进入,是默认的模式
  • 在该模式下的所有输入都视为命令
  • 如移动光标、删除、复制等操作
  • : 开头的是 ex 命令
  • 不以 : 开头的是 vi 命令

输入模式:

  • 用于输入和编辑文本
  • 可以使用方向键移动光标

注意在命令模式和输入模式下都能删除内容,但是有所不同:

  • 命令模式下:需要使用特定的命令
  • 输入模式下:使用 BackspaceDelete

切换模式

用户可以随意在命令模式和输入模式之间切换:

  • 命令模式iaoO 命令进入 输入模式
  • 输入模式Esc 返回 命令模式

命令详解

如下讲解的命令只能在命令模式下使用,就是在命令模式下输入这些字符。

移动光标

如下分类给出相关的移动光标命令。

基本移动

基础移动光标命令是最常用的移动光标命令:

  • h:向左移动一个字符
  • j:向下移动一个字符(也就是向下移动一行)
  • k:向上移动一个字符(也就是向上移动一行)
  • l:向右移动一个字符
  • 0:移动到行首
  • $:移动到行尾
  • ^:移动到行首的第一个非空白字符处
  • 0:移动到行首

注:同时可以使用方向键移动光标

按单词移动

如下的命令以单词为单位,移动光标:

  • w, W:向前移动一个单词,文本中的前是指 "行尾的方向,或者下"
  • b, B:向后移动一个单词,文本中的前是指 "行首的方向,或者上"
  • e, E:移动到单词末尾

屏幕内移动

如下的命令在屏幕范围内,移动光标,不会滚动屏幕:

  • H:移动到屏幕顶部,也就是当前显示区域内的第一行
  • M:移动到屏幕中间
  • L:移动到屏幕底部,也就是当前显示区域内的最后一行

文件内移动

如下的命令文件的范围内,快速的把光标移动到特定的位置:

  • G:移动到文件最后一行的行首
  • 行号G:移动到指定 行号 的行首
  • :行号:跳转到第 行号

文本操作

删除文本

使用如下命令在命令模式下删除文本:

  • x:删除当前光标处的字符。
  • X:删除当前光标的前一个字符。
  • dd:删除整行。
  • dw:删除当前光标处的单词。
  • d$:删除到行尾
  • d0:删除到行首
  • :行号d:删除指定 行号 行的内容,如 5d 删除第5行的内容
  • :行号,行号2d:删除指定 行号1行号2 范围内所有行的内容,如 :5,10d 删除第5到第10行的内容
  • :.,$d:从当前行(.)删除到文件末尾($)

如下的命令使用搜索功能,删除文本:

  • :g/pattern/d:删除所有匹配到的内容所在的整行
  • :v/pattern/d:删除所有没有匹配到搜索内容的整行

复制和粘贴

  • yy:复制当前行
  • yw:复制当前的单词
  • y$:复制到行尾。
  • p:将复制或删除的内容粘贴到光标后方。
  • P(大写形式):将复制或删除的内容粘贴到光标后方。

修改命令

如下的修改命令也会进入输入模式,需要按 Esc 返回命令模式:

  • cc:修改整行,即:删除整行的内容后,进入编辑模式,在改行插入内容,可换行继续插入内容
  • cw:从光标处修改单词,不会直接删除单词的内容,而是覆盖原来的字符,但是到结尾后可以继续插入字符,也可换行
  • c$:从光标处修改该行后面的内容,不会直接删除内容,而是覆盖原来的字符,但是到结尾后可以继续插入字符,也可换行
  • R:从光标处在该行内替换内容,与 c$ 非常的相似

如下的修改命令也会进入输入模式,但会自动返回命令模式:

  • r:替换当前光标处的单个字符,替换完成后,自动返回命令模式

撤销和重做

  • u:撤销上一次操作
  • U(大写形式):恢复当前行的原始状态,即:撤销对本行的所有操作
  • .:重复上一次操作

保存和退出

  • :w:保存文件
  • :wq:保存并退出
  • :x:保存并退出(仅当有修改时)
  • :q:退出
  • :q!:强制退出,编辑后,不需保存内容时使用

搜索和替换

在搜索和替换内容时支持使用基本的正则表达式。

正则表达式

在 vi 中可以使用的正则表达式字符有:

  • ^:匹配行首
  • $:匹配行尾
  • .:匹配任意单个字符
  • *:对前面的内容进行 0 次或多次匹配
  • []:匹配中括号内的任意一个字符即可,如 [abc] 表示匹配 a 或 b 或 c
  • \<:匹配单词的开头
  • \>:匹配单词的结尾
  • \(...\):把括号内的匹配到的内容作为一个分组
  • \序号:引号(获取)指定需要的分组匹配到的内容,如 \2 引用第二个分组匹配到的内容

搜索

  • /text:/text:向前(文本中的行尾方向或向下)搜索指定的文本内容,text 替换为你需要搜索的具体的值,会定位到第一次匹配到的内容
  • ?text:?text:向后(文本中的行首方向或向上)搜索指定的文本内容,text 替换为你需要搜索的具体的值,会定位到第一次匹配到的内容
  • n:重复上一次搜索(按上一次搜索的方向进行),每次只匹配一次
  • N:重复上一次搜索(按上一次搜索的反方向进行),每次只匹配一次

替换

使用如下命令替换内容:

  • :s/old/new/:将当前行的第一个 old 替换为 new
  • :s/old/new/g:将当前行的所有 old 替换为 new
  • :1,10s/old/new/g:在第1到10行内将所有 old 替换为 new
  • :%s/old/new/g:在整个文件内将所有 old 替换为 new
  • :%s/old/new/gc:在整个文件内将所有 old 替换为 new,并在每次替换前确认(c)

配置选项

vi 的配置可以在配置文件中配置;还可以在编辑文件时,使用 :set 选项 的方式临时设置。

永久设置

vi 的配置可以在配置文件中配置,每次启动 vi 时,都会加载该配置,方便使用。

在配置文件 ~/.nexrc~/.exrc 添加的常用的配置:

" 显示设置
set number         " 显示行号
set verbose        " 显示详细的错误信息
set showmode       " 显示当前模式

" 缩进设置
set autoindent     " 设置自动缩进
set shiftwidth=4   " 设置缩进为4个空格
set tabstop=4      " 设置制表符显示宽度为4个字符"
set expandtab      " 将Tab键输入转换为空格

" 搜索设置
set ignorecase     " 搜索时忽略大小写

临时设置

使用 :set 选项 的方式临时设置,该设置只对当前的会话有效,关闭文件后,下一次打开文件需要重新设置。

常用的设置选项有:

" 显示设置
:set number         " 显示行号
:set verbose        " 显示详细的错误信息
:set showmode       " 显示当前模式

" 缩进设置
:set autoindent     " 设置自动缩进
:set shiftwidth=4   " 设置缩进为4个空格
:set tabstop=4      " 设置制表符显示宽度为4个字符"
:set expandtab      " 将Tab键输入转换为空格

" 搜索设置
:set ignorecase     " 搜索时忽略大小写

查看设置

在编辑文件时可以使用如下的命令查看配置选项:

:set:显示所有已更改的选项

:set all:显示所有选项

:set option?:显示特定选项的值

环境变量

vi 的配置受以下环境变量的影响:

  • COLUMNS:屏幕列数
  • LINES:屏幕行数
  • TERM:终端类型
  • EXINIT:ex初始化命令
  • HOME:用户主目录
  • SHELL:使用的shell

配置文件

vi 在启动时会按照如下的顺序读取配置文件:

  1. 系统配置文件:/etc/vi.exrc
  2. 用户首选配置文件:~/.nexrc
  3. 用户备用配置文件:~/.exrc
  4. 当前目录配置文件:./.nexrc
  5. 当前目录备用配置文件:./.exrc

结论

FreeBSD 中的 vi 文本编辑器是一个功能强大的文本编辑工具。掌握了如上的内容,你就可以轻松使用 vi 文本编辑器编辑文本内容啦。