很多程序员,包括我,会在写代码的时候,习惯性的用TODO, FIXME, HACK等作为一些注释的前缀。这样方便自己和后来者预先知道相关注释和代码的状况
不过这样的备注只有是以后恰巧看到这段代码的时候才能看到,没法在一次发版或者空闲的时候,有一个直观的界面能看到这个项目里面所有这样的关键词。
这个时候一个简单的自定义命令兴许能帮到你:
command Todo Ack! 'TODO\|FIXME'
效果如下:
不过要想使这条命令生效,需要一些环境准备工作
Ack
首先我们需要安装Ack
或者Ag
,这两个都是命令行下的一个全局搜索工具,比系统自带的grep
要快很多的。
这里的安装以Ag
为例,因为这个是基于C来重写的Ack
并新增了很多特性,效率也是比Ack
快了很多的。
# OSX
brew install the_silver_searcher
# Archlinux
pacman -S the_silver_searcher
# Ubuntu
apt-get install silversearcher-ag
在安装完成之后,就可以在shell里面测试一下
ag TODO ./
Ack.vim
Ack.vim是一款插件,用来方便在Vim里面使用Ack
/Ag
,
然后通过Quickfix来提供搜索结果
不过这款插件,默认是使用的Ack
作为搜索引擎,为了能用上我们刚刚安装的Ag
,需要在~/.vimrc
里面作一些配置:
if executable('ag')
let g:ackprg = 'ag --vimgrep'
endif
这段配置是引用的官方仓库的Readme
不过也看很多人是用的
if executable('ag')
let g:ackprg = 'ag --nogroup --nocolor --column'
endif
本人测试之后,发现二者并没有什么区别。可能对于Ag
来说 --vimgrep
是等同于--nogroup --nocolor --column
的。
这个时候在Vim的命令行里面输入
:Ack! TODO
是可以实现上图所示效果的,而且还可以通过
:AckAdd FIXME
这样的方式来附加其它要查看的。
不过这样的方式,命令还是有点长。所以配置一个alias来替代上面的命令,是一个比较符合懒人的想法 在~/.vimrc
里面新增
command Todo Ack! 'TODO\|FIXME'
然后在Vim的命令行里面输入:
:Todo
就能实现列出当前项目里面的所有TODO,FIXME了,而且可以根据自己的需要来扩展这样的关键字,像我就扩展为如下代码:
command Todo Ack! 'TODO|FIXME|CHANGED|BUG|HACK'
command Debug Ack! 'NOTE|INFO|IDEA'
区分了Todo和Debug两种功能。
高亮
Vim里面会自动的高亮TODO、FIXME,但是不会高亮CHANGED这样的关键字,所以需要手动的来指定一下,在~/.vimrc
里面添加如下配置:
if has("autocmd")
" Highlight TODO, FIXME, NOTE, etc.
if v:version > 701
autocmd Syntax * call matchadd('Todo', '\W\zs\(TODO\|FIXME\|CHANGED\|BUG\|HACK\)')
autocmd Syntax * call matchadd('Debug', '\W\zs\(NOTE\|INFO\|IDEA\)')
endif
endif
上面这段代码是摘抄的,具体的功能就是匹配TODO等关键字,然后加上语法高亮。
综上,一个简单好用的TODO管理器就已经完成了。
参考资料
上文里面的绝大部分代码都是从以下资料里面摘抄拼凑的,对于Vim,我还只是一个懵懵懂懂的拿来主义者。
- https://coderwall.com/p/prfnnw/vim-to-do-list
- https://stackoverflow.com/questions/6577579/task-tags-in-vim
- http://harttle.com/2015/12/21/vim-search.html
- https://github.com/mileszs/ack.vim
- http://betterthanack.com/