编辑器—— Vi 使用详解
作者: zccst
对于用惯了 Microsoft 的 office 系列产品的用户,在第一次使用 Linux 下的 vi 编辑器时可能会感觉到一些困难,甚至想放弃,比如一个复制 + 粘贴就让你云里雾里,不知如何下手,我曾经就是。因为有大量的命令需要记忆,给人的感觉是 Linux 下把简单的问题复杂化了,正好跟人类的常规思维背道而驰。
但是,使用过一段时间之后,这种排斥感变小了,开始觉得也很好用,原因很简单,因为记住了那些指令,使用变得原越来越熟练。然而,面对如此繁杂的命令,一下子全部记住确实不是一夕之功,所以本文就列出 vi 编辑器常用命令,以便记忆和查询。
应该指出,熟练使用编辑器 vi 不是目的,只是手段。与使用 Word 的目的一样,差别仅仅是实现的方式而已(当然 Vi 一般用来编辑配置文件、脚本和程序),所以大可不必太较真。
Vi 有 3 种模式,分别是命令行模式、文本输入模式、末行模式。
(1) 命令行模式 (用于输入命令)
用户在使用 VI 编辑文件时,最初进入的模式就是命令行模式,是执行 vi 后的缺省模式,此时键盘输入当作命令,命令有大小写之区分。在该模式中可以通过上下左右移动光标来进行“删除字符”或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。
(2) 文本输入模式 (用于文本输入)
只有在该模式下,用户才能进行文字编辑输入。用户输入的任何字符都被 vi 当做文件内容保存起来,并将其显示在屏幕上。在命令行模式下输入字母‘ i ’、‘ a ’、‘ o ’、‘ s ’、‘ c ’或‘ r ’,就进入文本输入模式。用户按 [ESC] 键回到命令行模式。
(3) 末行模式 (用于特殊任务)
在该模式下,光标位于屏幕的低行。在命令行模式下输入“:”就进入末行模式。在末行模式下,用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。命令有大小写之分。
需要注意的是:一般而言,操作结束后,使文本处在命令行模式。
以下是命令具体功能:(仍按 3 中模式分别列出)
一、命令行模式下执行的操作
1 ,光标移动与定位命令
命令 |
功能 |
h |
方向键,向左移动光标一个字符的位置,相当于键 “ ← ” |
j |
方向键,向下移动光标到下一行的位置,相当于键 “ ↓ ” |
k |
方向键,向上移动光标到上一行的位置,相当于键 “ ↑ ” |
l |
方向键,向右移动光标一个字符的位置,相当于键 “ → ” |
w,W |
跳至后一个字的开头 (W 忽略标点 ) |
b,B |
跳至前一个字的开头( B 忽略标点) |
0 ( 数字 0 ) $ |
光标移至行首 光标移至行尾 |
e |
移动到后一个字的末尾 |
^ |
至本行第一个非空字符 |
H nH |
移动到当前窗口的第一列 将光标移到屏幕的第 n 行 |
M |
移动到当前窗口的中间列
|
L nL |
移动到视窗的最后一列 将光标移到屏幕的倒数第 n 行 |
) |
光标所在位置到下个句子的第一个字母 |
( |
光标所在位置到该句子的第一个字母 |
} |
光标所在位置到该段落的最后一个字母 |
{ |
光标所在位置到该段落的第一个字母 |
CTRL-x |
CTRL-d 向下半页 CTRL-f 向下一页 CTRL-u 向上半页 CTRL-b 向上一页 |
n- |
减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以 上 n 行 |
n+ |
加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下 n 行 |
2 ,编辑命令(删除,修改,复制,粘贴,剪切,撤销)
命令 |
功能 |
[N]x ( X ) |
(Expurgate) 删除从光标位置开始的连续 N 个字符(并复制到编辑缓冲区) X -----从光标位置向前删除 |
s S ( 大写 ) |
删除光标所在字符,并进入输入模式 删除光标所在的行,并进入输入模式 |
D |
从光标位置开始删除到行尾 |
[N]dd |
(Delete) 删除从光标位置开始的连续 N 行(并复制到编辑缓冲区) |
|
d 与光标移动命令的组合 |
r |
修改光标所在的字符, r 后接着要修改的字符。如, rc 可以用字符“ c ” 替换光标所指向的当前字符 |
R |
进入替换状态,新增内容会覆盖原先内容,直到按 [ESC] 回到命令模式下为止 |
cc |
修改光标所在行 |
C |
修改从光标位置到该行末尾的内容 |
|
c 与光标移动命令的组合 |
yy |
复制当前行到内存缓冲区 |
[N]yy |
(Yank) 复制从光标位置开始的连续 N 行到编辑缓冲区 |
P ( 小写 ) P ( 大写 ) |
(Put) 从编辑缓冲区复制文本到当前光标位置(即粘贴) 将缓冲区的内容粘贴到光标的前面 |
u |
(Undo) 取消上一次操作(即恢复功能) |
注:在末行模式下实现移动 :n1,n2 m n3 : 把 n1 到 n2 行内容搬到第 n3 行后
3 、搜索字符串
/pattern 移至下一个包含 pattern 的行
?pattern 移至上一个包含 pattern 的行
/ 往下重复查找
? 往上重复查找
n 在同一方向重复查找
N 在相反方向重复查找
/pattern/+n 移至下一个 pattern 所在行后的第 n 行
?pattern?-n 移至上一个 Pattern 所在行前的第 n 行
注: *. $ ^ [ ] { } / / 包含在查找字符串中,要用转义字符 (/ )
查找
?从光标向文件头搜索
/ 从光标向文件尾搜索
在找到一个匹配模式后搜索下一个时,使用命令‘ n ’即可;如果向下,用‘ n ’,如果向上,用‘ N ’
二、文本输入模式下执行的操作
命令 |
功能 |
a(A) |
(Append) 进入编辑状态,从当前光标后一个位置开始插入键盘输入的字符 A -----在行尾开始插入 (注:适合 Ubuntu 编辑文本最后一行使用) |
I(I) |
(Insert) 进入编辑状态,从当前光标前一个位置开始插入键盘输入的字符 I -----从光标所在列的第一个非空白字元前面开始插入 |
o(O) |
(Open) 进入编辑状态,并插入一新行,光标移到该新行的行首,以后键盘输入的字符将插入到光标位置 O -----在光标所在列上方新增一列并进入输入模式 |
s |
先删除光标所在的一个字符,然后在光标处插入 |
ESC |
进入命令状态 |
三、末行模式下执行的操作
1 ,文件命令
命令 |
功能 |
:q |
(Quit) 退出(若文件被修改了而没有保存,则此命令无效) |
:q! |
强制退出,且不保存修改过的部分 ( 与 :x! 对应 ) |
:w |
(Write) 保存文件,但不退出 |
:w! |
强制保存文件,但不退出 |
:wq |
保存退出 |
:wq! |
强制保存退出 |
:x |
(Exit) 保存文件并退出 ( :x = :wq = zz) |
:x! |
强制保存文件并退出 ( :x! = :wq!) |
:w File |
另存为 File 给出的文件名,不退出 |
:w! File |
强制另存为 File 给出的文件名,不退出 |
:r File |
(Read) 读入 File 指定的文件内容插入到光标位置 |
2 ,设置行号
:set number 设置显示行号
:set nonumber 取消显示行号
3 ,定位行数
: n ( 行数 ) 将光标移到第 n 行
4 ,字符串的替换
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
5 ,其他
编辑多个文件
vi file1 file2 …
:n 编辑下一个文件
:e filename 编辑指定文件
注:经过此番整理,结合最近一段时间的使用,发现 vi 编辑器并不像想象中的那么难。