FreeBSD vi 文本编辑器详解
vi 是 FreeBSD 系统中的标准的文本编辑器。在 FreeBSD 中使用的 vi 是真正的 vi,而不是 vim,(在 Linux 系统中 vi 是对 vim 的符号链接)。在 FreeBSD 中使用的 vi 是其实是 nvi(New vi),它是 BSD 系统中对传统 vi 的重新实现,保持了向后兼容性。
vi 编辑器的程序还提供了另外两个命令入口 ex 和 view:
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 命令
输入模式:
- 用于输入和编辑文本
- 可以使用方向键移动光标
注意在命令模式和输入模式下都能删除内容,但是有所不同:
- 命令模式下:需要使用特定的命令
- 输入模式下:使用
Backspace或Delete键
切换模式
用户可以随意在命令模式和输入模式之间切换:
- 在
命令模式按i、a、o、O命令进入输入模式 - 在
输入模式按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 在启动时会按照如下的顺序读取配置文件:
- 系统配置文件:
/etc/vi.exrc - 用户首选配置文件:
~/.nexrc - 用户备用配置文件:
~/.exrc - 当前目录配置文件:
./.nexrc - 当前目录备用配置文件:
./.exrc
结论
FreeBSD 中的 vi 文本编辑器是一个功能强大的文本编辑工具。掌握了如上的内容,你就可以轻松使用 vi 文本编辑器编辑文本内容啦。