跳转到内容

学习 vi 编辑器/vi 参考

来自维基教科书,开放的书籍,开放的世界

学习 vi 编辑器: 熟悉基本任务使你的工作更轻松高级任务细节Vi 克隆 (Vim基本导航模式提示和技巧程序员需要了解的有用信息增强 VimVim 在 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 +5 myfile 在第 5 行打开 myfile
  • vi + myfile 在最后一行打开 myfile
vi +/string/ myfile 打开文件 myfile,并将光标定位在包含该字符串的第一行。如果字符串包含空格,则应将其括在引号中。
  • vi +/"search string"/ myfile 在包含 search string 的第一行打开 myfile
vi -r 列出文件的恢复副本。如果 vi 会话被杀死或系统崩溃,则将保存恢复副本。
vi -r myfile 打开文件 myfile 的恢复副本。
view myfile viewvi 的只读版本。所有 vi 命令(包括更改文件的命令)都是允许的,并且与 vi 中的行为相同。不同之处在于,正常尝试保存、ZZ:wq 无法正常工作。相反,需要使用 :x!:w

vi 命令

[编辑 | 编辑源代码]

vi 可以设置在大多数系统上使用键盘移动按钮,例如 光标左页面上主页删除 等。

<G> 移动到文件的最后一行。可以加一个表示要移动到的行的数字,<1><G> 移动到文件的首行。
<h> 向左移动一个字符,或光标左。可以加一个数字,<5><h> 向左移动 5 个位置。
<j> 向下移动一行,或光标下。可以加一个数字,<5><j> 向下移动 5 行。
<k> 向上移动一行,或光标上。可以加一个数字,5k 向上移动 5 行。
<l> 向前移动一个字符,或光标右。可以加一个数字,5l 向右移动 5 个位置。

<H> 移动到屏幕顶部的行。
<M> 移动到屏幕中间的行。
<L> 移动到屏幕底部的行。

<-> 移动到上一行的第一个非空格字符。可以加一个数字。
  • 10- 向上移动 10 行。
<+> 移动到下一行的第一个非空格字符。可以加一个数字。
  • 10+ 向下移动 10 行。
<CR> <+> 相同。
<|> 必须加一个数字。移动到当前行的指定列。
  • 10| 移动到第 10 列。

<w> 移动到下一个单词的开头,该单词可能在下一行。
<W> w 相同,但会考虑标点符号。
<e> 移动到当前单词的结尾,或者如果在单词之间或在单词的结尾,则移动到下一个单词的结尾。
<E> e 相同,但会考虑标点符号。
<b> 向后移动到当前单词的开头,或者如果在单词之间或在单词的开头,则移动到前一个单词的开头。
<B> b 相同,但会考虑标点符号。

<f>c 找到同一行上字符 c 的第一次出现。

可以使用 <;><,>(反向方向)重复此命令。

  • <3><f><x> 在 x 的第三次出现(如果存在)时向前移动。
<f><x><;><;> 相同。
<F>c f 相同,但反向。
<t>c 找到同一行上字符 c 的第一次出现之前的字符。
<T>c t 相同,但反向,将光标放置在字符 c 之后。

<0> 移动到当前行的开头。
<^> 移动到当前行的第一个非空格字符。
<$> 移动到当前行的结尾。

<Ctrl-F> 向前移动一页。
  • 5<Ctrl-F> 向前移动五页。
<Ctrl-B> 向后移动一页。
  • 5<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。 原始行被放入缓冲区,替换任何已经存在的文本。

每次使用删除命令时,被删除的文本都会被放入缓冲区,替换任何已经存在的文本。 缓冲区中的文本可以通过 pP 检索。

dd 删除当前行。 可以用数字开头。
  • 5dd 删除五行。 d5d 等同于 5dd
de 从光标下的字符删除到单词的末尾。 可以用数字开头。
  • 5de 删除五个单词。 d5e 等同于 5de
dE de 相同,但会考虑标点符号。
dw 从光标下的字符删除到下一个单词的开头。 可以用数字开头。
  • 5dw 删除五个单词。 d5w 等同于 5dw
dW dw 相同,但会考虑标点符号。
db 从光标左侧删除到前一个单词的开头。 可以用数字开头。
  • 5db 删除光标左侧的五个单词。
dB db 相同,但会考虑标点符号。
dtc 从光标位置删除到第一个字符的前面。
  • dta 删除到第一个字母 'a' 之前的所有文本,但不包括 'a'。
dfc 从光标位置删除到第一个字符(包括字符 c)。
  • dfa 删除到第一个字母 'a' 之前的所有文本,包括 'a'。
dG 删除当前行和所有到文件末尾的内容。
d/string 从光标删除到字符串,向前或向后。

D 从光标删除到行末。
d$ D 相同。
d^ 从光标左侧删除到行首。

x 删除光标下的字符。 可以用数字开头。
  • 5x 删除光标下的字符和接下来的 4 个字符。
  • xp 交换光标下的字符和它右边的字符。
X 删除光标左边的字符,但不会删除行末标记或下一行的任何字符。 可以用数字开头。
  • 5X 删除光标左边的 5 个字符。

更改命令都选择要删除的文本,文本的末尾用 $ 表示。 进入插入模式,新文本覆盖或扩展文本。 当按 <ESC> 键终止插入时,任何剩余的原始文本都会被删除。

在更改期间删除的文本被放入缓冲区,替换任何已经存在的文本。 缓冲区中的文本可以通过 pP 检索。

C 从光标位置更改到行末。 可以用数字开头。
  • 5C 更改五行,当前行和接下来的 4 行。

cM 通常与 dMi 相同,其中 M 是任何移动命令。
cc 更改当前行。 可以用数字开头。
  • 5cc 更改五行,当前行和接下来的 4 行。
ce 更改当前单词。 可以用数字开头。
  • 5ce 更改五个单词。 c5e 等同于 5ce
cw ce 完全相同。

此命令与通常的 vi 移动不一致:cwcedei 相同,但 dwi 还删除到下一个单词的所有空格。

ctc 从光标位置更改到第一个字符(不包括字符 c)。
  • cta 更改到第一个字母 'a' 之前的所有文本,但不包括 'a'。
cfc 从光标位置更改到第一个字符(包括字符 c)。
cG 从当前行的开头更改到文件末尾。

s 更改光标下的字符。 可以用数字开头。
  • 5s 更改 5 个字符,光标下的字符和接下来的 4 个字符。
S 更改整行。 与 ddO(大写字母 "O")相同。

剪切和粘贴

[编辑 | 编辑源代码]

yank 命令将文本复制到 vi 缓冲区。 文本还通过删除和更改命令复制到缓冲区。 putplace 命令从缓冲区检索文本。

yy 将当前行复制到缓冲区。 可以用数字开头。
  • 5yy 复制五行。
Y yy 相同。
yw 将从光标到下一个单词开头的文本复制到缓冲区。 可以用数字开头。
  • 5yw 复制五个单词。

p 如果缓冲区包含整行,则它们被插入到当前行的后面。 如果它只包含字符,则它们被插入到光标的后面。
P 如果缓冲区包含整行,则它们被插入到当前行的前面。 如果它只包含字符,则它们被插入到光标的前面。

搜索使用 正则表达式

/pattern/ 搜索字符串,它可能是正则表达式。 搜索从光标位置向下进行,在第一个匹配项处停止。 如果没有找到,它将从文件的开头继续到光标位置。 尾部的斜杠字符是可选的。
  • /abc/ 搜索 abc 的第一次出现。
/pattern/+ 转到包含搜索字符串的行后的行。
  • /pattern/+3 转到包含 abc 的行后的第三行。
/pattern/e 将光标停留在 pattern 匹配的字符串的最后一个字符上。* 通过在 e 后面添加 +num-num,你可以提供一个字符偏移量,指定光标停留在的位置。 例如:/foo/e+3 将使光标停留在 foo 下一次出现的 3 个字符之后。* 通过使用 b 而不是 e,你可以指定从匹配字符串的开头起的字符偏移量。
/\cpattern/ 进行不区分大小写的搜索。
?pattern? /pattern/ 相同,但向上搜索。 尾部的问号字符是可选的。
?pattern?- 转到包含搜索字符串的行上面的行。
  • ?abc?-3 转到包含 abc 的行上面的第三行。
<n> 重复上次搜索。
<N> 重复上次搜索,但方向相反。
<f>char 在当前行上向前搜索 char 的下一个出现位置。
<F>char 在当前行上向后搜索 char 的下一个出现位置。
<t>char 在当前行上向前搜索下一个出现的char,并将光标停留在char之前的字符上。
<T>char 在当前行上向后搜索下一个出现的char,并将光标停留在char之后的字符上。
<;> 重复上一次fF搜索。
<,> 与<;>类似,但方向相反。

搜索和替换

[编辑 | 编辑源代码]

搜索和替换使用正则表达式和Ex命令:substitute (简写为 :s),其语法类似于sed实用程序 - 这并不奇怪,sedExw: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
  • 字符.可以用来表示当前行,字符$可以用来表示最后一行。例如::.,$s/foo/bar/g 将从当前行到文件末尾的所有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><a> 用字母a标记当前行。
<'>m 移动到用字母标记的行。
  • <'><a> 移动到用a标记的行。

屏幕刷新

[编辑 | 编辑源代码]
<Ctrl-L> 刷新屏幕。
z<CR> 刷新屏幕,使当前行位于顶部。可以前面加上行号。
  • 35z 刷新屏幕,使第35行位于顶部。
/pattern/z 找到包含string第一个出现位置的行,然后刷新屏幕,使该行位于顶部。
z. 刷新屏幕,使当前行位于屏幕中央。可以前面加上行号,在这种情况下,该行将位于中央。zz 序列也具有相同的效果。
  • 35z. 刷新屏幕,使第35行位于中央。
/string/z. 找到包含string第一个出现位置的行,然后刷新屏幕,使该行位于中央。
z- 刷新屏幕,使当前行位于底部。可以前面加上行号,在这种情况下,该行将位于底部。
  • 35z- 刷新屏幕,使第35行位于底部。
/string/z- 找到包含string第一个出现位置的行,然后刷新屏幕,使该行位于底部。
<~> 更改光标下字符的大小写,并移动到下一个字符。可以前面加上数字,因此5~ 将更改 5 个字符的大小写。
<.> 重复上一次插入或删除操作。可以前面加上数字,dd 后面加上5. 将删除一行,然后删除另外 5 行。
<%> 将光标移动到匹配的括号,可以是 (), [] 或 {} 中的任何一个。
<Ctrl-G> 临时在屏幕底部显示状态行。
:f <Ctrl-G> 相同。
<J> 将下一行连接到当前行的末尾。可以前面加上数字。1J2JJ 具有相同的操作。
  • 3J 将三行连接在一起,当前行和接下来的两行。
<u> 撤销上一次更改。
<U> 撤销对当前行的所有更改。
<Ctrl-Z> vi置于后台,即控制权将返回到操作系统。在 UNIX 中,可以使用fgvi 会话返回到前台。

保存和退出

[编辑 | 编辑源代码]
<Z><Z> 保存并退出。它象征着睡眠,表示工作的结束。
:quit
:q
退出,但前提是没有进行过任何更改。
:quit!
:q!
不保存退出,无论是否进行过任何更改。
:write
:w
保存当前文件,但不退出。
  • {Vi/Ex|:write!}} myfile 保存到名为myfile 的文件中。
:write!filename
:w!filename
保存到该文件,覆盖任何现有内容。
:wq
:write|quit
保存并退出。
:exit
:xit
:x
保存并退出。
:exit!
:xit!
:x!
用于在view 中保存并退出。
:e filename 退出当前文件并开始编辑命名文件。
:e + filename 退出当前文件并开始编辑命名文件,并将光标置于文件末尾。
  • :e +5 myfile 退出当前文件并开始编辑myfile,从第 5 行开始。
:e! 关闭当前文件,丢弃所有未保存的更改,并重新打开该文件以进行编辑。
:e# 退出当前文件并开始编辑上一个文件。
:n 当命令行中引用了多个文件时,开始编辑下一个文件。
:n files 重置:n 的文件列表。当前文件将被关闭,列表中的第一个文件将被打开以进行编辑。
:r filename 读取文件,即插入文件。
  • :r myfile 在光标之后插入名为myfile 的文件。
  • :5r myfile 在第 5 行之后插入该文件。

vi 选项

[编辑 | 编辑源代码]

所有选项都是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
  • :! ls 执行 UNIX 的 ls 命令。
:sh 启动一个 shell。exit 返回到 vi 会话。
:vi 退出 最后一行模式 并返回到正常的 命令模式


ex 行命令

[edit | edit source]

这些命令编辑行,并具有以下语法:

  1. 没有行号,表示在当前行操作。
  2. 带有 %,表示对所有行操作。
  3. 一对行号,例如 '3,5',表示对第 3 行到第 5 行(包含)进行操作。任何一个数字都可以用 . 替换,表示当前行,或者用 $ 表示最后一行。因此 .,$ 表示从当前行到文件末尾,1,$ 表示与 % 相同。此外,可以使用简单的算术运算,所以 .+1 表示当前行的下一行,$-5 表示最后一行之前的 5 行。


co 复制,后面跟着要复制到的行的位置。
  • :co 5 复制当前行并将其放在第 5 行之后。
    • :1,3 co 4 复制第 1 行到第 3 行并将其放在第 4 行之后。
d 删除。
  • :d 删除当前行。
    • :.,.+5d 删除当前行和接下来的 5 行。
    • :%d 删除所有行。
m 移动,后面跟着要移动到的行的位置。
  • :m 10 移动当前行并将其放在第 10 行之后。
    • :1,3 m 4 移动第 1 行到第 3 行并将其放在第 4 行之后。

映射 / 重新映射 vi 命令

[edit | edit source]
:map 在 vi 命令模式下创建新的命令或覆盖现有的命令。
  • :map v i--<Ctrl-[> 新命令 v 会插入 -- 并返回到命令模式。 <Ctrl-[> 是转义字符,键入方式为 <CTRL-V><ESC>。
:map! 在命令模式和插入模式下创建新命令。
  • :map! ;r <Ctrl-[> 在插入模式下键入 ;r 会返回到命令模式。
[edit | edit source]


学习 vi 编辑器: 熟悉基本任务使你的工作更轻松高级任务细节Vi 克隆 (Vim基本导航模式提示和技巧程序员需要了解的有用信息增强 VimVim 在 Windows 上VimL 脚本语言, Vile, BB vi)vi 参考

华夏公益教科书