Abbreviations

Vim 的 Abbreviations 特性, 同 mappings 有些相似, 但是主要用于插入, 替换.

这里按照原书的思路简单说一下应用.

先来看个例子.

在命令行模式下, 输入:

:iabbrev ned end

然后在insert 模式下, 输入 ned 后回车或者退出insert 模式, 会发现 ned 已经变成了 end. [多嘴一句: 为什么是insert 模式下呢? 因为iabbrev 前面有个i….]

这个功能可以很方便纠正一些拼写错误.

鉴于我常常容易打出 ned, 所以我把这个 iabbrev 放在了 .vimrc 中. 哈哈.

不过需要注意的是, 用 abbreviation 替换的, 不可以是关键字 keyword, 包括所有的 ASCII 字符, 下划线(_)等.

可以通过:h isfname 来查看 Vim 中的所有关键字.

为了省去大伙看文档懵逼的时间, 作者在文中贴心地给了一个简单的记忆方法: 用 abbreviation 来替换的, 不可以是单个字母, 数字或者下划线.

说到这里, 你大概会猜, 支持扩展缩略的插件, 比如 mattn/emmet-vim 应该是 Abbreviations 的一个典型应用吧.

我当时就是这么想的, 屁颠屁颠跑去看 mattn/emmet-vim 的源代码想验证下猜想, 结果发现没有 iabbrev 的身影, 取而代之的是 substitute() 函数.🤪 [核心代码都在autoload目录下, 如果你也好奇的话….]

切回 Abbreviations.

如果想要清除刚刚的缩写设置, 可以使用:

:iunabbrev ned

如果想要清除所有的缩写设置, 可以使用:

:abclear

其中, ababbrev 的缩写形式….

上面 ned 那个例子里, 用mapping 也可以实现一样的功能.

:inoremap ned end

那为什么不用 mapping呢?

因为 mappings 不会考虑需要替换的字符的上下文情况.[Mappings don’t take into account what characters come before or after the map]

作者在书中给了个例子. 但是这个例子很奇怪, inoremap 无效.

所以, 我来整了个简单点的.

在命令行模式下, 输入:

:inoremap log logger.debug

在 insert 模式下, 输入 log, log会自动更换成 logger.debug, 但是当你输入 blog 时, 发现也被自动替换成了blogger.debug.

这显然不是我们想要的.

换成 iabbrev 就可以避免这个坑.

:iunmap log
:iabbrev log logger.debug

此处用 iunmap 来清除刚刚设置的mapping.

这时在 insert 模式下, 输入 blog, 发现不会被替换了.

Bravo~

OK, Abbreviations 可以告一段落. 自己试着写几个 abbrev 来帮助更正拼写吧😄️