各位 VIM 大神们好!很高兴能和大家一起探讨 VIM 的学习之道。关于 VIM 命令太多、记不住、感觉没意思的问题,这确实是许多初学者甚至中级用户都会遇到的瓶颈。但请相信,VIM 的魅力恰恰在于它的强大和高效,而这些都建立在对命令的熟悉和灵活运用之上。
“熟能生巧”是绝对真理,但我们要做的不是死记硬背,而是有策略地学习和实践。下面我将从几个方面,尽量详细地为大家讲解如何学习 VIM,让枯燥的命令变得有趣,并最终化为我们手中的利器。
一、 理解 VIM 的哲学:模式与效率
在开始学习命令之前,理解 VIM 的核心哲学至关重要。VIM 不是一个简单的文本编辑器,它更像是一个交互式语言。
模式 (Modes): 这是 VIM 最独特的地方。VIM 有多种模式,最常用的有:
Normal Mode (普通模式): 这是 VIM 的默认模式,用于导航、删除、复制、粘贴、查找、替换等各种操作。在这里,你输入的大多数字符不会直接插入文本,而是被解释为命令。
Insert Mode (插入模式): 类似于其他编辑器的模式,用于直接输入文本。
Visual Mode (可视模式): 用于选择文本块,然后对选中的文本块进行操作。
Commandline Mode (命令行模式): 在 VIM 的底部输入以 `:` 开头的命令,用于执行更复杂的任务,如保存、退出、查找替换、执行 Shell 命令等。
Ex Mode (行模式): 类似命令行模式,但主要用于处理行。
高效 (Efficiency): VIM 的设计目标是让你在不离开键盘的情况下完成绝大多数编辑任务。这意味着它鼓励你使用组合键、上下文命令和高效的导航方式。
为什么理解模式很重要? 很多命令感觉没意思,是因为我们经常卡在模式切换上,或者不知道在什么模式下使用什么命令。一旦理解了模式的划分,你会发现每个模式下的命令都有其存在的理由和价值。
二、 学习 VIM 的正确姿势:循序渐进,目标驱动
不要试图一次性记住所有的命令。VIM 的学习是一个马拉松,而不是短跑。
1. 从基础命令开始,建立信心
入门三剑客:
`h`, `j`, `k`, `l`: 方向键,左右上下移动。虽然有方向键,但在 VIM 中,使用这些键位移动更符合人体工学,尤其当你习惯了之后。
`i` (insert): 进入插入模式,在光标前插入。
`a` (append): 进入插入模式,在光标后插入。
`o` (open line below): 进入插入模式,在当前行下方开新行。
`O` (open line above): 进入插入模式,在当前行上方开新行。
`Esc`: 返回普通模式。这是你最常用的键,一定要熟练掌握。
`:`: 进入命令行模式,输入命令。
`x`: 删除光标下的字符。
`dd`: 删除当前行。
`yy`: 复制当前行。
`p`: 粘贴(在光标后)。
`P`: 粘贴(在光标前)。
如何记忆这些基础命令?
联想: `h`, `j`, `k`, `l` 分别对应 Left, Down, Up, Right,虽然字母不完全匹配,但记住这个习惯就好。`i` 是 insert,`a` 是 append,`o` 是 open,`x` 是 eXecute(一种说法,或者就是简单的删除)。`dd` 是 double delete(删除两行,实际上是删除当前行),`yy` 是 yank(复制)。
反复练习: 打开一个文件,只用这几个命令来编辑,比如写一段简单的文字,然后尝试删除、复制粘贴。即使是写“Hello, VIM!”,也要用 `i` 进入插入模式,输入后 `Esc` 返回,用 `dd` 删除,再用 `yy` 和 `p` 复制粘贴。
内置教程: 非常重要! 在 VIM 中输入 `:vimtutor`,这是一个非常棒的交互式教程,它会一步一步引导你学习基本的移动、编辑和操作。请务必完成它!
2. 分阶段学习:掌握核心操作
不要一下子去学那些看起来很“酷”但可能短期用不上的命令。先专注于提高你日常编辑的效率。
导航进阶:
`w`, `b`, `e`: 按单词移动(word, backward, end of word)。`w` 移动到下一个单词开头,`b` 移动到上一个单词开头,`e` 移动到当前单词末尾。
`W`, `B`, `E`: 同上,但是按照“大单词”(以空格或标点分隔的词)。
`0`: 移动到行首。
`^`: 移动到行首的第一个非空白字符。
`$`: 移动到行尾。
`%`: 在匹配的括号 `{}` `()` `[]` 之间跳转。
`gg`: 移动到文件开头。
`G`: 移动到文件末尾。
`{`, `}`: 按段落移动。
`Ctrl+f`, `Ctrl+b`: 向前(下)和向后(上)翻页。
`Ctrl+d`, `Ctrl+u`: 向下和向上翻半页。
编辑进阶:
`r`: 替换光标下的一个字符。
`R`: 进入替换模式,可以连续替换。
`cw`, `cb`, `ce`: 改变一个单词(change word, backward, end)。`c` 是 change,它会删除后进入插入模式。
`dw`, `db`, `de`: 删除一个单词。`d` 是 delete。
`D`: 删除到行尾。
`cc`: 删除当前行并进入插入模式。
`C`: 删除到行尾并进入插入模式。
`s`: 删除光标字符并进入插入模式。
`S`: 删除当前行并进入插入模式(同 `cc`)。
`J`: 合并当前行和下一行。
可视化模式:
`v`: 进入字符可视模式。
`V`: 进入行可视模式。
`Ctrl+v`: 进入块可视模式。
选中后可以使用 `d`, `y`, `c`, `p` 等命令。
查找与替换:
`/pattern`: 向下查找 `pattern`。按 `n` 下一个,`N` 上一个。
`?pattern`: 向上查找 `pattern`。
`:%s/old/new/g`: 全局替换。
`%`: 表示整个文件。
`s`: substitute(替换)。
`old`: 要查找的模式。
`new`: 替换成的字符串。
`g`: global,表示替换行内的所有匹配项(如果不加 `g`,则只替换每行的第一个匹配项)。
`:%s/old/new/gc`: 替换时带确认。
3. 掌握 VIM 的组合操作:命令 + 数量 + 对象
VIM 的很多命令可以组合使用,形成强大的操作。这个是 VIM 高效的灵魂!
格式: `[数量] [命令] [对象]`
数量 (count): 表示执行命令的次数。例如 `3dd` 删除三行,`5w` 向前移动五个单词。
命令 (motion/operator): 如 `d` (delete), `y` (yank), `c` (change), `p` (put), `w` (move word), `j` (move line down) 等。
对象 (text object/motion): 表示操作的对象。
简单运动 (motion): `w` (word), `j` (line down), `$` (end of line) 等。
文本对象 (text object): 针对特定的文本结构进行操作。这是 VIM 的一大特色。
`iw`: inner word (一个单词,不包括周围的空格)。
`aw`: a word (一个单词,包括周围的空格)。
`i"`, `a"`: inner quoted string, a quoted string (引号内的内容,包括引号)。
`i'`, `a'`: 同上,单引号。
`i(`, `a(`: inner parentheses, around parentheses (括号内的内容,包括括号)。
`i)`, `a)`: 同上。
`i{`, `a{`: inner curly braces, around curly braces。
`i}`, `a}`: 同上。
`it`, `at`: inner tag, around tag (HTML/XML 标签内的内容,包括标签)。
`i<`, `a<`: 同上,尖括号。
举例说明:
`dw`: 删除一个单词。
`3dw`: 删除三个单词。
`d$`: 删除到行尾。
`diw`: 删除光标所在的单词(不含空格)。
`daw`: 删除光标所在的单词(含空格)。
`ci"`: 删除引号内的内容,并进入插入模式。
`yap`: 复制一个段落。
`yip`: 复制光标所在的段落(inner paragraph)。
如何练习组合操作?
从简单开始: `3w`, `5j`, `d$`, `dw`。
逐渐加入文本对象: `diw`, `ciw`, `dit`, `cit`。尝试编辑一段 HTML 代码或包含复杂标点符号的文本,你会发现文本对象的强大之处。
反向思考: 当你想做某个编辑操作时,想想是否可以用 `[数量] [命令] [对象]` 的方式来完成。例如,我想删除从光标到行尾的内容,就可以想到 `d$`。我想删除当前光标所在的整个单词并继续输入,就可以想到 `ciw`。
4. 学习常用的 VIM 配置(`.vimrc`)
虽然这不是命令本身,但一个良好的配置能让 VIM 更易用。
安装插件管理器: 推荐 `vimplug` 或 `Vundle`。
常用插件:
代码补全: YouCompleteMe, coc.nvim
文件浏览器: NERDTree
语法高亮: Vim 自带支持很好,但也可以配置颜色主题。
模糊查找: CtrlP, FZF
Git 集成: vimfugitive
一些基础配置项:
`syntax on`: 开启语法高亮。
`set number`: 显示行号。
`set relativenumber`: 显示相对行号,配合 `j`, `k` 移动非常方便。
`set autoindent`: 自动缩进。
`set smartindent`: 更智能的缩进。
`set tabstop=4`: 设置 Tab 宽度。
`set shiftwidth=4`: 设置自动缩进宽度。
`set expandtab`: 将 Tab 转换为空格。
`set mouse=a`: 开启鼠标支持(如果你不介意的话)。
5. 专注于你的工作流程,按需学习
当你用 VIM 做实际工作时,你会自然而然地遇到需要解决的问题。这时再去学习相关的命令,会更有目的性,也更容易记忆。
例子:
你经常需要复制粘贴代码块。那么你就应该学习 `y` (yank) 和 `p` (put) 的各种用法,以及可视模式下的复制。
你经常需要批量修改某个模式。那么你就应该学习查找替换 `:s` 命令,以及正则表达式。
你经常需要在多个文件之间跳转。那么你就应该学习 `:e` (edit), `:sp` (split), `:vs` (vsplit), `:b` (buffer), 以及模糊查找插件。
三、 让 VIM 学习更有趣的方法
游戏化学习:
VIM Adventures: 一个在线游戏,通过完成任务来学习 VIM 命令。
Terminus: 另一个 VIM 相关的游戏。
情景式记忆:
设想一个场景:“我要删除当前行的所有内容并重新输入。” 这个时候就应该想到 `cc`。
“我想复制从这里到下一个单词末尾的内容。” 这个时候就可以想到 `y` + `e`,或者 `ye`。
“我想删除从当前光标到行尾的所有内容。” 想到 `d$`。
画脑图或流程图: 将命令按照功能(导航、编辑、查找、窗口管理等)进行分类,并用图示来连接它们。
教别人 VIM: 当你尝试向别人解释一个命令或一个概念时,你会更深入地理解它。
分享你的配置和技巧: 在社区中分享,可以获得反馈,也能巩固自己的知识。
四、 常见误区与建议
不要害怕犯错: 在 VIM 中,大多数错误都可以通过 `u` (undo) 来撤销。大胆尝试!
不要依赖鼠标: 尽量克制使用鼠标的冲动。即使是复制粘贴,也要尝试使用 VIM 的命令。
循序渐进: 不要急于求成。一天掌握一个新命令或一个新技巧,日积月累就能看到巨大的进步。
持续练习: VIM 的熟练程度是靠日积月累的练习得来的。即使是一点点时间,也要用 VIM 来进行编辑。
定制你的 VIM: 找到适合自己的工作流程和配置,让 VIM 成为你高效的助手。
总结一下学习 VIM 的关键步骤:
1. 理解模式: 明白 Normal, Insert, Visual, Commandline 模式的区别和联系。
2. 完成 `vimtutor`: 这是你最好的起点。
3. 掌握基础命令: `hjkl`, `i`, `a`, `Esc`, `dd`, `yy`, `p`, `x` 是基石。
4. 学习进阶导航: `w`, `b`, `e`, `^`, `$`, `gg`, `G` 等,提高移动效率。
5. 掌握组合操作: `[数量] [命令] [对象]`,尤其是文本对象 `iw`, `aw`, `i"`, `a"` 等,这是 VIM 高效的关键。
6. 学习查找替换: `:s` 命令及其参数,正则表达式。
7. 按需学习: 在实际工作中遇到问题,再去解决它。
8. 持续练习与迭代: 不断地用 VIM 做事情,并优化你的配置。
最后,请记住,VIM 的学习是一个持续的过程。享受这个过程,你会发现它带来的不仅仅是编辑效率的提升,更是一种全新的编程和编辑思维方式。当你能够流畅地在各种命令之间切换,用最少的按键完成最复杂的操作时,你就会真正体会到 VIM 的魅力所在。
祝大家在 VIM 之旅中都能“熟能生巧”,并找到属于自己的那份高效与优雅!