This commit is contained in:
louzefeng
2024-07-09 18:38:56 +00:00
parent 8bafaef34d
commit bf99793fd0
6071 changed files with 1017944 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
<audio id="audio" title="导读池建强Vim 就是四个字“唯快不破”" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/e7/db/e710ddb5efdfcb11277e6cd284a753db.mp3"></audio>
你好,我是池建强。
操作系统、编程语言和编辑器是程序员永恒的讨论话题,技术发展了几十年,大家聊起这个来依然能争个面红耳赤。今天我就和你聊聊文本编辑器的那些事儿。
在文本编辑器领域Vim 和 Emacs 是永恒的焦点。使用 Emacs 和 Vim 的程序员,平时大家各用各的,各自沿着不同的道路和目标前进,但总会在某个场景下相遇,愣一下就互相扔石头和臭鸡蛋,砸得对方鼻青脸肿,然后擦擦眼泪和口水继续前行。你看,编程也是有宗教信仰的,其实是个危险的工种,当真不是瞎扯。
我工作了二十多年,写程序有十几年,用过各种编程工具,用错过,也用对过,虽然每种优秀的编辑器都有传奇的故事,每个程序员都有自己的脾气,但是,如果让我推荐一款编程工具,那一定是 Vim。
**Vim 号称编辑器之神,唯快不破,可扩展,插件遍天下。学习曲线虽然陡峭,但是学成之后,基本上就成肌肉记忆了,写程序双手不离键盘,上下翻飞,可谓快意编程。**
我和 Vim 怎么结缘的呢?那得从 2000 年说起。
## 缘起
当时正值第一波互联网浪潮,我刚毕业不久,一如现在的热血青年,投身到互联网的大熔炉中。我所在的公司叫洪恩教育,公司里聚集了很多清华北大的同学,技术牛人扎堆,大家清一色使用 Vim 在服务器端编程,语法高亮都不设,内部 BBS 也是水木清华那种,通过终端访问,非常极客。走进办公室一眼望去,满目皆是黑漆漆的屏,绿瓦瓦的字,每个人都在那里噼噼啪啪地敲击键盘,韵律十足,我想,这简直酷毙了。
<img src="https://static001.geekbang.org/resource/image/da/ed/da42a443cbd9e74c049a1a23e1e458ed.jpeg" alt="" title="水木清华 BBS">
我最初还在使用 Editplus 编程,隶属菜鸟帮。别人的开发、编译和发布环境都在服务器端,而我则需要在本地编写好程序,通过 Editplus 的 ftp 功能上传到服务器端,再进行调试、测试和发布,不仅麻烦,而且不够酷。
那时候不酷是不行的,我这种行为遭到了小伙伴的无情嘲讽,于是我把愤怒都发泄在键盘上,每天在满天星斗的夜色中学习 Vim 技法,在清晨的微光中编译 Linux 内核,上午敲打键盘输出 Perl 程序,中午吃完五又四分之一口米饭之后开始研习 Vim 的多窗口和标签……
那时候我住在公司,时间充裕到让你不好意思不学习,虽然 Vim 资料匮乏,但我周边都是牛人啊,随时随地请教,不断练习,很快小有所成,编码时鼠标锁进抽屉,双手敲击键盘上下翻飞,成就感十足。我对语法高亮情有独钟,经常把自己的界面配置得花花绿绿,没事看看也是一件乐事。
自此以后,我就与 Vim 结下不解之缘十几年过去了工作中一直没有离开过Vim断断续续一直在用。到了2009年我开始把工作环境完全切换到了 Mac 上,记得当时打开 Mac 的终端时,欣喜若狂地想,这不就是 Vim、Shell 和 IDE 的完美集成么?
## 场景
在不同的场景下应该采用最适合的工具这时就会有人问了Vim 适合什么场景呢?
简单说来Vim 比较适合 Unix/Linux 服务器端编程,如果你使用 Mac 电脑Vim 是直接集成在你的终端环境中的,用起来十分方便。我以前用 Vim 主要用来进行 Shell/Python/C 编程。在 Unix/Linux 服务器端编辑和修改文件也离不开Vim另外由于我个人工作环境是 Mac所以修改文本文件、Code Reiview、批量替换文件、比对文件等工作用 Vim 顺手就做了。
写 Java 程序、前端 HTML/CSS/JS、Objective-C 和 Swift最优方案依次是 IDEA、VS Code、XCode 等,这些优秀的工具可以帮助我们提升效率,减少错误,但是如果你还想更进一步,那么 Vim 绝对值得拥有。
## 历史
Vim 源于 vi但不是 vivi 作为计算机的文本编辑器历史极为悠远它是由美国计算机科学家比尔·乔伊编写并于1976年发布的同年苹果公司成立。比尔·乔伊是 Sun 公司的联合创始人和首席科学家,一位传奇的技术天才,我个人以为他最伟大的贡献是独立编写 BSD 操作系统,开发 vi 编辑器,创立 Sun 公司,当然,他还是 Java 语言的主要贡献者之一,任何人有幸完成其中一项工作已经足以名垂计算机发展史,而乔伊则通过一己之力完成了这些科技成果,推动了整个计算机科技的发展。
Vim 诞生得要晚一些它的第一个版本由布莱姆·米勒在1991年发布这个兄弟也是一位声名显赫的程序员80 年代买了一台 Amiga 电脑,打开电脑一看,米勒鼻子差点气歪了,居然没有他最常用的 vi 编辑器!对于米勒来说这是不可接受的。
愤怒的米勒决定自己开发一个文本编辑器,完全复制 vi 的功能并起名为Vi IMitation模拟。事实证明优秀的程序员都具备这种品质感到不爽了就会写出个什么东西要么完善一下要么创新一下要么是你写要么是我写于是很多伟大的软件程序就发明出来了。随着 Vim 的不断发展更多更好的功能被加了进来正式名称改成了Vi IMproved增强也就形成了现代的 Vim目前最新的稳定版本是 8.2Vim 的开发语言是 C 和 VimScript。
## 理念
Vim 是一款完全面向程序员的软件,我很少见到用 Vim 编辑文字的普通用户,如果你是,一定要告诉我。
写过程序的人都知道,编程的时候双手大部分时间都放在键盘上,或编码、或插入、或移动、或定位、或查找,这种连续操作的时间和频率远远大于阅读、翻页、设置字体、摆弄样式等文案工作,而二者往往产生很多停顿和间隙,而编程时的停顿是非常影响编程效率的,所以 Vim 的设计理念就是通过模式的转换、命令的组合和数以万计的插件,保证程序员在编程的过程中,双手尽可能保留在键盘中央的区域,并且,不需要鼠标。
想用好 Vim先要理解 Vim 的模式转换。Vim 常用的模式有四种:
1. 普通模式Vim 启动后的默认模式,用来移动光标、删除文本、覆盖输入文本、恢复操作、粘贴文本等等。
1. 插入模式:输入 i 或 a 进入插入模式,在这个模式下敲击键盘会往文字缓冲区增加文字,相当于普通编辑器的编辑模式。
1. 可视模式:选择文本,可以行选、块选和依次选择,选择后可以进行复制、删除、排序等操作。
1. 命令模式:执行内部和外部命令,通过“:”“/”“?”“:!”可以进入命令模式,分别对应的是:执行内部命令、向上或向下搜索、执行外部命令。
Vim 的模式和普通的编辑器有所不同,而且命令繁多千变万化,所以初期的学习曲线较高,一旦你坚持练习并且度过了最早的平台期,就会领略 Vim 的妙和全键盘的好。事实上 Vim 除了能够快速编辑文本文件之外,还能够通过简单的命令做更多的事情。
如何帮助你度过这个陡峭的学习曲线呢?这就是极客时间开设 Vim 专栏的初衷,吴咏炜老师是前英特尔亚太研发中心资深系统架构师,是《现代 C++ 实战 30 讲》的专栏作者,也是一位深度 Vim 用户。
他会带着你掌握即学即用的 Vim 高频命令了解Vim 高阶用法和技巧,利用 Vim 脚本和插件实现常用功能,以及定制自己专属的 Vim 环境。
一旦你跟着吴老师学完了专栏,真正掌握了 Vim 这个高效率的工具,你会进入一个全新的世界,以前繁琐的编程和文本处理会变得简单有趣,如果你有兴趣,完全可以根据专栏所学的内容,定制一个强大的个性化开发工具,提升自己编程和日常工作效率。
下面我就交棒给吴咏炜老师,让我们一起开始学习吧。

View File

@@ -0,0 +1,105 @@
<audio id="audio" title="开篇词|我们为什么要学 Vim" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4d/94/4dc3400cb6740e48265a311808787294.mp3"></audio>
你好,我是吴咏炜。
今年 2 月,我在极客时间的第一门课程[《现代 C++ 实战 30 讲》](https://time.geekbang.org/column/intro/256?utm_term=zeus2M0PY&amp;utm_source=app&amp;utm_medium=geektime&amp;utm_campaign=dierji&amp;utm_content=0717)结课了。现在我给你带来了一个全新的课程《Vim 实用技巧必知必会》。
这两门课虽然主题不同,但我准备它们的初衷却是完全一样的。我在 C++ 课程里分享过,我特别喜欢 Larry Wall拉里 · 沃尔)所说的程序员的三大美德:[懒惰急切傲慢laziness, impatience, hubris](http://threevirtues.com/)。正是这些美德,驱动我们不断地追求效率和极致,而 Vim 就恰恰是这样一个效率利器。我想通过接下来的课程,和你一起享受 Vim 带来的技术乐趣。
## Vim 的“前世今生”
说到 Vim就不能不谈一下 vi要说 vi那跟 Unix 就有着千丝万缕的联系。万物起源总有那么点故事,我们这个课程的主题也不例外。这个故事可以讲上很长时间,不过,今天不是故事会时间,我只会花几分钟给你快速梳理一下这段历史,带你了解 Vim 的“前世”,也就能更好地理解它的“今生”。
故事的开头是在 1975 年秋天Unix 诞生之后的第六年。Ken Thompson肯 · 汤普逊)来到了加利福尼亚大学伯克利分校,开始了为期一年的访问教授生活。当然,他也带上了最新版本的 Unix 的补丁。根据传说由于贝尔实验室律师们的阻挠他不能直接把补丁给其他人而只能把装有补丁的磁带“丢”在某个地方然后由别人“正好”捡到……Unix 就以这种“地下”的传播方式流传开了。
同年,年轻的 Bill Joy比尔 · 乔伊)也进入了加利福尼亚大学伯克利分校,学习电子工程和计算机科学。他立刻就迷上了 Unix。在后面几年的硕士生涯里他修正了 Unix 里的 Pascal 系统,使得 Pascal 成了学生编程的缺省选择。他在 1978 年负责发布了第一个伯克利发行版BSD即 Berkeley Software Distribution其中包含了他写的 ex一个编辑器 ed 的改进版本。随即,在 1979 年他发布了第二版的伯克利 Unix2BSD包含了他写的 vi 和 csh。他独立实现了 BSD 中的 TCP/IP 栈。
离开伯克利后,他成了 Sun 的联合创始人和首席科学家,在 Solaris 操作系统、NFS 网络文件系统、SPARC 处理器、Java 语言的开发等多个领域中作出了自己的贡献……
在 Bill Joy 的无数传奇故事里,有一个是,他只花了一个周末就写出了 vi。这当然……不是真的。vi 是演进的结果,前面还有 ed、em、en、ex对于两字母的 Unix 命令,我看得也是有点晕了🤔)等等一系列。只不过,那些都是基于命令的行编辑器,而不是全屏编辑器(部分原因是那时的很多系统仍然使用着电传打字机,而不是 CRT 终端。vi 可以充分使用整个终端屏幕的资源,易用性的提升是毋庸置疑的。
不管怎么说vi 只是一个 Bill 无意插柳柳成荫的结果,是他职业生涯中的一个副产品而已。在 1982 年初Bill Joy 加入 Sun 公司之后vi 就不怎么有人维护了。此外,由于没有得到 AT&amp;T 授权的公司和个人也不能使用 vi 的源码(律师又一次发挥了威力),因此,大量的 vi 克隆版本纷纷出现。
目前大部分 Linux 发行版和 macOS 中的 vi 命令唤起的都是 Vim一个由 Bram Moolenaar布莱姆 · 穆勒纳尔)持续开发维护了三十多年的 vi 克隆(想想,三十年在计算机的发展中,那是经历了多少代技术的演进!)。在这些年里,其他的 vi 克隆诞生又死去,最后只剩下了 Vim好吧“只”是夸张手法。起初Vim 的意思是 Vi IMitation但很快就成了 Vi IMproved。而这就是我们这个课程的主题。
<img src="https://static001.geekbang.org/resource/image/9b/25/9b1e4becb3efd52b7376142bc8584c25.jpeg" alt="" title="三位大牛">
## Vim 的优势
vi 有着一个非常老古董的设计,就是它是一个有“模式”的编辑器。其他大部分编辑器都相当于 vi 的插入模式,输入什么字符就会在屏幕上出现什么字符。但 vi 的行为不是如此。
事实上,这种不那么直观的设计,即使在 vi 初次出现的 20 世纪 70 年代,也被认为是违反人机交互的原则的。所有的后续 vi 实现,包括 Vim都继承了 vi 的模式设计。
令人惊讶的恐怕是尽管有这些问题Vim 在程序员群体中的流行程度并没有受到影响。根据 Stack Overflow 的开发者调查2015 年程序员中最流行的编辑器是 Notepad++Vim 的使用比例是 15.2%2019 年最流行的开发环境变成了 Visual Studio Code而 Vim 的使用比例还保持在了 25.4%。
这就是这门课程从头到尾都会试图回答的问题Vim 到底好在哪里?
拿我自己来说,我刚开始使用 Vim 时,不是出于选择,而是在 Linux 上开发的需要。不过,用着用着我就喜欢上 Vim 了——不仅在 Linux 下用,也在 Windows 下用(从十几年前开始,我就一直自己编译和维护着一个 Windows 下的最新 Vim 可执行文件)。自打切换到了 Mac 上之后当然就更不用说MacVim 是日常打开次数最多的工具。这里面最最主要的原因,就是**使用 Vim 编辑文件非常高效**。
在很大程度上vi 的“高效”是一种历史性的设计要求,当年程序员需要在网速 300 波特大致认为是今天网速的百万分之一吧的环境里编辑文本文件。那个时代人们还不可能拥有自己的计算机大学、政府、公司里的计算机全都通过终端来进行分时共用。因此vi 在命令上不得不非常“经济”。好玩的是,这种经济性,在今天仍然非常有用,它是 vi 及其克隆软件的高效之源。
我已经强调了几遍了,编辑的高效性,就是 Vim 最大的一个特点。除此之外Vim 的优势还有很多,我来给你分享一下我认为最重要的三点。
第一,与 vi 最初只运行在 Unix 平台上不同,**Vim 是一个完全跨平台的编辑器**。
它支持的第一个操作系统是 AmigaOS然后被逐步移植到了大部分其他操作系统上既有我们常见的 Unix/Linux、Windows、macOS也有不常见或者过时的操作系统如 OS/2、BeOS、OpenVMS甚至在 iOS 和 Android 上也能找到 Vim 的移植版本。这可以算是 Vim 的一个重要优点了。这个课程里,我会介绍 Vim 在主流操作系统上的使用,包括 Linux、macOS 和 Windows。
第二,**Vim 也是一个高度可定制、可扩展的编辑器**。
这对热爱折腾的程序员来说,绝对是一种乐趣,同时也是进一步提升效率的源泉。定制 Vim ,大部分情况下,你不需要什么特殊工具,使用 Vim 本身就可以。Vim 有自己的脚本语言,就叫 Vim 脚本Vim script语法相当简单任何一个程序员应该都可以轻松地学会。配置文件和功能扩展都使用 Vim 脚本,使用统一的语法。同时,需要更强大的扩展能力还可以使用 Python、Perl、Ruby、Tcl 等其他通用的脚本语言,或者直接调用外部命令。你可以很容易打造一个你自己专属的开发环境,也很容易把这个环境从一台机器转移到另外一台机器上。
第三,作为一个发展了几十年的老牌开源软件,**Vim 也有着良好的生态环境**。
网上可以找到大量的现成脚本和插件,能帮助你打造一个顺手的开发环境。总的来说,像语法检查、自动补全等程序员常用功能,全都可以在 Vim 里实现。你不需要离开 Vim就可以完成从写代码、编译到运行的大部分工作。下面的这张图里就展示了 Vim 的很多扩展一起工作的结果:
<img src="https://static001.geekbang.org/resource/image/d7/yc/d71beed8a4e1e2b970c63f7317655yyc.png" alt="" title="多个插件作用下的 Vim 界面">
你可以看到,左边栏展示了 Vim 相对当前 Git 版本的修改状态(一处增,一处改),波浪线标出了代码中目前有错误的部分,底部显示了错误的原因,下面有个小窗口显示了光标所在处相对 Git 版本的变化状态栏里更是密密麻麻地显示了编辑器模式、Git 分支、文件名、修改状态等信息。这里面用到了好几个扩展,包括颜色主题也是一个扩展。
虽然 Vim 最初是个针对字符界面的应用程序,但它也能支持主流的图形界面,包括 Windows 的图形界面Linux 下的 GTK以及 macOS 下的 Cocoa 和 Carbon等等。作为一个并非“原教旨主义”的 Vim 用户,我个人是绝对赞成图形界面的使用的。因而我会推荐,只要有条件,就使用有图形界面的 Vim 版本。
不过这个课程的绝大部分内容是对图形界面和文本界面都有效的在两者有区别的地方我则会明确指出。换句话说在你只能使用基于字符界面进行远程连接时Vim 的功能仍然大部分有效只是界面的美观程度会受一定的影响而已。也由于这个原因Vim 在后端开发人员中特别受欢迎。
Vim 的模式是 Vim 的高效所在,但同时也是 Vim 学习上的一个难点。略有点搞笑的是Stack Overflow 上有一个目前票数达到 3840 的问题是“[如何退出 Vim 编辑器](https://stackoverflow.com/questions/11828270/how-do-i-exit-the-vim-editor)”,按问题票数排名可以进入前 100这可能就是 Vim 的模式造成的困惑了。
反过来,这个反常规的设计使得 Vim 可以使用很逻辑的多个按键来处理文本,比如,在正常模式使用 `daw` 三个按键代表 delete a word 来删除光标下的一个完整单词,也可以输入 `:` 进入命令模式使用“make”这样的完整命令来进行项目的构建。
整体来说Vim 会给你一个高效、跨平台、高定制性、易于扩展的开发环境。全面掌握 Vim 需要花费一定的时间进行学习。但这个时间不会白费,因为 Vim 可以在任何地方使用,它会成为你编程道路上一件称手的兵刃,让你成为更加高效的开发者。
## 课程主要内容
比起很多“开箱即用”的编辑器Vim 是有一定的学习曲线的。虽然学 Vim 比学编程容易多了但对于非英语母语的人来说Vim 又会难上一点点。我会尽量多讲原理,而不是枯燥地讲解命令。不得不讲命令的时候,我会使用图片和动画,让你能对相关内容有一个直观的理解。对于很多 Vim 的命令,我们是需要形成“肌肉记忆”的;我们不需要死记硬背,但需要多看、多练,熟能生巧,在学习过程中自然而然就掌握了使用 Vim 的技巧。
作为一个有历史的编辑器Vim 一直保持着非常良好的向后兼容性。学 Vim 学到的东西不会过时,在你的程序员生涯中一直可以用下去。我个人的 Vim 配置文件始于约 20 年前慢慢地添砖加瓦一直用到了今天。同时Vim 也一直在发展,虽然不快,却也从来没有停下来(从发布 8.0 版本算起,平均每天 3.7 个补丁吧)。
在这个课程中,我会基于目前最新的 Vim 8.2 来讲解 Vim 的功能。你将会学到:
- Vim 的安装
- Vim 的模式和命令
- Vim 的配置
- Vim 的使用技巧
- Vim 里的重要插件
及最最重要的
- 如何把 Vim 集成到你的工作流里,让它成为一件称手的工具,来进行高效的编辑
## 课程学习要求
我对这门课程的定位是零基础课,哪怕你以前没有用过 Vim ,也完全可以上手。这个课程不是 Vim 的百科全书,不会把 Vim 的所有命令选项,不管有用没用,全部都教给你。这是一个“新”教程,里面讲述的版本、很多技巧和插件是最近几年才有的,甚至是我在写专栏的时候才发现的。这也是一个面向实践者的教程,会让一个需要或想要使用 Vim 的开发者,从入门到精通,学会高效地使用 Vim 完成程序或其他文本文件的编辑。
虽然课程定位是零基础,但这并不意味着我对你没有任何要求。我仍然要求你在学习课程前:
- 熟悉你使用的平台上的包管理器yum、apt、brew 等;仅类 Unix 环境),知道如何完成程序的安装和卸载;
- 安装了 Git并对 Git 操作有基本的概念(不要求熟练掌握,因为我会给出大部分情况下需要的命令);
- 有一颗勇于探索的心,愿意花点力气把手里的“武器”打造得更为好用、称心。
使用 Vim 有不同的场景。在我设想的环境里,你是一个程序员,但我不对语言作出要求。课程的大部分内容完全是语言无关的,无论你使用什么编程语言开发,都应该可以获得有用的知识。
不过,如果你使用 C、C++ 或 Python 进行开发你可以得到一些额外的福利因为这些是我主要使用的语言。这三个语言的额外重要性在于Vim 的插件有可能会用到这三种语言。
如果你使用其他语言的话,就多多留言,在留言区介绍你自己使用 Vim 的情况,有啥问题和困惑一定要及时提出来,这样,我也可以更有针对性地解决你的问题;如果说得太晚了,我可能就帮不上忙了哦😁。
好了,闲话就说到这里。下一次,我们就进入正题,从 Vim 的基本安装和配置开始讲起。
我是吴咏炜,我们下一讲见。