Vim 教程
简介
Vim 是一款历史悠久的、高度可配置的文本编辑器。它以难以理解而出名,但一旦掌握,它可以极大提高处理文本时的生产力和效率。
Vim 模式
1. 常规模式
在普通模式下可以输入所有普通编辑器命令。启动编辑器时默认就处于此模式(除非设置了“插入模式”选项)。
以下是一些可以在常规模式下使用到的基本命令:
- 移动:
- 箭头键(上、下、左、右)
- h(左)
- l(右)
- j(下)
- k(上)
- 插入:
- i(在光标处插入文本)
- a(在光标后插入文本)
- A(在行尾开始插入文本)
- I(在行首插入文本)
- o (在当前行后插入一个新行)
- O(在当前行前插入一个新行)
- 删除:
- x(删除光标处的文本)
- X(删除光标处的文本并向左移动)
- 修改:
- r(替换光标处的文本)
- R(使用寄存器替换光标处的文本)
- 复制和粘贴:
- y(将文本剪切到剪贴板)
- p(在当前行后粘贴剪贴板中的文本)
- P(在当前行前粘贴剪贴板中的文本)
- 其他:
- .(重复上一个命令)
- $(移至行尾)
- ^(移至行首)
这些只是您可以在常规模式下使用的大量命令的一些示例。务必练习并尝试使用不同的命令才能熟练使用 Vim。
2. 可视模式
按“v”键将进入可视模式,可以在其中以可视方式选择文本。还可以使用“V”键选择一行中的文本,或使用“<”和“>”键选择块中的文本。
以下是在可视模式中可以使用的一些基本命令:
- 选择:
- 使用箭头键(向上、向下、向左、向右)选择文本。
- 使用“h”(左)、“l”(右)、“j”(下)和“k”(上)选择文本。
- 使用“V”(选择行)或“v”(选择字符)选择文本。
- 删除:
- 使用“x”(删除选定的文本)或“X”(删除选定的文本并向左移动)。
- 复制和粘贴:
- 使用“y”(将选定的文本抓取到剪贴板)或“Y”(将整行抓取到剪贴板)。
- 使用“p”(在当前行之后粘贴剪贴板中的文本)或“P”(在当前行之前粘贴剪贴板中的文本)。
- 其他:
- 使用“.”(重复上一个命令)。
- 使用“G”(移至文件末尾)或“gg”(移至文件开头)。
- 使用“^”(移至行首)或“%”(更改后重复上一个命令)。
在可视模式下,您只能选择屏幕上可见的文本。如果要选择屏幕上不可见的文本,则需要先使用箭头键或“h”、“l”、“j”和“k”键将光标移动到该位置。
3. 选择模式
选择模式 看起来像可视模式,但可用的命令非常不同。它类似于 Microsoft Windows 中的选择模式。 当设置“showmode”选项时,在最后一行会显示“– 选择 –”。
进入选择模式:
- 使用鼠标选择区域,且“selectmode”包含“鼠标”。 “鼠标”还必须包含当前模式的标志。
- 使用不可打印的移动命令,同时按下 Shift 键,且“selectmode”包含“键”。例如:
和 。“keymodel”还必须包含“startsel”。 - 使用“v”、“V”或 CTRL-V 命令,且“selectmode”包含“cmd”。
- 在普通模式下使用“gh”、“gH”或“g_CTRL-H”命令。
- 从可视化模式,按下 CTRL-G。
以下是可以用于选择模式的一些基本命令:
-
可打印字符、
和 会导致删除选定内容,Vim 进入插入模式。插入所键入字符。 -
不可打印的移动命令,同时按下 Shift 键,会扩展所选内容。“keymodel”必须包含“startsel”。
-
不可打印的移动命令,未按下 Shift 键,会停止选择模式。“keymodel”必须包含“stopsel”。
-
ESC 会停止选择模式。
-
CTRL-O 在一个命令的持续时间内切换至可视化模式。v_CTRL-O
-
CTRL-G 切换至可视化模式。
否则,就像在可视化模式中一样处理键入的字符。
在选择模式中使用运算符且选择是分行的,则会对选定的行执行操作,但类似于对字符执行操作。例如,删除整行后,稍后可以将其粘贴到行的中间。
4. 插入模式
按“i”键进入插入模式,在插入模式中可以添加新文本或修改文本。
以下是一些可以在插入模式下使用到的基本命令:
- 插入:
- 键入任何字符以插入新文本。
- 使用箭头键(上、下、左、右)移动光标并在特定位置插入文本。
- 使用“a”键在光标后插入文本。
- 使用“A”键在行尾开始插入文本。
- 使用“I”键在行首插入文本。
- 使用“o”键在当前行后插入一个新行。
- 使用“O”键在当前行前插入一个新行。
- 其他:
- 使用“Esc”键退出插入模式并返回常规模式。
- 在插入模式下,您只能在光标位置插入文本。如果您想在其他位置插入文本,则首先需要使用箭头键或“h”、“l”、“j”和“k”键将光标移至该位置。
- 在插入模式下,Vim 不会允许您键入任何可能修改文本的命令。如果您想执行修改文本的命令(例如删除字符或替换单词),则需要先按“Esc”键退出插入模式。
5. 替换模式
替换模式可以将现有文本替换为新文本。要进入替换模式,请按“r”键。在此模式中,可以键入新文本以替换光标位置的现有文本。
- 在替换模式中,只能替换光标位置的文本。如果想替换其他位置的文本,则需要先使用箭头键或“h”、“l”、“j”和“k”键将光标移动到该位置。
- 在替换模式中,Vim 不会允许您键入任何会修改文本的命令。如果要执行修改文本的命令,例如删除字符或替换单词,则需要先按“Esc”键退出替换模式。
6. 命令模式
按“:”键将进入命令模式,可以在其中输入 Vim 命令。在此模式中,可以使用诸如 :w、:q 和 :e 等命令。
以下是在命令模式中可以使用的一些基本命令:
:w
- 在不退出 Vim 的情况下写入或保存文件。:q
- 退出 Vim。如果有未保存的更改,系统会提示您放弃它们。:q!
:不保存任何更改而退出 Vim:qa!
- 退出所有窗口并放弃所有未保存的更改。:e filename
- 打开一个新文件进行编辑。:r filename
- 在光标位置读取或插入文件的内容。/pattern
- 在文件中搜索模式。按 n 移动到模式的下一个出现处,按 N 移动到上一个出现处。:set paste
- 进入粘贴模式,以防止从 Vim 外部粘贴文本时自动缩进。:set number
或:set nu
- 在左页边距显示行号。:set spell
- 为当前文件启用拼写检查。:set nospell
- 禁用拼写检查。:s/old/new/g
- 将当前行中的所有“old”替换为“new”。使用计数,例如“:s/old/new/g 3”,以应用替换三次。:g/pattern/d
- 删除所有与模式匹配的行。
7. Ex 模式
按“Q”键将进入 ex 模式,可以在 ex 模式中执行 Vim 命令,命令执行后不会离开命令模式,可以继续输入命令并执行。
这些是 Vim 中最常见的模式,但根据你的需要,你还可以使用其他几种模式。了解不同的模式及其使用时机对于熟练使用 Vim 非常重要。
模式切换
常规 | 可视 | 选择 | 插入 | 替换 | 命令 | Ex | |
---|---|---|---|---|---|---|---|
常规 | v V ^V | *4 |
*1 |
R gR | : / ? ~ | Q | |
可视 | *2 |
^G | c C | : | |||
选择 | *5 |
^O ^G | *6 |
||||
插入 | <Esc> | <Insert> | |||||
替换 | <Esc> | <Insert> | |||||
命令 | *3 |
:开始 | |||||
Ex | :vi |
-
*1
通过给定命令“i”、“I”、“a”、“A”、“o”、“O”、“c”、“C”、“s”或 S 来从正常模式转到插入模式。 -
*2
通过给定一个非移动命令来从可视模式转到正常模式,该命令会导致执行命令,或按 <Esc> 、“v”、“V”或“CTRL-V”,它只是在没有副作用的情况下停止可视模式。 -
*3
通过以下方式从命令行模式转到正常模式:- 按 <CR> 或 <NL>,这将导致执行已输入的命令。
- 删除整行(例如使用 CTRL-U)并给出最终的 <BS>。
- 按 CTRL-C 或 <Esc>,这将在不执行命令的情况下退出命令行。 在最后一种情况下,<Esc> 可能是用“wildchar”选项定义的字符,在这种情况下它将启动命令行完成。您可以忽略它并再次键入 <Esc>。{Vi:按 <Esc> 时会执行命令行。这对大多数人来说都是意外的;因此在 Vim 中对其进行了更改。但是当 <Esc> 是映射的一部分时,将执行命令行。如果您键入 <Esc> 时也想要 Vi 行为,请使用:“:cmap ^V<Esc> ^V^M”}
-
*4
通过以下方式从正常模式转到选择模式:- 当“selectmode”包含“mouse”时使用鼠标选择文本
- 在按住 Shift 键的同时使用不可打印命令移动光标,而“selectmode”选项包含“key”
- 当“selectmode”包含“cmd”时使用“v”、“V”或“CTRL-V”
- 使用“gh”、“gH”或“g CTRL-H” |g_CTRL-H|
-
*5
通过使用不可打印命令移动光标,而无需按住 Shift 键,从选择模式转到正常模式。 -
*6
通过键入可打印字符从选择模式转到插入模式。该选择被删除,并插入该字符。
导航
在文件中移动
h
:光标向左移动l
:光标向右移动j
:光标向下移动k
:光标向上移动0
(零):将光标移到行首^
:将光标移到该行的第一个非空白字符$
:将光标移到该行的末尾g_
:将光标移到该行的最后一个非空白字符G
:将光标移到文件的最后一行gg
:将光标移到文件的首行<C-d>
(Control+D):向下滚动半屏<C-u>
(Control+U):向上滚动半屏<C-f>
(Control+F):向前移动整个屏幕<C-b>
(Control+B):向后移动整个屏幕H
:将光标移到屏幕顶部M
:将光标移到屏幕中间L
:将光标移到屏幕底部
跳转到特定行或单词
10G
|10gg
|:10
:跳转到第 10 行*
:搜索光标下的单词#
:向后搜索光标下的单词
在搜索结果中移动
/foo
: 查找"foo"n
:将光标移到下一个匹配项(向前)N
:将光标移到上一个匹配项(向后)
文本编辑
插入和追加文本
i
:在光标前插入文本I
:在行的开头插入文本a
:在光标后追加文本A
:在行的末尾追加文本
编辑行
J
:将当前行与下一行连接cc
|S
:更改整行内容(删除并进入插入模式)cw
:更改光标下的单词(删除并进入插入模式)C
:从光标位置更改剩余行(删除并进入插入模式)r
:用另一个字符替换光标下的单个字符R
:输入替换模式;替换多个字符,直到按Esc
g~
:反转光标下字符的大小写
删除文本
x
:删除光标下的字符X
:删除光标前的字符dd
:删除整行D
:从光标位置删除剩余行(剪切)cw
:更改光标下的单词(删除并进入插入模式)
复制和粘贴文本
yy
:将整行内容剪切(复制)到默认寄存器yw
:将光标下的单词剪切(复制)到默认寄存器p
:在光标位置后粘贴默认寄存器的内容P
:在光标位置前粘贴默认寄存器的内容
撤销和重做更改
u
:撤销对文件进行的最后一次更改Ctrl+R
(Control+R):重做最后一次撤销的更改
搜索和替换文本
基本搜索命令
/foo
:向前搜索单词 “foo”?bar
:向后搜索单词 “bar”n
:搜索后将光标移至下一个匹配项(向前)N
:搜索后将光标移至上一个匹配项(向后)
高级搜索命令
:%s/foo/bar/g
:在整个文件中查找并用 “bar” 替换所有出现的 “foo”:%s/foo/\=strtr(submatch(0), 'abc', 'xyz')/g
:将单词 “foo” 中的每个字符替换为字符串 “xyz” 中的对应字符
缩进和格式化
调整缩进
>>
:将当前行或选定的行缩进一个制表符位(或移位宽度)<<
:将当前行或选定的行向外缩进一个制表符位(或移位宽度)==
:将当前行或选定的行缩进到正确的缩进级别
格式化段落和代码块
gqip
:格式化当前段落(两行空格之间的文本)=ap
:格式化选定的代码块gwap
:将选定的代码块与其镜像交换(例如,翻转函数体)
代码折叠和切换
折叠和展开区域
zf
:将当前行或选定的行折叠到区域中za
:切换当前行的折叠状态(如果折叠,则打开;如果未折叠,则关闭)zM
:关闭当前缓冲区中的所有折叠zR
:打开当前缓冲区中的所有折叠
设置折叠级别
zm
:折叠级别减一(关闭折叠或打开更嵌套的折叠)zr
:折叠级别加一(打开折叠或创建新折叠)
缓冲区管理
列出和切换缓冲区
:ls
:列出当前 Vim 会话中的所有缓冲区:b foo
:切换到名为 “foo” 的缓冲区<C-^>
(Control+Shift+6):在最后使用过的两个缓冲区之间切换
分割和关闭窗口
:split
或:sp
:在当前选项卡页中打开一个包含相同文件的新窗口:vsplit
或:vsp
:在当前选项卡页中打开一个包含相同文件的新垂直窗口<C-w>_
:关闭当前窗口(但不是缓冲区)
调整窗口大小
<C-w>+
:将当前窗口的高度增加一行<C-w>-
:将当前窗口的高度减少一行<C-w>>
:将当前窗口的宽度增加一列<C-w><
:将当前窗口的宽度减少一列
移动窗口
<C-w>h
:将当前窗口移到左边<C-w>j
:将当前窗口向下移动<C-w>k
:将当前窗口向上移动<C-w>l
:将当前窗口移到右边
窗口导航
<C-w>p
:将光标移至前一个窗口(左或上)<C-w>n
:将光标移至下一个窗口(右或下)
选项卡管理
打开、关闭和列出选项卡
:tabnew
或:tabedit
:打开一个包含空缓冲区的选项卡:tabedit foo.txt
:打开一个包含文件 “foo.txt” 的新选项卡:qa
:关闭当前 Vim 会话中的所有窗口和选项卡(或在退出前使用:wq
保存更改):lt
:列出当前 Vim 会话中的所有选项卡
在选项卡之间移动
<C-w>T
:将当前窗口移至其自己的选项卡页gT
:将光标移至前一个选项卡页(左或上)gt
:将光标移至下一个选项卡页(右或下)
文件操作
打开和保存文件
:edit foo.txt
:打开一个包含文件 “foo.txt” 的新缓冲区:write
或:w
:将当前缓冲区的内容保存到其关联的文件:qa
:退出当前 Vim 会话中的所有窗口和选项卡(或在退出前使用:wq
保存更改)
使用不同文件分割窗口
:split foo.txt
:打开一个包含文件 “foo.txt” 的新窗口:vsplit bar.txt
:打开一个包含文件 “bar.txt” 的新垂直窗口
实用建议
以下是一些实用建议,可帮助您更加熟练地使用 Vim:
- 了解基础知识:在有效地开始使用 Vim 之前,您需要了解基本命令和按键绑定。好消息是,一旦您掌握了基础知识,您便可以使用几个键完成很多事情。
- 使用寄存器:寄存器是 Vim 中的一项关键功能,可让您存储和检索文本,当您处理重复性任务时,这可以节省很多时间。
- 使用宏:宏是录制命令序列并在以后播放它们的一种方式。当您需要重复执行一系列操作时,这非常有用。
- 自定义您的工作流程:Vim 具有高度可定制性,这意味着您可以根据自己的特定需求和工作流程量身定制它。这可能包括自定义击键绑定、插件和配置文件之类的内容。
- 使用正确的语法:Vim 的学习曲线很陡峭,但是一旦您掌握了语法,您便能够快速有效地执行复杂的任务。
- 使用插件:插件是扩展 Vim 的功能和使其功能更强大的好方法。有很多可用于添加新功能并增强工作流程的插件。
- 了解高级命令:一旦您掌握了基础知识,那么就可以开始了解高级命令。这些命令可以帮助您更快、更有效地执行复杂任务。
- 实践,实践,再实践:您使用 Vim 的次数越多,您就会变得越擅长。尽可能多地进行练习,并尝试将 Vim 用于您的所有文本编辑需求。
- 使用内置帮助:Vim 有一个内置帮助系统,可以为您提供编辑器中可用所有命令和功能的信息。当您尝试了解新命令或解决问题时,这非常有用。
- 加入社区:有一个庞大的活跃的 Vim 用户社区,他们共享技巧、窍门和最佳实践。加入这个社区可以帮助您了解新技术并提高您的技能。
热门插件
- Nerdtree:一个在屏幕左侧添加文件树的插件,可以让你更轻松地浏览文件。
- Syntastic:一个为多种编程语言提供语法高亮的插件。
- Vim-Airline:一个高度可配置的 Vim 状态栏,易于自定义,可提高你的整体编辑效率。
- Nerd Commenter:这个插件可以帮助你轻松注释和取消注释各种编程语言中的代码行。
- FZF:一个命令行模糊查找器,具有语法高亮、键盘导航和文件过滤功能。
- YouCompleteMe:一个适用于 Vim 的快速按需代码补全引擎。
- Coc.nvim:一个语言服务器协议 (LSP) 插件,为许多热门编程语言提供 IntelliSense 功能,如自动完成和跳转到定义。
- Vim-Fugitive:这个插件允许你轻松地在 Vim 中管理 Git 存储库。
- Ale:一个与许多热门编程语言搭配使用的语法和样式检查器,可在键入时提供实时错误检查。
- Vim-surround:这个插件让你可以轻松处理文件中的文本周围成对的字符(如引号或括号)。
- Lightline:一个轻量级且可配置的 Vim 状态栏/选项卡栏插件。
- Vim-easymotion:EasyMotion 提供了一种更简单的方式来使用 vim 中的一些动作。它通过突出显示所有可能的选择并允许你按一个键直接跳转到目标来消除
w 或 f{char} 中的 。 - Vim-lsp:一个提供语言服务器协议支持的插件,让你可以使用高级语言特性,如代码补全和语法高亮。
这些是一些适用于 Vim 的热门插件,可以极大地提高你的编程工作效率。你可以使用 Vim 的包管理器轻松安装它们,例如 Vundle、Pathogen 或 Vim-Plug。
结语
Vim 可能需要一些时间来习惯,但通过练习和耐心,它可以成为任何从事文字工作的人不可或缺的工具。请记住不断练习并尝试使用新的命令和键绑定,以便更加熟练地使用 Vim。编辑愉快!