探索 Vim
本文最初发布于barbarianmeetscoding.com。😊
自从成为一名程序员以来,我一直执着于用更少的资源创造更多价值。从如何过上充实、有目标、有思想的生活,到如何以最高效的方式重构每一行代码,我都为此着迷。在编程领域,我一直痴迷于学习新的技能和工具,它们能够释放和释放我无限的力量,让我每一次敲击键盘,每一次投入到开发中的时光,都能成就更多。
照片由 Carl Heyerdahl 在 Unsplash 上拍摄
其中一个工具就是vim。Vim 是一款文本编辑器,它以键盘为中心,采用模态哲学,并具有可组合的命令特性,对于那些敢于挑战其高难度学习曲线并坚持下来的人来说,它承诺提供无限的生产力和精湛的文本编辑能力。
自从我决定咬紧牙关学习 vim 已经 5 年了。这很艰难,特别是因为我不是盲打高手,但我设法学习并掌握了它所承诺的一些强大功能。但是,我从未完全转向 vim。相反,我一直使用 vim 层,停留在 Visual Studio、Atom 和最近的 Visual Studio Code 的舒适范围内(大多数编辑器都有或多或少支持 vim 的 vim 模式)。Vim 仍然是我的第二个编辑器,主要用于业余项目或写作。所以我从未真正擅长使用 vim。不要误会我的意思,学习熟悉基本命令和动作帮助我更熟练地编写和编辑代码。更好的是,它使得我的大脑和键盘之间的接口更薄,让我可以更轻松地将我的想法转化为代码。
尽管如此,我总是对没有完全掌握 vim 感到一丝懊悔,有一种挥之不去的感觉,觉得在另一个编辑器的范围内模拟 vim 不可能和真正的 vim 一样好,觉得我一定错过了一些东西。
好了,我们来了!今天,我决心重新踏上文本编辑启蒙之旅,踏上学习 Vim 的艰辛之路,最终抵达编程圣殿。想加入吗?
什么是 Vim?
Vi是一款历史悠久的文本编辑器(早在1976 年就已问世),专为终端设计,并具有一个非常罕见的特性:它支持模态模式(例如,插入文本模式、编辑文本模式、选择文本模式等等)。它的最新、也是最著名的版本是vim(Vi IM已验证),它同时支持文本和图形界面,在vi 的基础上进行了大量的改进,并且支持所有已知的平台。
Neovim 怎么样?
在过去的几年里,你可能听到人们谈论 Neovim,并好奇它到底是什么!?Neovim是 Vim 的一个现代分支,旨在重构 Vim,使其更易于维护、扩展,并更易于更广泛的社区贡献。它开箱即用,具有更合理的默认设置和集成终端。你可以在neovim.io上找到更多关于 Neovim 的信息。
为什么选择 Vim?
为什么在 2018 年还要学习一款古老的编辑器?好问题!Vim 提供了一种我从未见过的文本交互方式,它能让你在编辑代码时获得完全不同的控制力和流畅度。
使用 Vim,您与代码交互的主要方式不再是插入字符或使用鼠标移动。相反,您将像一位代码外科医生一样,随时随地以外科手术般的精准度进行专业切割,并以完全由键盘驱动的工作流程,以闪电般的速度和精准度浏览您的代码和代码库。
Vim 旨在为盲打用户提供最高的工作效率,其最常用的命令舒适地分布在主行及其相邻的按键中。Vim 是一个模态编辑器,其所谓的“正常模式”位于最前端。该模式旨在让您随意阅读、导航和转换代码。Vim 拥有多种模式,这使得主行附近的按键可以在每个单独的模式下重复使用,从而最大限度地减少对缓慢而复杂的组合键的需求,并提高您的速度以及手指和手腕的使用寿命。
Vim高度可定制,您可以根据自己的编码方式和工作方式进行调整。学习 Vim 的魅力之一,也是其复杂性的一部分,在于您可以缓慢但稳步地让它适应您的工作方式,无论是在您的项目中,还是独自一人或与团队合作。
无论如何,即使你不直接使用 Vim 编辑器,也能将你在 Vim 中学到的所有命令和操作带到你最喜欢的编辑器中,从而获得丰厚的回报。就是这样!Vim 非常优秀,以至于如今大多数其他编辑器都支持某种 Vim 模式,将所有基本命令和操作直接带入你熟悉的编辑器中。
那么,为什么在 2018 年,你还想学习 Vim 呢?套用Drew Neil在《Vim 实用教程1》中的话:
Vim 专为想要提升水平的程序员打造。在专家的掌控下,Vim 能以思维的速度快速处理文本。
谁不想要这个呢,对吧?
Vim 体验
与其他传统编辑器不同,使用 Vim 时,您大部分时间都会处于正常模式。在此模式下,您无需明确编写代码,它针对导航和精确的文本更改进行了优化。您的右手牢牢地放在2 个核心移动键上。这些键分别用于向左、向下、向上和向右移动光标。您还可以使用 (转到下一个单词的开头)或(转到下一个单词的结尾)逐字从左向右移动光标,或者使用/hjkl
执行相同操作,但从右向左移动光标。w
e
b
ge
利用这些按键,你可以精细地浏览文件,并以极大的报复和恶意进行攻击:daw
砰!你删除了一个 单词!das
你删除了一个句子!dap
你抹去了一个段落!真凶!
或者,你可以少一些威胁,多一些关怀,改正错误。使用caw
, cas
,cap
来更改单词、句子或段落。但这还不够。你可以更改当前行直到第一行的内容,或者更改直到行尾的所有内容,或者更好的方法是更改括号内的内容,或者对引号内的内容执行相同的操作。ctx
x
c$
ci(
ci"
想象一个简单的字符串:
const msg = 'Hello vim'
您可以通过输入以下内容来更改字符串:f'ci'WAT<ESC>
const msg = 'WAT'
这意味着找到下一个'
,然后将里面的所有内容更改'
为WAT
,然后<ESC>
离开插入模式返回正常模式。
然后,你可以用(这是 vim 术语,表示复制)抽出该行,然后用(再次是 vim 术语,表示粘贴)将其放在下面:yy
p
是的,你懂的!yank是另一个类似于delete和change 的操作符。你可以y
像使用 liked
或 一样c
来复制一个单词yaw
或yas
一个句子。此外,像 so 这样的命令重复执行yy
会使该命令作用于整行。巧妙地cc
修改一行并dd
删除一行。
const msg = 'WAT'
const msg = 'WAT'
再次f'ci'MAN<ESC>
:
const msg = 'WAT'
const msg = 'MAN'
kJ
然后疯狂地用(k
向上和J
连接线条)连接线条:
const msg = 'WAT' const msg = 'MAN'
冲洗一下c3w+<ESC>
,我们就得到了:
const msg = 'WAT' + 'MAN'
从超级大寺
这是使用 vim 的完全无意义的练习,但它仍然可以向你展示它的部分魔力。
对于较长的动作,您可以将计数与动作结合使用,例如,通过键入向下移动 5 行5j
(如{count}{motion}
)。同样,您可以将它们与上面看到的运算符( 、 等)一起使用d
,c
删除d2w
两个单词或c2s
更改两个句子。此外,还有更长的动作,您可以H
移动到编辑器可见区域的顶部,或gg
转到文件顶部,L
以及G
向下移动相同的操作。使用{
可向上移动整个段落或}
向下移动相同的操作。While%
可帮助您找到匹配的括号。
o
您可以使用(进入插入模式,以便开始输入)在下方开始新行,或使用 (在上方开始新行O
)。您可以使用 在文件中向前查找(文本)模式,并使用(下一个)和(上一个)/{pattern}
在模式之间导航,或使用 向后导航。n
N
?{pattern}
您可以使用.
命令重复之前的更改。只需输入.
,vim 就会重复您上次的更改。同样,您也可以重复动作。输入;
,您将重复以 开头的动作t,f,T,F
,或者输入n
,重复搜索。您可以使用宏录制一组命令,并根据需要重放它们。还有更多功能……
如此强大的功能触手可及,我们几乎无需离开普通模式或单个文件的限制。它拥有拆分、制表符、正则表达式、外部工具访问、拼写检查、字数统计等功能,此外还有6 种基本模式和 6 种附加变体模式,以及无限的扩展和自定义可能性!(谁会心动呢!?)
Vim 之道
让我们稍微回顾一下,反思一下,并尝试从迄今为止所看到的事情中汲取一些智慧。
键盘中心化是 vim 的核心。重要且实用的命令都触手可及,而且它们的位置经过精心设计,有助于高效使用和学习。例如:
- 右手下方主行的基本动作
hjkl
- 常见的中继器
;
,.
一个在另一个之下 - 另一个基本而有力的动作
f
是左手食指 - 基本操作符可以用左手轻松操作:
s
,x
,d
,c
,r
s
的同义词cl
和的x
同义词dl
距离和仅一指之d
遥c
*
以及#
用于向前和向后查找当前单词的动作。它们由每只手的中指触发。
这些操作符和动作都极其合理,而且通过助记符的使用也很容易记住。例如,表示更改、表示更改c
字母、表示cl
更改单词、表示caw
更改单词内部(无需空格)、表示更改直到找到等等。这使得 Vim 非常有利于学习,因为你无需记住那些晦涩难懂的命令:这些命令本身就很有意义。 ciw
ct.
.
此外,所有这些运算符、计数和动作构成了一种(编程)语言。您可以将运算符视为函数,将计数和动作视为参数,或者使用更简单的比喻……您可以将运算符视为动词,将计数视为形容词,将动作视为对象。vim的真正魔力在于组合。随着您逐渐积累这些运算符和动作词汇,您会发现您可以随心所欲地组合它们。因此,一旦您了解了上一段中的所有c
、cl
、caw
、ciw
,ct.
并且了解了它们的工作原理dl
,您不仅可以使用dl
,还可以将它与您已有的所有动作以及daw
、diw
、dt
等相结合。
这太酷了。使用 Vim 时,你会感觉自己正在文本编辑的元宇宙中遨游,就像编程或控制文本编辑和编写机制一样。如果你熟悉 git 以及使用 git 命令行进行源代码管理的感觉,你可以将 vim 视为文本编辑界的 git。(先不说 vim 比 git 早出现近 30 年的事实)。使用 vim,你查看一段文本时,看到的不再仅仅是单词或文本,而是无数操作符和动作应用的可能性。就像尼奥觉醒于矩阵一样。
好吧...谁有点得意忘形了?(我举手)
为什么 Vim 这么难?
现在来看看 vim 的阴暗面...也就是这个。
来源不明
还有这个。
陡峭的学习曲线确实有些夸张,放弃 Vim 的玩笑也已经过时了。事实上,至少有三件事导致了 Vim 学习曲线陡峭,并且让那些粗心的旅行者难以上手。
- 触摸打字是必须的
- 它是键盘驱动的,需要一些时间来适应默认的正常模式
- 糟糕的第一印象
盲打是必须的
盲打是使用 Vim 的先决条件。如果你不会盲打,那么在 Vim 中执行最基本的操作都会很困难。作为一个自学打字的人,这对我来说一开始是一个巨大的障碍,打字速度从每分钟 100 字下降到每分钟 10 字左右,打字速度慢得令人难以忍受,更不用说写代码了。仅仅是生产力的大幅下降就足以让你在最初几个小时就放弃学习 Vim。所以,如果你认为学习 Vim 值得一试,那就先学习盲打吧。
以下是一些可用于学习如何触摸打字的资源:
- 我在这个网站上花了很多时间,改掉了所有坏习惯,学习了正确的盲打方法。现在,每当我感觉自己的盲打技能生疏时,我仍然会用它来练习打字套路。这些年来,这个网站的进步真是令人惊叹。
- keyzen.io。这是一款出色的盲打训练器,专注于帮助您提高编程中常见不常见字符的打字技能,例如
;
、{
、(
、/
- zType是一款打字游戏,玩家将扮演一艘飞船,通过打字向外星人蜂群开火。这是一种非常有趣的练习盲打的方式。警告:这款游戏非常刺激,容易上瘾。请勿在睡前使用。
键盘和普通模式墙
你已经习惯了大部分时间都在使用以插入文本为主要模式的普通编辑器,因此迁移到 Vim 将会很有挑战性。到目前为止,你已经习惯了切换编辑器,并且能够快速上手,因为它们都采用插入模式优先的模式,并且易于在 GUI 中使用鼠标进行探索。在任何现代编辑器中使用鼠标,你都可以探索菜单中的选项,并在窗格、窗口、选项卡和文本上单击鼠标右键。通过这种探索性的方法,你将慢慢理解并学会使用新的编辑器。
然而,Vim 完全由键盘驱动,并且经常在终端中使用(因此可能没有启用鼠标支持,也没有任何鼠标操作选项)。即使你会收到提示,要求你使用命令提供的帮助,:h
你也很少会听从这个建议。这感觉太奇怪,太陌生了。再加上你首先看到的是一个非插入模式的编辑器,你甚至无法输入文本(一开始甚至无法移动或离开编辑器),你会感到完全不知所措。
最好的建议是先学习最基础的词汇,然后慢慢扩大词汇量。最基础的词汇量包括:
- 获取帮助
:help {whatever}
(或更短的版本:h {whatever}
)。Vim 的帮助非常棒。 hjkl
使用(:h motion
或:h movement
)移动i
使用(:h insert
)进入插入模式<ESC>
使用(:h mode-switching
)返回正常模式:w
使用(:h write
)保存文件- 离开编辑器时显示
:q
(:h quit
) :e {filepath}
使用(如:e src/main.js
) (:h edit
)打开文件
注意到:
所有这些命令前面的 了吗?冒号会触发命令模式,也称为 ex 模式。当你输入冒号和命令时,该命令将显示在屏幕的左下方。
这就是你真正需要知道的全部内容。注意我添加了:help
你需要输入的命令,以便你了解每个命令的相关信息,以及它们是多么容易猜到。你只需寻求帮助就能轻松地自己弄清楚如何退出 Vim。Vim,:help quit
拜托了。这是一个非常容易实现的目标,第一天你就能开始使用比这些命令更多的命令:w
、、、,它们都很容易学习e
,因为它们很有意义。c
d
切换编辑器的目的并非为了生存。只要不让你立刻离开就足够了,你真正想要的是比现在的编辑器更高效、更高效。我认为,只需掌握几个命令,你就能发现,你的效率比现在的编辑器更高。而目前为止,实现这一目标最简单的方法就是在当前编辑器上使用 Vim 模式。这样,你就能最大限度地减少学习 Vim 所需的知识,并几乎立即获得一些益处。
无论如何,最难的不是学习指令本身,而是熟练地执行指令。这才是练习的关键,尤其是最基本的动作hjkl
。以下是一些可以帮助你的技巧:
- 熟能生巧。从小事做起,坚持不懈。每天至少学习一个新技巧并不断练习。留意你当前编辑器的使用方式,并尝试找到使用新命令或现有命令的不同组合来更快地完成相同操作的方法。
- 试试吧
vimtutor
。只需vimtutor
在安装了 vim 的机器上,在终端中输入,即可访问一个 30 分钟的教程,帮助您入门 vim 并学习更基本的命令。(在 neovim 中,您可以使用:Tutor
命令在 vim 中启动 vimtutor)。您无需一次性完成本教程,但我强烈建议您仔细阅读。您会学到很多东西。 - 玩 Roguelike 游戏来学习
hjkl
。经典的 Roguelike 游戏是基于文本的角色扮演游戏,玩家在由角色绘制的 2D 环境中进行游戏(玩家通常以 表示@
)。Roguelike 游戏起源于终端,非常适合使用 VI,通常允许玩家移动角色hjkl
并通过键盘控制游戏。 - 试试Vim Adventures 吧。这是一款很棒的游戏,可以帮助你一次学习一项 Vim 技能,并在你用之前的技能证明自己的价值后解锁新的钥匙(和新的能力)。这真的是一个循序渐进学习 Vim 的好方法。
糟糕的第一印象
最后一个让 vim 难以学习的原因是,它给人的第一印象非常糟糕。你输入vim
(或者mvim
在 Mac GUI 上,gvim
在 Windows 和 UNIX GUI 上)“欢迎使用 vim!”
这就是你必须首先做的(如果你在终端上打开它,它可能是黑底白字)。打开一个文件(比如我的.vimrc
),没有语法高亮:
这给我的第一印象非常糟糕,我甚至两次因为这个放弃学习 vim。(快来学 vim!打开 vim!没时间学这个……)
您可能想使用 vim 发行版——一个以二进制文件或插件形式发布的预配置 vim 版本。这无疑会给您更好的第一印象,并且编辑器也更接近您习惯的现代编辑器,但它有一个很大的缺点:您将无法理解 vim 是如何设置的。它就像一个晦涩难懂的黑匣子。这会让您错过 vim 的部分精髓及其核心特性之一——可扩展性和可定制性。请遵循以下步骤,这些步骤旨在让您在使用过程中获得一些小的收获,并且不会让您感到不知所措:
Neovim 对初学者来说更好
考虑使用neovim而不是 vim来执行以下步骤。Neovim 有两个特点使其对新手更容易上手。首先,Neovim 的默认设置比 vim 好得多(例如语法高亮、自动缩进等),这些功能在 vim 中是没有的。其次,它有一个更友好的vimtutor,可以在 neovim 中运行 来启动,:Tutor
并在你完成练习后提供反馈。
vimtutor
从:Tutor
neovim开始学习 vim 的基础知识- 使用你选择的编辑器中的插件来应用你学到的知识。使用你当前的编辑器可以最大限度地减少你需要学习的内容,并让你能够通过大量的 Vim 微编辑技巧来丰富你现有的编辑技能。根据你编辑器的 Vim 模式的优劣,你的体验会或多或少地好一些。
- 当你熟悉了基本的 vim 命令后,就可以在
.vimrc
(或init.vim
为 neovim)中设置你的 vim 配置了。你可以查看vim-sensible或我的vim wiki,其中有一步步讲解了最简化且无需插件的配置。如果你使用的是 Neovim,可以直接跳过这里。 - 使用 vim 插件管理器来丰富 vim 的功能,使其更符合你的工作流程(最成熟的插件管理器有vundle、vim-plug和pathogen,《现代 vim》一书推荐使用minpac)。这些插件管理器大多数情况下的工作方式是,它们会克隆一个 git 仓库,其中包含一系列代表你所需插件的 vim 脚本。Vim 会在启动时加载这些脚本,并在 vim 上下文中运行它们。《现代 Vim》一书提供了一些很棒的建议,帮助你将 vim 打造成一个现代 IDE。
- 检查vim awesome中是否有你感兴趣的插件以及你开发的应用程序类型
- 随着时间的推移练习并改进你的 vim 设置和 vim 配置
现在就这些了
哇!这篇文章比我预想的要长一些(脸红)。希望你学到了一些东西,觉得它很有趣,并且对 vim 产生了一点好奇。祝你拥有美好的一天!
迫不及待地想了解更多?
这里还有一些资源:
- Vim和Neovim wikis
- vim 创建者 Bram Moolenar 的7 个有效文本编辑习惯
- 《实用 Vim》和《现代 Vim》书籍
- Vimcasts.org:Practical Vim作者 Drew Neil 的 vim 短视频集
以下是来自 Barbarian Meets Coding Vlog 的视频:
ci' 有点特别
在前面的例子中,我使用
f'ci'
组合来改变引用文本的内容,但ci'
会获得相同的结果。与其他文本对象(在前面的例子中我们称之为 、 )不同
aw
,as
使用ap
i'
时i'
您甚至不需要将光标放在引用的文本上。在行ci'
首键入内容,它将更改在该行中找到的第一个引用文本的内容。这很棒,因为它可以节省您输入的时间f'
。我保留了 ,f'
因为此行为仅适用于引号文本对象,而不适用于其余对象。如果要更改括号、方括号、标签等的内容,您仍然需要将光标放在它们界定的区域内。感谢
在评论中分享此内容!:D 他还推荐使用目标插件,将这种出色的行为扩展到其余的文本对象。
想要了解有关 Vim 的更多信息吗?
那么,请继续阅读本系列的下一篇文章。尽情享受吧!
-
《Vim 实用指南》是一本非常棒的 Vim 入门书籍。它采用技巧格式,涵盖了从初学者到高级的各种技巧。每一条技巧都提供了丰富的背景信息和上下文,不仅能帮助你了解如何使用新的命令和功能提升 Vim 技能,还能让你了解到更广泛的模式和思路,让你像 Vim 大师一样思考。书中还配有精彩的示例和练习,帮助你练习肌肉记忆。原文如下:《Vim 实用指南》面向那些想要提升水平的程序员。在专家的手中,Vim 能以思维的速度快速处理文本。阅读本书是你迈向这一目标的下一步 。↩
-
钥匙
h
就在你的食指旁边,随时可用 。↩