之前在前东家为了完成每年的技术交流KPI任务,给公司里几个爱好者搞了个vim入门讲座。刚好有几页slides似乎对题,拿出来说说。
题主要动力,那就先洗一波脑,说说用VIM有啥好处。
首先是普及度,全平台制霸,除了windows其他主流系统基本预装。ipad里能用,安卓里也能用

其次各种IDE和主流编辑器都有vim模拟器,一次学习到处使用


大部分IDE和开发用的编辑器都能很方便地配置一键开vim(在纯vim里打开当前文件并且光标移动到同一位置),也就是说万一模拟器搞不定的功能,随时可以跳到纯vim里干。完事之后保存退出返回原本的IDE或者编辑器即可,由于vim启动速度极快,整个过程非常流畅。

动图尺寸太大显示不出来,具体例子可以看我的这个回答
同理,由于vim启动或退出都极快,我们可以轻易搞一个全局脚本,在任何输入框中开vim编辑,利用vim的编辑功能。


当然在网页文本框里嵌入vim(neovim)也是可以的。chrome的neovim插件比较酷炫但其实个人感觉还是有点坑(偶有泄露,nvim实例没有正常关闭),实际工作中我一般用 wasavi
总之还是那句,一次学习到处使用。就这一点在我看来无论学习曲线多高其实都已经值回票价了。
其他vim的使用细节就不一一谈了,题目问为什么vim在熟练的人手中会(看上去)神乎其技。我在交流课件中总结了三条(自以为的)“vim理念”:
第一,vim主打按键序列作为快捷键,而非使用组合功能键。

组合键的主要问题是,如果要使用全键盘流快捷键,功能一多,再考虑到快捷键的设置要有一定的表义,字母键不够用。而手指要一直按住功能键导致按键序列不能过长(一般二级快捷键到顶了),更多的组合花样只能在功能键上玩,windows有三个功能有7种按法,MacOS有四个功能键11种按法,问题功能键本身是不表义的,结果又回到了老问题上,记不住。
而按键序列本质上没有这样的问题,可以在保证表义的前提下可以有无限多种组合。无非就是常用的设短一点,不常用的搞长一点,慢慢按总比用鼠标选菜单快。比如我在IDE里“开纯vim”的快捷键就设成 `空格-v-i-m-空格`,五个键,但按起来非常顺手也很快。
近两年年纪大了小尾指感觉有点劳损,我干脆就把IDE的快捷键大部分都配成了空格打头空格结尾的按键序列,既表义按得又舒服。比如说我的intellij配置

你在旁边看我劈里啪啦一通乱敲全都是快捷键好像很牛逼哄哄,其实很好记,根本没啥心智负担。
第二,类似编程的编辑体验

这是吸引程序员的大杀器。使用vim编辑时,不要看成自己在码字,而是在用各种短命令去变换一坨数据(文本)。这一页列了几个我认为比较有代表性的点:
1) 使用一些基本元素来组合成复杂操作。比如说 【ciw】 (change in word)包含了三个元素,组成一个“修改当前单词”的操作,每个元素都可以自由替换,例如【diw】 (delete in word), 【caw】 (change a word), 【ci”】 (change in ” )。看似花样很多其实组合逻辑很清晰。
另一个角度是,在vim里有些操作直接记组合比“记单个命令再组合”更自然。比如说,【xp】直接看成“交换两个字符”的固定组合,比看成“我先删除一个字符,再把它粘贴到下一个字符后面”要自然。同理交换两行,直接记【ddp】,在当前单词前加入字符,直接记【bi】,之后加字符直接记【ea】
还有一点值得一说的是,vim的指令设置是按照其逻辑脉络形成体系的,而不是根据具体需求进行功能拼凑。举例来说,vim里有个【r】指令,作用是不进入插入模式,直接替换光标上的单个字符。这个命令对于一些小修改,比如说大于号写错了改成小于号,减号改成下划线之类很好用。但是在选中模式下,它的效果是把所有选中的文本都改成同一个字符。逻辑上看,非常自然。选择文本后执行一些行级命令,就是对范围内每一行都执行该命令。那选择文本后执行字符级的修改命令,当然是对文本内每一个字符都执行该命令了。但有很长一段时间我都觉得这个特性没啥用。通常在用到重复单个字符的场景我都知道要用多少个,那如果我要用20个单一字符覆盖光标后的文本,我可以用【20R】,为啥要先选中20个,再一次性替换。直到有一天我看到有人这样写 markdown 的标题:

没想到这是个文本下划线的终极解决方案,但你要说当年r指令的设定是冲着这个用法来的,我是不信的。同样的道理,vim里你常常会发现有一些顺理成章但看似没啥用的设定,突然有一天在某个场景有奇效,连装插件都省了。
2)有丰富的定位和限定作用范围的命令
比如说到行首就有两种精确的定位命令,到绝对首列的 【0】,到第一个非空字符的【_】和【^】。到下一行默认的【j】是“无视软回车(word wrap)移动到下一个绝对行号”,还有到“下一个可视行”的【gj】(我在配置里把它们换过来了)。还有【f】【F】【t】【T】【W】【E】【{】【}】等等一堆定位指令。
这么花里胡俏有什么用?方便录宏(macro)。录宏三步曲:【对齐定位、操作、下一个】。大部分IDE和编辑器虽然也有录宏重播的功能,但没提供好用的对齐定位功能,宏功能就变成了鸡肋。辛辛苦苦录好一个宏,换个位置文本结构有一点不同,就没法用了。
而在vim里,录宏不仅轻量方便。【qq】就可以开录,【@q】重放,很顺手。重要的是,由于对齐定位特性丰富,宏可以适应很多场景。比如说,我知道一个字符串里有【lambda】这个单词,我希望把这个字符串里的第二个括号里的内容改成【x+1】。那我的录宏策略可以是:
1、对齐定位:【/lambda回车qqF”f(%f(】 (查找lambda,qq开始录宏,首先对齐,反向在当前行搜索前一个双引号,对齐到字符串开始位置。然后定位,正向在当前行搜索下一个(,匹配另一边括号移动到第一个括号结尾处,再在当前行搜索下一个左括号,定位到“第二个括号”)
2、操作:【ci(x+1】(修改括号内内容)
3、下一个:【n】(查找下一个lambda)
4、结束录制:【q】
然后按【@q】,接着一直按【@@】重复播放就行了。
不熟悉vim的人在旁边看可能都没留意到我录了宏在回放,只会觉得从第二个开始我的操作速度突然变快了,突然就全部搞完了。
在我的角度看,我相当于在极短时间内用vim的编辑命令写了个小程序在重复执行。这也是用vim的一个小原则:尽量习惯使用对齐定位的功能移动光标,避免过多使用没有适普性的hjkl。
3)大部分命令都可以看着是一个函数,接受【数字】【动作】【文本对象】作为输入参数。数字通常表示“重复执行”。这个就不细说了,简单入门vim之后都懂。
4)使用 :norm 命令,有时配合 :global 命令,可以直接用编辑命令显式写“代码”。这个这里也不深入说了,可以看normal和global命令的文档或相关资料。
值得一提的是,在选中文本状态下,norm命令会对被选中的每一行执行指定的编辑命令。可以用来在一些简单场景代替宏,或者用来快速回放宏。
比如说,要在选中文本的每一行的结尾加逗号: 执行【:norm A,】即可。
录了一个单行范围的宏要在选中文本的每一行上回放,执行【:norm @q】即可。
这些操作全都非常贴合程序员的思路。
======================
(先写这些,时间有限,还有第三点“整合命令行”以后再补)
来源:知乎 www.zhihu.com
作者:知乎用户(登录查看详情)
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载
此问题还有 29 个回答,查看全部。
延伸阅读:
怎么向新手解释 Emacs?