autocmd

autocmd 用于配置当某个确定事件发生时, 要执行的命令.

借用书中的例子, 看一下 autocmd 的基本结构:

:autocmd BufWritePre,BufRead *.html :normal gg=G
^ ^ ^
| | |
| | 需要执行的命令
| |
| 模式, 用来过滤事件
|
监听的事件

这里 BufWritePre, BufRead 都是需要监听的事件, *.html 是需要过滤的模式, 整个命令的含义就是, 当开始写入 html 类型文件或者编辑 html 类型文件之前, 自动执行:normal gg=G, 也就是缩进代码.

[此处, BufWritePre 指的是开始将整个 Buffer 写入文件 , BufRead 指的是读文件后, 开始编辑. ]

通过:h autocmd-events 可以查看所有可以绑定 Autocommands 的事件列表.

其中, 最常用的 Event 是 FileType.

比如:

:autocmd FileType javascript nnoremap <buffer> <LocalLeader>c I//<esc>

当打开一个javascript (.js)文件时, 执行nnoremap <buffer> <LocalLeader>c I//<esc>, 也就是按 <LocalLeader>c 会添加注释.

这里提一个简单的应用.

Vim中编辑 json 文件的时候, 默认是没有格式化的, 如何实现打开JSON文件时, 自动格式化内容, 方便阅读?

这里说一下我的做法.

安装 jq, 附上链接download

修改 .vimrc , 添加:

autocmd BufRead *.json %!jq '.'

source 后, 打开 json 格式文件时, 可以看到已经格式化了.

autocmd 有一个兄弟 augroup. 可以把相近的 autocmd 放在一个group 中:

augroup testgroup
autocmd!
autocmd BufWrite * :echom "Cats"
augroup END

这里使用autocmd! 来清理之前的 autocmd 设置.

augroup 的作用, 是用来避免重复定义 autocmd. 官网文档给到的解释是:

This prevents having the autocommands defined twice (e.g., after sourcing the .vimrc file again).

书中使用了一个 BufWrite + echom 的例子来说明使用 augroup 可以避免的问题, 同文档提到的一致, 这里就不细说了.

附上一个小小的tips. 如果你有执行 augroup 的例子, 会发现 messages 有些多, 想要清理的话, 可以使用:messages clear

OK, 本章结束.

Bye 2021.