一、移动光标
字符级
| 命令 | 功能 |
|---|---|
| h | 向 左 移动一个字符单位 |
| l | 向 右 移动一个字符单位 |
| j | 向 下 移动一个字符单位 |
| k | 向 上 移动一个字符单位 |
单词级
| 命令 | 功能 |
|---|---|
| w/W | 向 右 移动到下一单词开头 |
| e/E | 向 右 移动到单词结尾 |
| b/B | 向 左 移动到单词开头 |
PS:所谓“单词”,是按照英文的书写和使用习惯来定义的。用在中文上,一般就会以标点符号和空格作为“单词”的界限。所以常常是一句话一句话地跳转。
块级
| 命令 | 功能 |
|---|---|
| 0 | 移动到当前行的第一个字符 |
| ^ | 移动到当前行第一个非空白字符 |
| $ | 移动到当前行行尾 |
| + | 移动到下一行的首字母 |
| - | 移动到上一行的首字母 |
| gg | 移动到文档第一行 |
| G | 移动到文档最后一行 |
| H | 移动到当前屏幕的第一行 |
| M | 移动到当前屏幕的中间一行 |
| L | 移动到当前屏幕的最后一行 |
| :<n> 或 <n>gg | 跳转到第 n 行 |
| :+<n> 或 <n>j | 从当前位置向下跳 n 行 |
| :-<n> 或 <n>k | 从当前位置向上跳 n 行 |
滚动屏幕
| 命令 | 功能 |
|---|---|
| Ctrl-d | 向下滚动半页 |
| Ctrl-u | 向上滚动半页 |
| Ctrl-f | 向下移滚动一页 |
| Ctrl-b | 向上滚动一页 |
| z<Enter> | 将当前行滚动到屏幕顶部 |
| z. | 将当前行滚动到屏幕中间 |
| z- | 将当前行滚动到屏幕底部 |
PS:绝大部分命令前都可以加一个数字 n ,通常表示对其后的命令连续执行 n 次。所以 3j 可以表示向下移动 3 个字符单位(即下移 3 行)。3l 表示向右移动 3 个字符单位。相当于连续执行了 l 命令 3 次。
而 9z. 则表示光标移动到第 9 行的同时,滚动屏幕并使得第 9 行位于屏幕中间。(这个 9 的含义不同于 3l 命令中的 3)
前面带冒号的命令(如 :+<n>,命令内容会显示在底部)是需要手动输入回车后才执行的。而不带冒号的命令(如 <n>gg)需要在键盘上不间断地按下,之后命令会自动执行。
光标移动示例
二、文档操作
简单编辑命令
插入
| 命令 | 功能 |
|---|---|
| i | 当前字符前插入 |
| a | 当前字符后插入 |
| I | 行首插入 |
| A | 行尾插入 |
| o | 在下一行插入 |
| O | 在上一行插入 |
PS:以上命令会使 vim 进入 insert 模式(即编辑模式),此时输入的任何命令都会作为字符插入到文档中。
按 esc 键可退出 insert 模式。
删除(并将删除的内容保存至 vim 剪贴板)
| 命令 | 功能 |
|---|---|
| x | 删除当前字符(等于 insert 模式下的 Delete) |
| X | 删除前一个字符(等于 insert 模式下的 Backspace) |
| dd | 删除当前行 |
| d<x> | 删除指定内容 |
| D | 删除当前光标位置到行尾的所有内容。等于 d$
|
| cc | 替换整行内容。即将整行内容删除并进入 insert 模式 |
| c<x> | 删除指定内容后,进入 insert 模式。相当于 d<x>a
|
| C | 替换当前光标位置到行尾的所有内容。等于 c$
|
<x> 部分用于指定删除的范围。
如 j 表示将光标向下移动一个字符单位(即下移一行),则 dj 表示删除当前行和下一行的内容。G 表示将光标移动到文档末尾,则在光标定位在文档首行时,使用 dG 命令可以清空整个文档的内容。
PS:使用以上命令删除的内容会自动保存到 vim 的剪贴板中,即所谓“删除”实际上是“剪切”,使用 p 命令即可粘贴删除的内容。而且该剪贴板限于 vim 内部,不是系统剪贴板。
复制与粘贴
| 命令 | 功能 |
|---|---|
| yy | 复制当前内容到 vim 剪贴板 |
| y<x> | 复制指定内容到 vim 剪贴板 |
| p | 在当前位置后粘贴 |
| P | 在当前位置前粘贴 |
| J | 将当前行与下一行内容合并为一行 |
y<x> 命令中的 <x> 同样用于指定复制的范围。
如 4j 表示将光标下移 4 行,则 y4j 表示将当前行及其后 4 行内容复制到 vim 剪贴板。8gg 表示将光标定位至第 8 行,则 y8gg 表示复制当前行到第 8 行的所有内容。
当 vim 剪贴板中的内容为整行时,则粘贴命令(p/P)执行时,也会变成在当前行的前(后)一行粘贴。
查找
行内查找
| 命令 | 功能 |
|---|---|
| f<x> | 当前行向行尾方向查找并定位到字符 x |
| F<x> | 当前行向行首方向查找并定位到字符 x |
| t<x> | 当前行向行尾方向查找并定位到字符 x 之前 |
| T<x> | 当前行向行首方向查找并定位到字符 x 之后 |
| ; | 继续向当前方向查找下一个字符 |
| , | 向当前方向的相反方向查找下一个字符 |
文档内查找
| 命令 | 功能 |
|---|---|
| * | 向后查找光标当前所在单词 |
| # | 向前查找光标当前所在单词 |
| /<pattern> | 向后查找指定字符串或模式 |
| ?<pattern> | 向前查找指定字符串或模式 |
| n | 继续查找下一个(依照原方向继续查找) |
| N | 继续查找上一个(依照原方向进行反向查找) |
PS:vim 中可使用 % 对括号 ()[]{} 进行匹配查找,当光标位于其中一个符合上时,按下 % 会跳转到与之匹配的另外一个符合上。
替换
| 命令 | 功能 |
|---|---|
| r<x> | 将当前字符替换为字符 x |
| s | 删除当前字符并进入 insert 模式 |
| R | 进入 replace 模式,逐字对当前字符进行替换操作,可以移动光标定位需要替换的字符。直到按下 ESC 键退出该模式 |
| ~ | 对当前字符进行大小写切换(即大写转小写,小写转大写) |
| gu<x> | 将指定的文本转换为小写 |
| gU<x> | 将指定的文本转换为大写 |
| g~<x> | 将指定文本进行大小写切换 |
| :<n1>,<n2>s/<pattern>/<replace> | 以某个模式(pattern)检索整个文档,并将第 n1 行到第 n2 行中的匹配项替换为指定内容(replace) |
| :%s/<pattern>/<replace> | 以某个模式(pattern)检索整个文档并将匹配项替换为指定内容(replace)。等同于 ``:1,$s/<pattern>/<replace> |
PS::%s/<pattern>/<replace> 命令中的 <pattern> 可以是正则表达式,且该命令只替换每行中的第一个匹配项。如需要全局匹配,可以使用 :%s/<pattern>/<replace>/g 命令
before replace
:%s/s.t/SET
:%s/s.t/SET/g
撤销、重做
| 命令 | 功能 |
|---|---|
| . | 重复执行上一次的命令 |
| u | 撤销 |
| U | 撤销对当前行的所有操作 |
| Ctrl-r | 重做 |
打开、关闭文档
| 命令 | 功能 |
|---|---|
| :e <filename> | 打开名为 filename 的文件,如文件不存在则创建 |
| :Ex | 在 vim 中打开目录树,光标选定后回车打开对应文件(- 命令进入上级目录) |
| :w | 保存当前文件 |
| :wa | 保存全部文件 |
| :wq 或 ZZ | 保存文件并退出 vim |
| :q! 或 ZQ | 强制退出 vim ,不保存文件 |
| :r <filename> | 读入另一个文档(filename)的数据,并将其内容附加到当前文档光标所在行的后面 |
| :saveas <new_filename> | 文件另存为 |
| :w <new_name> | 另存为一份名为 new_name 的副本并继续编辑原文件 |
| :<n1>,<n2>w <new_name> | 将 n1 行到 n2 行的所有内容保存到名为 new_name 的新文档中 |
Buffer
Buffer(缓冲区)指 vim 中打开的文件所占的内存空间,当未写入磁盘时,所有的修改都发生在内存中。vim 打开过的每个文件都会放到一个 Buffer 中,可以随意切换已打开的 Buffer。
| 命令 | 功能 |
|---|---|
| :ls 或 :buffers | 查看 buffer 列表 |
| :bn | 打开缓冲区中下一个文件 |
| :bp | 打开缓冲区中上一个文件 |
| :b<n> | 打开缓冲区中第 n 个文件 |
| :bdelete<n> | 删除需要关闭的缓冲区文件 |
before :bn
after :bn
三、其他技巧
缩进
-
>>向右缩进当前行 -
<<向左缩进当前行 -
4>>向右缩进当前行的同时,缩进当前行下面的 3 行内容 -
>G向右缩进当前行到文档末尾的所有内容
自动排版
-
==自动排版当前行 -
gg=G自动排版整个文档 -
<n>==对从当前行开始的 n 行进行自动排版 -
=<n>j对当前行以及下面的 n 行进行自动排版
执行 shell 命令
:!<command> 可以执行相应的 shell 命令,命令执行完成后按 Enter 回到 vim 界面。
如使用 :1,9!sort 命令可以将当前文件中第 1 行到第 9 行的内容重新排序。:r !<command> 可以将相应 shell 命令执行后的输出读取到当前文件中。
如使用 :r !date 命令可以将当前详细的时间日期插入到 vim 编辑的文件中。
四、分屏与标签页
分屏与标签页
窗口分屏
- 分屏方式
-
:split或:sp或Ctrl-w s:上下分屏 -
:vsplit或:vs或 `Ctrl-w v`` :左右分屏 -
:diffsplit或:diffs:diff 模式打开一个分屏,后面可以加<filename>
- 窗口跳转
-
Ctrl-w w:**下一个窗口 -
Ctrl-w j:**下方窗口 -
Ctrl-w k:**上方窗口 -
Ctrl-w h:**左侧窗口 -
Ctrl-w l:**右侧窗口
- 屏幕缩放
-
Ctrl-w =:平均窗口尺寸 -
Ctrl-w +:增加当前窗口高度 -
Ctrl-w -:缩减窗口高度 -
Ctrl-w _:最大窗口高度 -
Ctrl-w >:增加窗口宽度 -
Ctrl-w <:缩减窗口宽度 -
Ctrl-w |:最大窗口宽度
标签页
- 创建标签页
:tabnew或:tabedit或:tabe:打开新标签页
该命令包括上面的分屏命令(:sp或:vs等)后面都可以跟<filename>选项,用以在新标签页(或窗口)中打开指定文件 - 切换标签页
-
gt或:tabnext或:tabn:切换到下一个标签页(最后一个会循环到第一个) -
gT或:tabprevious或:tabp:切换到上一个标签页 -
:tabrewind或:tabr或:tabfir:切换到第一个标签页 -
:tablast或:tabl:切换到最后一个标签页
- 关闭标签页
-
:tabclose或:tabc:关闭当前标签页 -
:-tabc:关闭上一个标签页 -
:+tabc:关闭下一个标签页 -
:tabonly或:tabo:关闭其他标签页
附录:vim 模式介绍
大致上 vim 分为三种模式,分别是命令模式(Command mode),编辑模式(Insert mode)和底线命令模式(Last line mode)。
1. 命令模式
vim 启动即进入命令模式。此时敲击键盘动作会被识别为命令,而不是作为字符插入到文档中。如:
-
i切换到输入模式(在当前字符前插入) -
:切换到底线命令模式,此时输入的命令显示在最底下一行, : 符号后面
命令模式下只有一些最基本的命令,而底线命令模式下拥有更多的命令。
2. 编辑模式
在命令模式下键入 i (或 a、e 等)即进入编辑模式
在编辑模式下,可以像在记事本中那样,使用键盘输入或修改文档内容。注意编辑完成时,可使用 ESC 键退出编辑模式,回到命令模式。
3. 底线命令模式
在命令模式下按下 : 即进入底线命令模式
该模式下可以输入单个或多个字符的命令,以完成比命令模式下更复杂的操作(如 :wq 保存文件并退出)
按 ESC 键可随时退出底线命令模式。
参考书籍
vimtutor
Learning The Vi And Vim Editors, 7th Edition
作者:rollingstarky
链接:https://www.jianshu.com/p/af14f639dadb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。