1. 普通模式
在shell中直接打vim filename就会进入普通模式。在这个状态,我们可以通过不同的按键对文件进行操作和切换到其它模式。按“:”可切换到命令模式,按i,o,a可进入编辑模。
1.1. 编辑
i
进入编辑模式。
I
在光标所在行的开头输入正文。
o
在当前位置下一行插入一空行,进入编辑模式,光标位于空行的最开头。
O
在当前位置上一行插入一空行,进入编辑模式,光标位于空行的最开头。
a
光标后移一个字符,进入编辑模式。
A
在光标所在行的末尾输入正文。
v
这入可视模式,可用高亮的色块选择内容,小写v表示字符选中命令。
V
这入可视模式,可用高亮的色块选择内容,大写V表示行选中命令。
x or DEL键
删除当前字符,删除内容保存在缓冲区。
xp
左右字符互换。
dd
删除当前行,删除内容保存在缓冲区。
ddp
上下两行的内容互换。
d$
删除当前光标至行尾的所有内容。
dG
删除从当前行至文件未尾的所有行。
y$
从当前位置复制到行尾;如果要粘贴到其他地方 p 就可以了
u
undo。
v
进地visual模式,移动光标可选择文本。
y
把当前行复制到缓冲区中。
nyy
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。
p
小写字母 p,将缓冲区的内容粘贴到光标的后面。
P
大写字母 P,将缓冲区的内容粘贴到光标的前面。
(如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前光标所在行的上一行或下一行。)
"ay
把当前行复制到a缓冲区。可用26个字母命名多个缓冲区。
"ap
把a缓冲区中的文本插入当前位置。
J
上下两行合并成一行。
.
英文句点的作用是重复执行上次执行的命令,如你按了"ap插入a缓冲区的内容,那你就可按"."来重复这个操作。
1.2. 光标移动
h,j,k,l
在vim中,除了可使用光标键在移动光标外,还有一种更方便的光标移动方式。就是使用h,j,k,l这四个键来移动光标。h控制光标左移,j控制光标下移,k控制光标上移,l控制光标右移。通过使用这四个字母键就可使我们的手不用移动即可控制光标的移动。刚开始使用可能会有些不习惯,但熟练使用后你会发觉你的输入速度提高不少,强烈建议喜欢vim的朋友使用。
$
光标移动到行尾。
gg
光标移致力到文档的开头。
G
光标移动到文档末尾。
Ctrl+b
在文件中向上移动一页(相当于 PageUp 键)。
Ctrl+f
在文件中向下移动一页(相当于 PageDown 键)。
H,L,M
H控制光标移动到当前屏幕头,L控制光标移动到当前屏幕尾,M控制光标移动到当前屏幕中间一行。
nH
将光标移到屏幕的第 n 行。
2H
将光标移到屏幕的第 2 行。
nL
将光标移到屏幕的倒数第 n 行。
3L
将光标移到屏幕的倒数第 3 行
w
在指定行内右移光标,到下一个字的开头。
e
在指定行内右移光标,到一个字的末尾。
b
在指定行内左移光标,到前一个字的开头。
0
数字0,左移光标,到本行的开头。
$
右移光标,到本行的末尾。
^
移动光标,到本行的第一个非空字符。
{,}
{控制光标上移一个段落,}控制光标下移一个段落
fx
往右移动到 x 字符上(注意:其中x是键入的字符)
Fx
往左移动到 x 字符上(注意:其中x是键入的字符)
tx
往右移动到 x 字符上(注意:其中x是键入的字符)
Tx
往左移动到 x 字符上(注意:其中x是键入的字符)
tx
往右移动到 x 字符上(注意:其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次
1.3. 删除命令
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /text 删除从文本中出现“text”中所指定字样的位置,一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容
x 删除光标所指向的当前字符
nx 删除光标所指向的前 n 个字符
3x 删除光标所指向的前 3 个字符
dw 删除光标右侧的字
ndw 删除光标右侧的 n 个字
3dw 删除光标右侧的 3 个字
db 删除光标左侧的字
ndb 删除光标左侧的 n 个字
5db 删除光标左侧的 5 个字
dd 删除光标所在行,并去除空隙
ndd 删除 n 行内容,并去除空隙
3dd 删除 3 行内容,并去除空隙
1.4.修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容
在命令模式下,同样可以删除正文中的内容。例如:
:d 删除光标所在行
:3d 删除 3 行
:.,$d 删除当前行至正文的末尾
:/str1/,/str2/d 删除从字符串 str1 到 str2 的所有行
2. 编辑模式
ESC 或 Ctrl+[
退出编辑状态。
3. 命令模式
由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态,在左下屏幕我们输入一些操作指令。
:ab string strings
例如 :ab usa United States of America ,
当你在文见里插入 usa 时 United States of America 就蹦出来了
:map keys new_seq
定义你当前 键盘命令
:q!
不保存退出vim。
:w
保存文档,但不退出vim。
:x
保存退出vim。
:! command
运行shell命令。
:e filename
编辑/打开一个文件
:s/emacs/vim
在当前行中把第一个emacs替换成vim。
:s/emacs/vim/g
把当前行中所有的emacs替换成vim。
:%s/emacs/vim/g
在全局范围内把emacs替换成vim。
:reg
列出缓冲区内容。
:set all
列出所有参数的配置情况。
:tabe
新建一个标签页。
:tabn or :tabp
切换到下一个\上一个标签页。
:close
关闭当前标签页。
:qa
关闭所有标签页退出。
:TOhtml
把当前文档直接生成html格式文档。
行号与文件
编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:
: n 将光标移到第 n 行
命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符
符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。例如:
:345 将光标移到第 345 行
:345w file 将第 345 行写入 file 文件
:3,5w file 将第 3 行至第 5 行写入 file 文件
:1,.w file 将第 1 行至当前行写入 file 文件
:.,$w file 将当前行至最后一行写入 file 文件
:.,.+5w file 从当前行开始将 6 行内容写入 file 文件
:1,$w file 将所有内容写入 file 文件,相当于 :w file 命令
在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:
:w 将编辑的内容写入原始文件,用来保存编辑的中间结果
:wq 将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)
:w file 将编辑的内容写入 file 文件,保持原有文件的内容不变
:a,bw file 将第 a 行至第 b 行的内容写入 file 文件
:r file 读取 file 文件的内容,插入当前光标所在行的后面
:e file 编辑新文件 file 代替原有内容
:f file 将当前文件重命名为 file
:f 打印当前文件名称和状态,如文件的行数、光标所在的行号等 恢复文件
vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi 在
正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:
:recover 恢复文件
也可以在启动 vi 时利用 -r 选项。 选项设置
为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:
:set option 设置选项 option
常见的功能选项包括:
autoindent 设置该选项,则正文自动缩进
ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别
number 设置该选项,则显示正文行号
ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置
tabstop 设置按 Tab 键跳过的空格数。例如 :set tabstop=n,n 默认值为 8
mk 将选项保存在当前目录的 .exrc 文件中 shell 切换
在编辑正文时,利用 vi 命令模式下提供的 shell 切换命令,无须退出 vi 即可执行 Linux 命令,十分方便。语法格式为:
:! command 执行完 shell 命令 command 后回到 vi
另外,在编辑模式下,键入 K ,可命令 vi 查找光标所在单词的手册页,相当于运行 man命令。 vim 和 gvim 的高级特色
Vim 代表 Vi IMproved,如同其名称所暗示的那样,Vim 作为标准 UNIX 系统 vi 编辑器的提高版而存在。 Vim 除提供和 vi 编辑器一样强大的功能外,还提供有多级恢复、命令行历史以及命令及文件名补全等功能。
gvim 是 vi 的 X Window 版本,该版本支持鼠标选中,一些高级光标移动功能,并且带有菜单和工具按钮。
4. 搜索
要自当前光标位置向上搜索,请使用以下命令:
/pattern Enter
其中,pattern 表示要搜索的特定字符序列。
要自当前光标位置向下搜索,请使用以下命令:
?pattern Enter
按下 Enter 键后,vi 将搜索指定的 pattern,并将光标定位在 pattern 的第一个字符处。例如,要向上搜索 place 一词,请键入:
/place Enter
如果 vi 找到了 place,它将把光标定位在 p 处。要搜索 place 的其他匹配,请按 n 或 N:
n,继续朝同一方向搜索 place。
N,反方向进行搜索。
如果 vi 未找到指定的 pattern,光标位置将不变,屏幕底部显示以下消息:
Pattern: 未找到
搜索特殊匹配
在上面的示例中,vi 查找到包含 place 的任何序列,其中包括 displace、placement 和 replaced。
要查找单个的 place,请键入该单词,并在其前后各加一个空格:
/ place Enter
要查找仅出现在行首的 place,请在该单词前加一个插字符号 (^):
/^place Enter
要查找仅出现在行尾的 place,请在该单词后加一个货币符号 ($):
/place$ Enter
使用 ^
要逐字搜索这种带有插字符号 (^) 或货币符号 ($) 的字符,请在字符前加一个反斜线 (\)。反斜线命令 vi 搜索特殊字符。
使用 $
特殊字符是指在 vi 中具有特殊功能的字符(例如 ^、$、*、/ 和 .)。例如,$ 通常表示“转至行尾”,但是,如果 $ 前紧跟一个 \,则 $ 只是一个普通的字符。
使用 \
例如,/(No \$ money) 向上搜索字符序列 (No $ money)。紧跟在 $ 之前的转义字符 (\) 命令 vi 逐字搜索货币符号。
命令模式下给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个“/”之间;如果希望反向搜索,则将字符串放在两个“?”之间。例如:
:/str/ 正向搜索,将光标移到下一个包含字符串 str 的行
:?str? 反向搜索,将光标移到上一个包含字符串 str 的行
:/str/w file 正向搜索,并将第一个包含字符串 str 的行写入 file 文件
:/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写入 file 文件
5.替换
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符
s 用输入的正文替换光标所指向的字符
ns 用输入的正文替换光标右侧 n 个字符
cw 用输入的正文替换光标右侧的字
ncw 用输入的正文替换光标右侧的 n 个字
cb 用输入的正文替换光标左侧的字
ncb 用输入的正文替换光标左侧的 n 个字
cd 用输入的正文替换光标的所在行
ncd 用输入的正文替换光标下面的 n 行
c$ 用输入的正文替换从光标开始到本行末尾的所有字符
c0 用输入的正文替换从本行开头到光标的所有字符
vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串
将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多
个字符。例如:
rc 用 c 替换光标所指向的当前字符
nrc 用 c 替换光标所指向的前 n 个字符
5rc 用 c 替换光标所指向的前 5 个字符