学习 vi 编辑器/vi 参考
学习 vi 编辑器: 熟悉 — 基本任务 — 使你的工作更轻松 — 高级任务 — 细节 — Vi 克隆 (Vim – 基本导航 – 模式 – 提示和技巧 – 程序员需要了解的有用信息 – 增强 Vim – Vim 在 Windows 上 – VimL 脚本语言, Vile, BB vi) — vi 参考 |
以下约定在本参考中使用。
- <c>
- 单个字符,例如 'a' 或 '1'。
- <ESC>, <Ctrl-[>
- 表示应按下键盘上的 Escape (Esc) 键,它与 Control 和 '[' 相同。
- <CR>
- 表示应按下回车键。
- <TAB>
- 表示应按下 Tab 键
- <Ctrl-x>, <C-x>
- 表示应同时按下 Control 键和 'x' 键。'x' 可以是键盘上的几乎任何其他键。
- <Shift-x>, <S-x>, <X>
- 表示应同时按下 Shift 键和 'x' 键
- <Meta-x>, <M-x>
- 表示应同时按下 Meta 或 Alt 键和 'x' 键。
- :quit, :q
- Ex 命令。以 <:> 开头,后跟命令,最后以 <CR> 结尾。对于许多 Ex 命令,存在长形式 (:quit) 和短形式 (:q)。
- :set nocompatible
- 表示设置。
- strlen ()
- 表示函数。
- /pattern/, ?pattern?
- 搜索模式。vi 中的搜索模式是 正则表达式。
- :ranges/search/replace/options, :global /pattern/ delete
- 搜索模式与 Ex 命令组合。
vi 中的所有命令都区分大小写。
c | 单个字符,例如 'a' 或 '1'。 |
m | 单个小写字母,用于标记文本。 |
string | 多个字符,例如 'abc bed'。 |
pattern | 用于搜索的字符串,可能包含正则表达式。例如 'abc' 或 '^ab[123]'。 |
myfile | 要编辑的文件的名称。 |
vi myfile | 打开文件 myfile 进行编辑。如果文件不存在,将创建一个新文件。可以同时打开多个文件。 |
vi +line myfile | 打开文件 myfile,并将光标定位在给定的行。
|
vi +/string/ myfile | 打开文件 myfile,并将光标定位在包含该字符串的第一行。如果字符串包含空格,则应将其括在引号中。
|
vi -r | 列出文件的恢复副本。如果 vi 会话被杀死或系统崩溃,则将保存恢复副本。 |
vi -r myfile | 打开文件 myfile 的恢复副本。 |
view myfile | view 是 vi 的只读版本。所有 vi 命令(包括更改文件的命令)都是允许的,并且与 vi 中的行为相同。不同之处在于,正常尝试保存、ZZ 或 :wq 无法正常工作。相反,需要使用 :x! 或 :w。 |
vi 可以设置在大多数系统上使用键盘移动按钮,例如 光标左、页面上、主页、删除 等。
<G> | 移动到文件的最后一行。可以加一个表示要移动到的行的数字,<1><G> 移动到文件的首行。 |
<h> | 向左移动一个字符,或光标左。可以加一个数字,<5><h> 向左移动 5 个位置。 |
<j> | 向下移动一行,或光标下。可以加一个数字,<5><j> 向下移动 5 行。 |
<k> | 向上移动一行,或光标上。可以加一个数字,5k 向上移动 5 行。 |
<l> | 向前移动一个字符,或光标右。可以加一个数字,5l 向右移动 5 个位置。 |
<H> | 移动到屏幕顶部的行。 |
<M> | 移动到屏幕中间的行。 |
<L> | 移动到屏幕底部的行。 |
<-> | 移动到上一行的第一个非空格字符。可以加一个数字。
|
<+> | 移动到下一行的第一个非空格字符。可以加一个数字。
|
<CR> | 与 <+> 相同。 |
<|> | 必须加一个数字。移动到当前行的指定列。
|
<w> | 移动到下一个单词的开头,该单词可能在下一行。 |
<W> | 与 w 相同,但会考虑标点符号。 |
<e> | 移动到当前单词的结尾,或者如果在单词之间或在单词的结尾,则移动到下一个单词的结尾。 |
<E> | 与 e 相同,但会考虑标点符号。 |
<b> | 向后移动到当前单词的开头,或者如果在单词之间或在单词的开头,则移动到前一个单词的开头。 |
<B> | 与 b 相同,但会考虑标点符号。 |
<f>c | 找到同一行上字符 c 的第一次出现。 可以使用 <;> 或 <,>(反向方向)重复此命令。
|
<F>c | 与 f 相同,但反向。 |
<t>c | 找到同一行上字符 c 的第一次出现之前的字符。 |
<T>c | 与 t 相同,但反向,将光标放置在字符 c 之后。 |
<0> | 移动到当前行的开头。 |
<^> | 移动到当前行的第一个非空格字符。 |
<$> | 移动到当前行的结尾。 |
<Ctrl-F> | 向前移动一页。
|
<Ctrl-B> | 向后移动一页。
|
<Ctrl-D> | 向前移动半页。 |
<Ctrl-U> | 向后移动半页。 |
<Ctrl-E> | 在屏幕底部显示多一行。 |
<Ctrl-Y> | 在屏幕顶部显示多一行。 |
所有插入命令将 vi 置于 插入模式。 插入模式 由 ESC 键终止。
<i> | 在光标位置进入 插入模式。 |
<I> | 在当前行的开头进入 插入模式。 |
<a> | 在光标后进入 插入模式,或追加。 |
<A> | 在当前行的末尾进入 插入模式,或追加到当前行的末尾。 |
<o> | 在当前行下方插入新行,然后进入 插入模式。 |
<O> | 在当前行上方插入新行,然后进入 插入模式。 |
r | 用接下来输入的字符替换光标下的字符。 可以用数字开头,5ra 用字母 a 替换 5 个字符。 |
R | 进入 替换模式。 每输入一个字母,它都会替换光标下的字母,光标移动到下一个字符。 替换模式 由 ESC 键终止。 可以用数字开头,5Rab 后跟 ESC 将光标下的字符替换为 a,下一个字符替换为 b,然后插入另外 4 个 ab。 原始行被放入缓冲区,替换任何已经存在的文本。 |
每次使用删除命令时,被删除的文本都会被放入缓冲区,替换任何已经存在的文本。 缓冲区中的文本可以通过 p 或 P 检索。
dd | 删除当前行。 可以用数字开头。
|
de | 从光标下的字符删除到单词的末尾。 可以用数字开头。
|
dE | 与 de 相同,但会考虑标点符号。 |
dw | 从光标下的字符删除到下一个单词的开头。 可以用数字开头。
|
dW | 与 dw 相同,但会考虑标点符号。 |
db | 从光标左侧删除到前一个单词的开头。 可以用数字开头。
|
dB | 与 db 相同,但会考虑标点符号。 |
dtc | 从光标位置删除到第一个字符的前面。
|
dfc | 从光标位置删除到第一个字符(包括字符 c)。
|
dG | 删除当前行和所有到文件末尾的内容。 |
d/string | 从光标删除到字符串,向前或向后。 |
D | 从光标删除到行末。 |
d$ | 与 D 相同。 |
d^ | 从光标左侧删除到行首。 |
x | 删除光标下的字符。 可以用数字开头。
|
X | 删除光标左边的字符,但不会删除行末标记或下一行的任何字符。 可以用数字开头。
|
更改命令都选择要删除的文本,文本的末尾用 $ 表示。 进入插入模式,新文本覆盖或扩展文本。 当按 <ESC> 键终止插入时,任何剩余的原始文本都会被删除。
在更改期间删除的文本被放入缓冲区,替换任何已经存在的文本。 缓冲区中的文本可以通过 p 或 P 检索。
C | 从光标位置更改到行末。 可以用数字开头。
|
cM | 通常与 dMi 相同,其中 M 是任何移动命令。 |
cc | 更改当前行。 可以用数字开头。
|
ce | 更改当前单词。 可以用数字开头。
|
cw | 与 ce 完全相同。 此命令与通常的 vi 移动不一致:cw 和 ce 与 dei 相同,但 dwi 还删除到下一个单词的所有空格。 |
ctc | 从光标位置更改到第一个字符(不包括字符 c)。
|
cfc | 从光标位置更改到第一个字符(包括字符 c)。 |
cG | 从当前行的开头更改到文件末尾。 |
s | 更改光标下的字符。 可以用数字开头。
|
S | 更改整行。 与 ddO(大写字母 "O")相同。 |
yank 命令将文本复制到 vi 缓冲区。 文本还通过删除和更改命令复制到缓冲区。 put 或 place 命令从缓冲区检索文本。
yy | 将当前行复制到缓冲区。 可以用数字开头。
|
Y | 与 yy 相同。 |
yw | 将从光标到下一个单词开头的文本复制到缓冲区。 可以用数字开头。
|
p | 如果缓冲区包含整行,则它们被插入到当前行的后面。 如果它只包含字符,则它们被插入到光标的后面。 |
P | 如果缓冲区包含整行,则它们被插入到当前行的前面。 如果它只包含字符,则它们被插入到光标的前面。 |
搜索使用 正则表达式。
/pattern/ | 搜索字符串,它可能是正则表达式。 搜索从光标位置向下进行,在第一个匹配项处停止。 如果没有找到,它将从文件的开头继续到光标位置。 尾部的斜杠字符是可选的。
|
/pattern/+ | 转到包含搜索字符串的行后的行。
|
/pattern/e | 将光标停留在 pattern 匹配的字符串的最后一个字符上。* 通过在 e 后面添加 +num 或 -num,你可以提供一个字符偏移量,指定光标停留在的位置。 例如:/foo/e+3 将使光标停留在 foo 下一次出现的 3 个字符之后。* 通过使用 b 而不是 e,你可以指定从匹配字符串的开头起的字符偏移量。 |
/\cpattern/ | 进行不区分大小写的搜索。 |
?pattern? | 与 /pattern/ 相同,但向上搜索。 尾部的问号字符是可选的。 |
?pattern?- | 转到包含搜索字符串的行上面的行。
|
<n> | 重复上次搜索。 |
<N> | 重复上次搜索,但方向相反。 |
<f>char | 在当前行上向前搜索 char 的下一个出现位置。 |
<F>char | 在当前行上向后搜索 char 的下一个出现位置。 |
<t>char | 在当前行上向前搜索下一个出现的char,并将光标停留在char之前的字符上。 |
<T>char | 在当前行上向后搜索下一个出现的char,并将光标停留在char之后的字符上。 |
<;> | 重复上一次f或F搜索。 |
<,> | 与<;>类似,但方向相反。 |
搜索和替换使用正则表达式和Ex命令:substitute (简写为 :s),其语法类似于sed实用程序 - 这并不奇怪,sed,Ex 和w:Vi 有共同的起源 - Ed 编辑器。
:.s/pattern/replacement/ | 将当前行中pattern的第一个出现替换为replacement。* 如果pattern包含\(和\),它们将用于记住它们之间匹配的内容,而不是匹配括号字符。例如,:.s/\(\d*\)-\(\d*\)/\2:\1/可以匹配字符串12345-6789并将其替换为6789:12345。 |
:.s/pattern/replacement/g | 将当前行中所有出现的pattern替换为replacement。 |
:%s/pattern/replacement/g | 将整个文件中所有出现的pattern替换为replacement。 |
:x,ys/pattern/replacement/g | 将第x行到第y行中所有出现的pattern替换为replacement。* 例如::14,18s/foo/bar/g 将第14行到第18行中所有出现的foo替换为bar。
|
以下元字符在替换模式中具有特殊含义
& | 被与搜索模式匹配的文本替换。 |
\n | 被\(和\)之间的与搜索模式匹配的文本替换,其中n在1到9的范围内,\1被第一个集合的匹配替换。 |
\u | 将下一个字符大写(如果该字符是字母)。 |
\l | 将下一个字符小写(如果该字符是字母)。 |
\U | 开启大写模式,所有后续字符都将大写。 |
\L | 开启小写模式,所有后续字符都将小写。 |
\E | 关闭大写或小写模式。 |
\e | 关闭大写或小写模式。 |
例如,.:s/\(foo\) \(bar\) \(baz\)/\u\1 \U\2\E \3/可以匹配字符串foo bar baz并将其替换为Foo BAR baz。
标记的行可以在更改或删除文本时使用。
<m>m | 用字母标记当前行。
|
<'>m | 移动到用字母标记的行。
|
<Ctrl-L> | 刷新屏幕。 |
z<CR> | 刷新屏幕,使当前行位于顶部。可以前面加上行号。
|
/pattern/z | 找到包含string第一个出现位置的行,然后刷新屏幕,使该行位于顶部。 |
z. | 刷新屏幕,使当前行位于屏幕中央。可以前面加上行号,在这种情况下,该行将位于中央。zz 序列也具有相同的效果。
|
/string/z. | 找到包含string第一个出现位置的行,然后刷新屏幕,使该行位于中央。 |
z- | 刷新屏幕,使当前行位于底部。可以前面加上行号,在这种情况下,该行将位于底部。
|
/string/z- | 找到包含string第一个出现位置的行,然后刷新屏幕,使该行位于底部。 |
<~> | 更改光标下字符的大小写,并移动到下一个字符。可以前面加上数字,因此5~ 将更改 5 个字符的大小写。 |
<.> | 重复上一次插入或删除操作。可以前面加上数字,dd 后面加上5. 将删除一行,然后删除另外 5 行。 |
<%> | 将光标移动到匹配的括号,可以是 (), [] 或 {} 中的任何一个。 |
<Ctrl-G> | 临时在屏幕底部显示状态行。 |
:f | 与 <Ctrl-G> 相同。 |
<J> | 将下一行连接到当前行的末尾。可以前面加上数字。1J 和2J 与J 具有相同的操作。
|
<u> | 撤销上一次更改。 |
<U> | 撤销对当前行的所有更改。 |
<Ctrl-Z> | 将vi置于后台,即控制权将返回到操作系统。在 UNIX 中,可以使用fg 将vi 会话返回到前台。 |
<Z><Z> | 保存并退出。它象征着睡眠,表示工作的结束。 |
:quit :q |
退出,但前提是没有进行过任何更改。 |
:quit! :q! |
不保存退出,无论是否进行过任何更改。 |
:write :w |
保存当前文件,但不退出。
|
:write!filename :w!filename |
保存到该文件,覆盖任何现有内容。 |
:wq :write|quit |
保存并退出。 |
:exit :xit :x |
保存并退出。 |
:exit! :xit! :x! |
用于在view 中保存并退出。 |
:e filename | 退出当前文件并开始编辑命名文件。 |
:e + filename | 退出当前文件并开始编辑命名文件,并将光标置于文件末尾。
|
:e! | 关闭当前文件,丢弃所有未保存的更改,并重新打开该文件以进行编辑。 |
:e# | 退出当前文件并开始编辑上一个文件。 |
:n | 当命令行中引用了多个文件时,开始编辑下一个文件。 |
:n files | 重置:n 的文件列表。当前文件将被关闭,列表中的第一个文件将被打开以进行编辑。 |
:r filename | 读取文件,即插入文件。
|
所有选项都是ex 选项,因此需要在前面加上冒号。
默认选项可以放在用户主目录中的名为.exrc 的文件中。此文件中的选项前面没有冒号,例如:
- set ic
:set all | 显示当前的所有设置。 |
! 启用 | ! 禁用 | ! 含义 |
:set ignorecase :set ic |
:set noignorecase :set noic | 忽略大小写。使搜索不区分大小写。 |
:set list | :set nolist | 显示控制字符。<Ctrl-I> 是制表符,$ 是换行符。 |
:set number :set nu |
:set nonumber :set nonu | 开启行号。 |
:set term | 显示终端类型。 | |
:set autoindent :set ai |
:set noautoindent :set noai | 在插入模式下,按下 <CR> 会自动缩进行。 |
:set hlsearch | :set nohlsearch | 突出显示由 /term/ 匹配的搜索结果。这是一个视觉辅助工具。 |
ex 命令
[edit | edit source]ex 命令以 : 开头,这会将 vi 进入 最后一行模式,在屏幕的最后一行输入。
:! command | 执行指定的系统命令,然后返回到 vi。
|
:sh | 启动一个 shell。exit 返回到 vi 会话。 |
:vi | 退出 最后一行模式 并返回到正常的 命令模式。 |
ex 行命令
[edit | edit source]这些命令编辑行,并具有以下语法:
- 没有行号,表示在当前行操作。
- 带有 %,表示对所有行操作。
- 一对行号,例如 '3,5',表示对第 3 行到第 5 行(包含)进行操作。任何一个数字都可以用 . 替换,表示当前行,或者用 $ 表示最后一行。因此 .,$ 表示从当前行到文件末尾,1,$ 表示与 % 相同。此外,可以使用简单的算术运算,所以 .+1 表示当前行的下一行,$-5 表示最后一行之前的 5 行。
co | 复制,后面跟着要复制到的行的位置。
|
d | 删除。
|
m | 移动,后面跟着要移动到的行的位置。
|
映射 / 重新映射 vi 命令
[edit | edit source]:map | 在 vi 命令模式下创建新的命令或覆盖现有的命令。
|
:map! | 在命令模式和插入模式下创建新命令。
|
外部链接
[edit | edit source]
学习 vi 编辑器: 熟悉 — 基本任务 — 使你的工作更轻松 — 高级任务 — 细节 — Vi 克隆 (Vim – 基本导航 – 模式 – 提示和技巧 – 程序员需要了解的有用信息 – 增强 Vim – Vim 在 Windows 上 – VimL 脚本语言, Vile, BB vi) — vi 参考 |