Vi 备忘录(未完待续)

虽说已经用了很久的vi,可是对于vi不同功能的熟练程度是不同的,这意味着有时会忘掉某些操作而需要查阅相关信息。此时若是手边没有参考书,就非常令人抓狂,只好去网上进行搜索。既然如此,那就花点时间整理下吧,查阅起来应该方便不少。我个人习惯是把vi和vim混在一起统称为vi的,因此尽管标题是“Vi 备忘录”,但其实也包含了vim的功能。

Vi 的简介

Vi 的基本模式

使用 vi 时主要有四种模式:一般模式插入模式命令行模式可视化模式一般模式 下可以快速浏览文本,插入模式 下可以自由编辑文本,命令行模式 下可以进行搜索、保存等特殊操作,可视化模式 下可以进行块操作。

Vi 的特性

未完待续

Vi 命令快速查询

这里根据各命令的功能进行归类总结。值得注意的是,许多命令都可以在前面加上数字n,来完成n次操作;也可以进行 操作+移动 的组合,来进行快速操作,如 d$

移动光标

操作 功能
(n)h 或 (n)← 或 (n)[Backspace] 或 (n)[Ctrl]h 向左移动一(n)个字符
(n)j 或 (n)↓ 或 (n)[Ctrl]n 或 (n)[Ctrl]j 向下移动一(n)行
(n)k 或 (n)↑ 或 (n)[Ctrl]p 向上移动一(n)行
(n)l 或 (n)→ 或 (n)[space] 向右移动一(n)个字符
(n)[Ctrl]f 或 (n)[Page Down] 向下移动一(n)页
(n)[Ctrl]b 或 (n)[Page Up] 向上移动一(n)页
(n)[Ctrl]d 向下移动半页(n行)
(n)[Ctrl]u 向上移动半页(n行)
(n)[Ctrl]e 向下滚动一(n)行
(n)[Ctrl]y 向上滚动一(n)行
0 或 [Home] 移动至当前行行首
(n)$ 或 (n)[End] 移动至当前行(向下第n行)行尾
^ 或 _ 移动至当前行的非空格行首
(n)+ 或 (n)[Enter] 或 (n)[Ctrl]m 移动至下一(n)行的非空格行首
(n)- 移动至上一(n)行的非空格行首
(n)zt 或 (n)z[Enter] 将当前(第n)行滚动至屏幕顶部
(n)zz 或 (n)z. 将当前(第n)行滚动至屏幕中间
(n)zb 或 (n)z- 将当前(第n)行滚动至屏幕底部
[Ctrl]o 移动至较早的位置
(n)| 移动至当前行第一(n)列
( 移动至上一个句子的开头
) 移动至下一个句子的开头
{ 移动至上一个段落
} 移动至下一个段落
[[
]]
(n)H 移动至屏幕第一(n)行的非空格行首
M 移动至屏幕中间行的非空格行首
(n)L 移动至屏幕倒数第一(n)行的非空格行首
(n)w 移动至下一(n)个单词词首
(n)e 移动至下一(n)个单词词尾
(n)b 移动至上一(n)个单词词首
(n)ge 移动至上一(n)个单词词尾
(n)W 移动至下一(n)个单词词首,跳过标点符号
(n)E 移动至下一(n)个单词词尾,跳过标点符号
(n)B 移动至上一(n)个单词词首,跳过标点符号
(n)gE 移动至上一(n)个单词词尾,跳过标点符号
G 移动至最后一行
nG 移动至第n行
gg 移动至第一行
f[char] 移动至当前行下一个字符char
F[char] 移动至当前行上一个字符char
t[char] 移动至当前行下一个字符char的前一个字符
T[char] 移动至当前行上一个字符char的后一个字符
; 执行上一次的[fFtT]
, ;的反向,;为[fFtT]则,为[FfTt]
% 移动至与当前括号匹配的括号,包括()、[]、{}、<>等
n% 移动至文件n%处

删除

使用 d 进行删除时,可以通过 (n1)d(n2)[CursorMove] 的形式将 d 与光标移动 [CursorMove] 进行组合,对当前位置至目标位置间的字符进行删除,并且利用n1、n2来进行多次操作。
列举部分有关 d 的操作,未列举的可参考 光标移动 部分的内容。

操作 功能
(n)dd 或 d(n)d 向下删除一(n)行(从当前行开始计算)
dG 删除当前行至最后一行
dnG 删除当前行至第n行
dgg 删除当前行至第1行
d0 删除当前光标至行首
d$ 或 D 删除当前光标至行尾
(n)dw 或 d(n)w 从当前光标开始向后删除至下一(n)个单词词首前
(n)de 或 d(n)e 从当前光标开始向后删除至下一(n)个单词词尾后
(n)db 或 d(n)b 从当前光标开始向前删除至上一(n)个单词词首前
(n)dge 或 d(n)ge 从当前字符后开始向前删除至上一(n)个单词词尾前
(n1)d(n2)[w/e/b/ge] 同上,但处理n1×n2个单词
daw 从单词开头开始向后删除至下一个单词词首前(不确定)
diw
das
dis
df[char] 删除至当前行下一个字符char
dF[char] 删除至当前行上一个字符char
dt[char] 删除至当前行下一个字符char的前一个字符
dT[char] 删除至当前行上一个字符char的后一个字符
(n)d/string 或 d(n)/string 向下搜索字符串string,并从当前光标开始向后删除至下一个string前
(n)d?string 或 d(n)?string 向上搜索字符串string,并从当前光标开始向前删除至下一个string前
[Del] 向后删除一个字符
(n)x 向后删除一(n)个字符
(n)X 向前删除一(n)个字符

复制

使用 y 进行删除时,可以通过 (n1)y(n2)[CursorMove] 的形式将 y 与光标移动 [CursorMove] 进行组合,对当前位置至目标位置间的字符进行删除,并且利用n1、n2来进行多次操作。
列举部分有关 y 的操作,未列举的可参考 光标移动 部分和 删除 部分的内容。

操作 功能
(n)yy 或 (n)Y 向下复制一(n)行(从当前行开始计算)
yG 复制当前行至最后一行
ynG 复制当前行至第n行
ygg 复制当前行至第1行
y0 复制当前光标至行首
y$ 复制当前光标至行尾
(n)yw 或 y(n)w 从当前光标开始向后复制至下一(n)个单词词首前
(n)ye 或 y(n)e 从当前光标开始向后复制至下一(n)个单词词尾后
(n)yb 或 y(n)b 从当前光标开始向前复制至上一(n)个单词词首前
(n)yge 或 y(n)ge 从当前字符后开始向前复制至上一(n)个单词词尾前
yaw
y/string
y?string

修改

操作 功能
(n)J 删除换行符,连接下一(n)行与当前行
(n)p 将已复制或删除的内容粘贴一(n)份至下一行或当前字符后
(n)P 将已复制或删除的内容粘贴一(n)份至上一行或当前字符前
(n)u 撤销一(n)次操作
U 恢复上一次修改行的所有修改
(n)[Ctrl]r 恢复一(n)次撤销
. 重复上一个操作
(n)>> 或 >(n)> 将当前行(向下n行)向右移动shiftwidth的距离
(n)<< 或 <(n)< 将当前行(向下n行)向左移动shiftwidth的距离
(n)~ 更改一(n)个字母的大小写,并向后移动一(n)个字符
(n)[Ctrl]a 使当前数字加一(n)

插入

操作 功能
(n)i 从当前光标插入(重复n次)
(n)I 从行首插入(重复n次)
(n)a 从当前光标下一个字符后插入(重复n次)
(n)A 从行尾插入(重复n次)
(n)o 从下一行插入新行(重复n次)
(n)O 从上一行插入新行(重复n次)
(n)r 单次替换一(n)个字符
R 多次替换字符
(n)cc 或 c(n)c 或 (n)S 向下删除一(n)行,并从新行插入(从当前行开始计算)
(n)cw 或 c(n)w 从当前光标开始向后删除至下一个单词词尾,并从当前光标插入
(n)ce 或 c(n)e 同上
(n)cb 或 c(n)b
caw 从单词开头开始向后删除至下一个单词词首,并从当前光标插入(不确定)
c0 删除当前光标至行首,并从当前光标插入
c$ 或 C 删除当前光标至行尾,并从当前光标插入
c/string
c?string
(n)s 删除一(n)个字符,并从当前光标插入

块选取

进入块选取后可以使用移动光标的快捷键来快速选取

操作 功能
v 按字符进行块选取
V 按行进行块选取
[Ctrl]v 按矩形进行块选取
y 块选取后复制反白区域
d 块选取后删除反白区域
c 按矩形进行块选取后,替换反白区域
~ 更改泛白区域的字母大小写

标记

可以对特定位置进行标记,以达到快速访问与跳转的目的。

操作 功能
m[mark] 将当前行设置标记[mark],[mark]取为[a-z]
y’[mark] 复制标记为[mark]的行至当前行之间的内容
d’[mark] 删除标记为[mark]的行至当前行之间的内容
‘[mark] 移动至标记[mark]所在行的非空格行首
‘’ 或 ‘` 移动至上一行的非空格行首
`[mark] 移动至标记[mark]所在行的具体位置
`` 或 `‘ 移动至上一行的具体位置
‘.
`.
:marks 查看所有标记

宏与寄存器

将一系列操作以宏的形式保存至寄存器中,以达到快速执行重复操作的目的。

操作 功能
q[register]和q 将一系列操作设置为宏存至寄存器[register],[register]取为[a-z]
“[register]yy 复制当前行至[register]中
“[register]dd 删除当前行至[register]中
“[register]p 复制[register]内容至下一行
(n)@[register] 执行一(n)次寄存器[register]内的宏
@@ 执行上一次执行的宏(只执行一次,不论上一次执行了多少次)

标签

未完待续

插入模式

操作 功能
[Ctrl]n 输入提示与自动补全(向下)
[Ctrl]p 输入提示与自动补全(向上)
[Ctrl]e 逐个字符复制下一行
[Ctrl]y 逐个字符复制上一行
[Ctrl]o 临时切换至一般模式
[Esc] 或 [Ctrl][ 插入模式切换至一般模式
[Backspace] 或 [Ctrl]h 插入模式中向左删除一个字符

文件操作

操作 功能
:w 保存文件
:w >> [file] 以追加的形式保存文件至[file]
:w! 强制保存文件
:q 退出文件(要求修改已保存)
:q! 退出但不保存
:wq 保存后退出
:w [file] 另存为[file]
ZZ 若文件无改动则不保存退出,若文件被改动则保存后退出
:r [file] 在下一行插入[file]的内容
:n r [file] 在第n行的下一行插入[file]的内容
:e! 返回至上次保存后的状态,相当于重新打开

搜索

操作 功能
(n)/string 向下搜索字符串string的第一(n)个匹配项
(n)?string 向上搜索字符串string的第一(n)个匹配项
/string\c
/\
n 移动至下一个搜索的匹配项
N 移动至上一个搜索的匹配项
gd 搜索当前单词,并停留在当前匹配项
(n)* 搜索当前单词,并移动到下一(n)个匹配项
(n)# 搜索当前单词,并移动到上一(n)个匹配项
(n)g* 搜索当前字符串,并移动到下一(n)个匹配项
(n)g# 搜索当前字符串,并移动到上一(n)个匹配项

调整

操作 功能
:% [action] 对所有行进行操作[action]
:n1,n2 [action] 对第n1行至n2行之间执行操作[action],’1,$’同’%’
:n [action] 对第n行执行操作[action]
:n1,n2 y 复制第n1至n2行之间内容
:n1,n2 d 删除第n1至n2行之间内容
:n1,n2 m n3 将第n1至n2行移动到第n3行之后
:n1,n2 co n3 将第n1至n2行复制到第n3行之后
:n1,n2 w [file] 将第n1至n2行另存为[file]
:n1,n2 w ![command] 将第n1至n2行作为标准输入来执行[command]
:n1,n2 s/str1/str2/ 在第n1至n2行之间搜索第一个str1并替换成str2
:n1,n2 s/str1/str2/g 在第n1至n2行之间搜索str1并替换成str2
:n1,n2 s/str1/str2/gc 在第n1至n2行之间搜索str1并替换成str2,替换前需确认
:n1,n2 >> 将第n1行至n2行之间向右移动一个[tab]
:n1,n2 << 将第n1行至n2行之间向左移动一个[tab]
:g/str/d
:s 或 :& 执行上一步的s/str1/str2/g命令
:ce 使本行内容居中
:ri 使本行内容靠右
:le 使本行内容靠左
:@: 执行上一次的命令行模式的命令

外部命令

操作 功能
:![command] 暂时离开vi并执行命令[command]
:!! 执行上一次的外部命令
:.![command]
:sh 暂时离开vi执行多条命令
[Ctrl]d 执行:sh后由此操作回到vi
:r ![command] 执行外部命令并将其标准输出插入至下一行

多文件编辑

操作 功能
:vi [file] 或 :e [file] 在vi中打开另一个文件[file]
:n 切换至下一个文件
:N 切换至上一个文件
:b [file] 直接跳到[file]文件对其进行编辑
:next
:previous
:wnext
:args
:args [file1] [file2] …
:last
:first
[Ctrl]^ 返回至上一个编辑的文件
:file 列出当前文件的信息
:files 或 :ls 列出所有打开的文件

多窗口编辑

操作 功能
:split 或 [Ctrl]ws 打开新窗口显示当前文件(水平排列)
:split [file] 打开新窗口显示file(水平排列)
:vsplit 或 [Ctrl]wv 打开新窗口显示当前文件(垂直排列)
:vsplit [file] 打开新窗口显示file(垂直排列)
:q 或 [Ctrl]wq 关闭当前窗口
[Ctrl]wo 关闭当前窗口以外的其他所有窗口
[Ctrl]wh 或 [Ctrl]w← 移动至左一个窗口
[Ctrl]wj 或 [Ctrl]w↓ 移动至下一个窗口
[Ctrl]wk 或 [Ctrl]w↑ 移动至上一个窗口
[Ctrl]wl 或 [Ctrl]w→ 移动至右一个窗口
[Ctrl]w+ 或 [Ctrl]w- 增加或减小视窗的高度

个性化设置

使用 :set 来进行个性化的设置,通常是对两种类型的变量进行设置:取值型和布尔型。

  • 取值型 —— :set var=num
  • 布尔型 —— :set (no)var

另外,还有一些设置或是查看信息的命令,它们可能不使用 :set 作为开头。

布尔型变量

操作 功能
:set number 显示行号,number可缩写为nu
:set hlsearch 设置搜索高亮
:set autoindent 设置自动缩进,autoindent可缩写为ai
:set autowrite 设置自动保存
:set cindent 设置C语言的自动缩进,缩进量由shiftwidth控制
:set ignorecase 不区分大小写,ignorecase可缩写为ic
:set backup 设置自动备份,backup可缩写为bk
:set mesg
:set warn
:set ruler 显示右下状态栏,ruler可缩写为ru
:set showmode 显示左下模式信息,showmode可缩写为smd
:set wrapscan 设置搜索达顶部或底部时能回到底部或顶部,wrapscan可缩写为ws

取值型变量

操作 功能
:set shiftwidth=n 设置偏移量为n个空格,shiftwidth可缩写为sw
:set window=n ,window可缩写为wi
:set wrapmargin=n ,wrapmargin可缩写为wm
:set tabstop=n 设置一个[tab]为n个空格,tabstop可缩写为ts
:set backspace=[012] 设置backspace是[2]否[01]能够删除任意字符
:set background=dark 设置颜色色调为深色,background可缩写为bg
:set background=light 设置颜色色调为浅色,background可缩写为bg
:set filetype=[filetype] 设置文件类型,如[filetype]取fortran

其他设置及查看信息

操作 功能
:set 显示与系统默认值不同的设置参数
:set all 显示当前所有的环境参数设置值
:syntax on 或 :syntax enable 开启语法高亮
:syntax off 或 :syntax clear 取消语法高亮
:nohlsearch 单次取消高亮
:colorscheme [type]
:hide edit [file]
:abbreviate str1 str2 将str1设置为str2的缩写,abbreviate可缩写为ab
:unabbreviate str 删除已设置的缩写str,unabbreviate可缩写为una
:abbreviate 查看所有已设置的缩写
:map key1 key2 将关键字序列key1映射到另一个关键字序列key2
:unmap key 删除已设置的映射key
:map
:registers ([register]) 查看所有([register])寄存器,registers可缩写为reg
[Ctrl]g 显示当前文件名和状态
[Ctrl]l 清除并重画屏幕
Q 进入Ex模式,之后输visual则返回Normal模式
:help 打开帮助
:help [operation]
:version 查看vi的相关设置信息,可缩写为ve
[Esc][Esc] 或 [Ctrl][[Ctrl][ 命令行模式切换至一般模式
[Backspace] 或 [Ctrl]h 命令行模式中向左删除一个字符

设置文件

vi 启动时,会自行寻找设置文件来初始化设置。按照以下顺序,vi 将读取找到的第一个文件。

\$HOME/.vimrc
\$HOME/_vimrc
\$HOME/.exrc
\$HOME/_exrc

如果使用 vi 的GUI版本,则需要读取 gvimrc 文件。使用 :version 命令可以查看读取了哪些文件。
如果想要在打开 vi 后自行读取设置文件,可以使用 :source 命令。
如果想要把已修改的设置保存为文件,可以使用 :mkvimrc:mkexrc 命令。
如果想在不同的目录读取不同的设置文件,需要在当前目录放置一个 .vimrc 文件,同时在 vi 里设置 :set exrc

操作 功能
:mkvimrc [file] 将已设置的内容保存成文件[file],可缩写为mkv
:version 可查看读取的设置文件,可缩写为ve
:source [file] 读取包含设置信息的文件,可缩写为so
:mkexrc [file] 将已设置的内容保存成文件[file],可缩写为mk
:scriptnames 查看加载的脚本,可缩写为scr
:set exrc 设置为读取当前目录的设置文件,exrc可缩写为ex