2023 年终极解释:Vim 语言、移动方式和模式
为什么 Vim 不仅仅是一个编辑器 —— Vim 语言、移动方式和模式详解
最大化效率和可定制性,同时享受编辑文本的乐趣。
Data Engineering 2023-01-04 2978 words 14 minutes
目录
作为一名开发者,我使用过 VS Code、Sublime、Notepad++、TextMate 等等。 但像 cmd(+shift)+end
这样的快捷键,以及用 option+arrow-keys
一个词一个词地跳动,在某些时候需要更快。
我遇到了瓶颈。我做的每件事都相当快,但速度无法再提升。
后来我才知道,Vim 是唯一一个随着使用时间的增长,你的速度也会不断提升的编辑器。
Vim 完全基于快捷键。 当我发现这一点并尝试了一下后,我感到麻木和有点愚蠢,因为没有在职业生涯的早期就学习这些快捷键(称为 Vim 语言)。
我意识到,有一个按键组合可以让我跳转到任何我想去的特定位置。 这就像一个游戏,看看我是否可以用更少的快捷键来完成特定的编辑。 这也是许多 Vim 用户从编码和写作中获得很多乐趣的地方。 感觉很自由,可以用外科医生的精准度移动光标。
虽然速度只是一个小小的优势,但当我看到其他人在 Vim 中导航时,它让我开始了。 在经历了陡峭的学习曲线后,它仍然是我职业生涯中学到的最强大的技能之一,可以用计算机谋生。
让我们揭穿 Vim 的神话,并学习如何使用特定的 Vim 语言记住所有的快捷键。 我们将了解如何使用 vim motions 移动,我将分享到目前为止我所学到的东西,以及为什么你也可能尝试一下 Vim。
学习 Vim 语言
关于 Vim 有很多说法——它有多快,只有 Linux 极客才使用它,以及不可能退出 Vim。
就我而言,我爱上了“Vim 语言”。 你知道,我不擅长记住任何东西,并且认为 Vim 不适合我。 但事实并非如此,原因只有一个:Vim motions 及其语言。
我了解到编辑器背后有一种语法。 有了它,你可以首先表达你想要做什么,多少次,然后应用什么。
让我们更深入地了解 Vim 及其背后的语言。
Vim 语言和 Motions 的工作原理
Vim 在其快捷键背后有一种很棒的语言或语法。 你不必记住一千个快捷键,而是可以学习几个并组合它们。
这些通常被称为 Vim 语言或用于移动的 Vim motions。 这与编辑器无关——这些是通用的,也可以在其他编辑器中使用。
例如,有用于 VSCode 的 VSVim、用于 JetBrains 产品的 IdeaVim、用于 Sublime 的 Vintage Mode,等等。 但也有像 Vimium 或 Firenvim 这样的浏览器扩展,甚至 Gmail 也采用了 Vim 的一些快捷键来进行导航 (j
、k
用于移动,g
用于跳转)。
每个每天在电脑上打字八小时的人都应该学习 Vim 语言。 是的,一开始很难,但对于任何新的和不同的事物来说都是如此。 但是每天都在变得更好,并且在编码或写作时获得更多的乐趣应该足以成为动力。 你并不太忙而无法学习 - 你会在学习的过程中学习。
你太忙而无法改进吗? | 图片来自 steenschledermann
Vim 语法
正如口语语法有动词、主语和宾语一样,Vim 语言也是如此。 该语法首先有不同的动词。 在 Vim 中用 y
复制(或 yank),用 d
删除,用 p
粘贴,用 c
更改,等等。
例如,最简单的快捷方式是用 yy
复制一行。 在这种情况下,yank 是动词,第二个 y
是 y_
的同义词。 y
被加倍,这使得它更容易输入,因为它是一个联合操作。
接下来,我们可以添加动作。 每个动词都以一个主语作为他们的动作。 有很多动作(更多内容在下一节中)——最简单的是用数字。
例如,要复制三行,你可以在前面添加一个 3,例如 3yy
。 你可以用所有的动词来做到这一点,比如删除三行是 3dd
。 另一个是 {
和 }
分别移动到段落的开头或结尾。
除了动词和主语之外,Vim 语言还有宾语。 例如,我们可以用 "ay
将文本保存到不同的剪贴板中(在 Vim 中称为寄存器)。 在这里,我们将其复制到寄存器 a 中,这将是宾语。 我们可以通过做同样的事情来再次粘贴它,但是使用动词 paste 代替 yank "ap
。
甚至还有带有前缀的形容词和副词。 通常,你使用动词和宾语。 但是,你可以添加 d5}
,而不是用 3J
向下移动三行(这将连接以下三行),这意味着“从当前行到从此处向下第五个段落的末尾删除”。
对我来说,Vim 最神奇的地方在于你如何导航和编辑文本——而且它仍然与编辑器无关。
当然,Vim 是引入和完善这些操作的编辑器,但同样——你可以在任何其他地方获得它们。 这深入到了 Vim 语言中,但我们仍然需要接触编辑器。 了解这一点很重要。
但我希望你已经开始看到这种模式的力量。 有了几个动词和宾语,你已经可以知道数百种组合,而无需单独记忆每一个。
你可以在 Mastering the Vim Language 上观看视频,或者在这个很棒的 StackOverflow 评论中阅读对 Vim 语言的完整阐述。
Vim Motions
Vim motions 是你如何导航的,无论你是导航到单词的末尾还是返回到文档的开头——这些都是 motions。
这些是你开始学习 Vim 时首先学习(和讨厌)的东西。 最初很难弄清楚,但当你习惯它们时,你会想要在任何地方使用它们。
Vim 使用 jk
来向下和向上移动,以及 hl
来向左和向右移动,而不是使用箭头键。 主要思想是使用你的右手自然放置的键。 你不需要移动你的手甚至手指来进行导航。
再说一次,这似乎是一件小事,但是一旦你学会了它,你就会知道为什么每个人都在告诉你它。
一些常见的 motions 是:
h,j,k,l - 左,下,上,右
w - 到下一个单词的开头
b - 到上一个单词的开头
e - 到单词的结尾
$ - 到行尾
^ - 到行首
你可以在这个备忘单中找到最重要的 motions:
来自 Cloud Guru 的 Vim 命令备忘单
如何使用 Vim 模式(normal、insert、visual 和 command)
模式是另一件可能让你在开始时感到困惑的事情。
当你启动 Vim 时,你并没有像你在其他编辑器中可能熟悉的“insert”模式中那样,输入你点击键盘的内容。 相反,你所处的 normal 模式允许你执行上述 Vim 语言和 motions 中解释的命令。
Vim 是唯一一个优化编辑文本而不是从空白页开始编写的编辑器。
三种模式的说明(escape 模式是 command 模式)| 图片来自 Geekforgeeks
这是 Vim 让你如此高效的另一个原因:你为当前工作或任务的每个阶段都设置了不同的模式。
- Normal 模式用于阅读代码和快速导航。
- Insert 模式用于当你想要添加一些代码或文本时。
- Visual 模式是独特的,与用鼠标突出显示文本相同,但使用上述 Vim motions。
- Command 模式是强大的,你可以在其中键入 Linux 命令,例如使用
:%!jq
格式化 JSON 文件(而 jq 是安装在你的机器上的命令行工具),并在 Vim 中执行它们。 这也是你可以使用 Vim 命令的地方,例如:sort
用于排序你的文件。
我可以在这里继续说下去,但我现在想深入了解编辑器本身,并探讨我最初学习它的原因以及如何开始。
Vim 编辑器简介 (Neovim、Lunarvim 和 Helix)
那么 Vim 编辑器到底是什么呢? 它始于简单的 vi 编辑器,这是一个实现 Vim 语言并可以编辑文本的基本编辑器。 它有点像你可能在 Windows 上使用的 Notepad++,但没有鼠标和上下文菜单。
Vim 只是 Vi 的改进版本,具有更多功能。
Vi 和 Vim 之间的差异 | 图片来自 Linuxiac
今天甚至有一个更新版本的 Vim,称为 Neovim。 这个版本非常流行,我也开始使用 Neovim。 与 Vim 相比,Neovim 使用 Lua(一种实际的编程语言)来配置和扩展编辑器。 与 Vim 的原生 Vimscript 相比,这使得编写插件和配置 Neovim 更加容易。
Neovim 是今天开始学习 Vim 的好地方,因为它有很多很棒的插件。 Neovim 还赢得了几次 StackOverflow 调查中最受欢迎的 IDE,最近一次是在 2022 年。
还有一个用 Rust 构建的编辑器,称为 Helix,但它与 Vim 语言略有偏差,这使得它成为一个不太理想的起点。
如果你想在不需要了解任何关于 Neovim 的知识并在配置上花费数小时的情况下开始,你可以从 LunarVim 开始。 这是一个发行版,其中包含你已经从 VS Code 中了解的所有功能。
假设你对终端感到满意,并且意识到你想要按照自己的喜好更改编辑器。 在这种情况下,你可以通过一个简单的单文件配置来启动你的旅程,其中包含许多可以立即使用的解释。 你还可以通过打开单个配置文件来学习每个配置。
我为什么要学习 Vim
使用我们在编辑器中每天使用的标准输入方法,我们最终会停滞在某个水平。 当然,你可以使用 cmd+arrow-keys
(在 Mac 上)跳转到一行的开头,或者使用 option+arrow-keys
在单词之间跳转,而不是字符。
但是一旦你掌握了这一点会发生什么? 如果你需要更改句子中间的某些内容怎么办? 没有其他方法可以使用此选项多次跳转,或者你每次都将手移开以触摸鼠标来单击确切的位置。
有一天,我看到一个同事在 Vim 中工作,一切都明白了。 Vim 语言和 motions 是我一直需要的。 因此,我安装了 VS Code 插件,观看了一些 YouTube 视频,然后开始了学习基本动作的旅程。
我也喜欢学习新事物,更好的是,我总是在寻找让自己更有效率的方法😉。
但是,正如你们中的许多人可能已经经历过的那样,学习 Vim 最难的部分是入门。 最初的学习曲线非常陡峭。 下面是一个说明:)。
文本编辑器的学习曲线。 虽然有趣,但非常准确 | 图片来自 Why I Love Using Vim To Write Code
我也尝试了两次或三次才开始学习 Vim,直到我完全掌握了它。 我来回切换。 除了要完成工作之外,有时很难从一天到另一天完全切换。 但是我只是喜欢学习所有的动作,而且我知道它会在短时间内让我更快。
我为什么喜欢 Vim
我已经使用 Vim 仅仅八个月了,并且使用 Python 编写代码大约六年了。 自 2003 年我的职业生涯开始以来,我就一直在使用其他代码编辑器。 我使用的每个编辑器都有其优势和吸引力。 但是我从未体验过像使用 Vim 这样的效率提升。
最后,使用最适合你的编辑器。 就我个人而言,我希望我的编辑器能帮助我尽可能快地工作,特别是因为我每天都使用它。 花大量时间学习 Vim 是必要的,但随着时间的推移会得到回报。 这就是 Vim 以及尤其是 Vim 语言的全部意义所在。
程序员之间普遍被低估的一项技能是使用终端。 通过学习你的编辑器,尤其是使用 Vim,你自然会更多地了解终端并提高你的 Linux 技能(反向搜索、lazy git、Tmux 等等)。
在 Vim 之前,我只有在不得不使用终端时才使用它。 我在网上搜索了一切,而今天,我尽可能多地使用带有其有用的手册的终端。
有时我也对自己感到惊讶,而且非常书呆子气——但它非常有效。 自从开始熟悉 Vim 以来,我变得更加优秀的开发人员。
调整和优化 Vim 可能需要数小时甚至数天,而且在开始时是不可避免的。 但是一段时间后,你的 dotfiles 会变得成熟,你开始减少更改内容。 你还会更快地尝试新的插件或添加重映射。
此外,Vim 非常有趣! 在 Neovim 中工作是我每天工作的一大亮点。 改进你的文本编辑器并使其成为你自己的——也许以其他人没有优化的方式——真是太棒了。
例如,我写了很多,所以我优化了用 Markdown 写作和用 Python 编程。 这为我作为一名程序员的幸福感增添了很多。
PDE(个性化开发环境)
由于所有这些,TJ DeVries 称 Neovim 为 PDE(个性化开发环境),而不仅仅是“一个 IDE”。 你可以在 ThePrimeagen 真正鼓舞人心的 Vim 视频 中了解更多关于此的信息,并了解他为什么在 2022 年使用 Vim。
Vim 还在我身上体现了简约。 我使用终端而不是花哨的 GUI 和纯文本文件,以获得清晰、自由、极快的快捷方式、没有供应商锁定以及保持 Flow,并将内容放在首位。
Vim 不仅改变了我的 workflow,还改变了我以思考的速度进行编辑的能力。 我不用想“我想编辑那个词”,我的手指会跳到那个词并用几个按键来更改它。
Vim 用于数据工程
我的数据工程 workflow 使用 Neovim 和 LSP(语言服务器协议)pyright,使用 mason 安装。 Tmux 还有很多,但你可以在 dotfiles/nvim 上找到所有详细信息。
Vim 用于写作
由于 Obsidian 的其他功能,我仍然更多地使用 Obsidian 进行写作(请参阅更多关于我的 PKM workflow 的信息),这些功能包括支持的图像、反向链接、图形和专门用于笔记的插件,例如 ReadWise(同步我从书籍和推文中的重点)、Dataview(将笔记用作数据库)、Excalidraw(用 Markdown 格式绘图)、模板等等。
尽管如此,我越来越多地在 Neovim 中写作。 目前,我使用 ZenMode(用于将文本居中)、Grammarly(用于 linting 语法)、write-good(用于 linting 语法)和专门的 Obsidian.nvim(跟踪反向链接等等)。 你可以在我的 dotfiles 中找到所有详细信息。
在 Obsidian 中,我使用 Vim mode Obsidian .vimrc 并将大多数 hotkeys 映射到我的 Vim 设置。 同时,我一直在 Neovim 中编写越来越多的内容,并且一直在逐步迁移到完整的 Neovim。
Telescope 等插件和我用于编码的简单 grep 功能与 Markdown 非常有效。 以下是一些剪辑,显示了在一次关于 Writing, Editing, and World-Building at the speed of thought with Vim 的精彩演讲中所能做的事情。
你也应该学习 Vim 的原因
当我听说 Vim 时,我以为它只适合软件工程师和 Linux 极客 😅。 我从未想过我也会使用它。 但是我是怎么接触到它的呢?
我已经分享了一些我喜欢 Vim 的原因。 但它确实改变了我的所有 workflow,不仅是作为一名开发人员,而且还改变了我上网、写作、导航和使用工具的方式。 我在任何我使用的应用程序中搜索 Vim 模式。
但是如果你不喜欢摆弄和优化你的 workflow,并且如果你不是为了生活而写作或编码,那么 Vim 可能不适合你。 从你当前的编辑器开始,并在你使用 Vim 做任何事情之前激活 Vim 模式。 相信我,它会为你节省很多挫败感 😅。
如何开始使用 Vim
有很多很好的资源可以帮助你开始使用 Vim。 最简单的方法是在你的终端中键入 vimtutor
,这是一个 Vim 的交互式教程。
我已经链接了一些上面的 YouTube 视频——特别是查看 ThePrimagen,从 Vim As Your Editor 或 Why even bother with Vim or Neovim in 2022 开始。
我当时从 Ben Awads 的 Vim tutorial 开始的。Lecture: Editors (Vim) (2020) 非常出色。[Mastering the Vim Language](https://www.ssp.sh/blog/why-using-neovim-data-engineer-and-writer-2023/<https:/youtu.