很多程序员,包括我,会在写代码的时候,习惯性的用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里面会自动的高亮TODOFIXME,但是不会高亮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,我还只是一个懵懵懂懂的拿来主义者。

  1. https://coderwall.com/p/prfnnw/vim-to-do-list
  2. https://stackoverflow.com/questions/6577579/task-tags-in-vim
  3. http://harttle.com/2015/12/21/vim-search.html
  4. https://github.com/mileszs/ack.vim
  5. http://betterthanack.com/


" Configuration file for vim
set modelines=0     " CVE-2007-2438

" Normally we use vim-extensions. If you want true vi-compatibility
" remove change the following statements
set nocompatible    " Use Vim defaults instead of 100% vi compatibility
set backspace=2     " more powerful backspacing

" Don't write backup file if vim is being called by "crontab -e"
au BufWrite /private/tmp/crontab.* set nowritebackup
" Don't write backup file if vim is being called by "chpass"
au BufWrite /private/etc/pw.* set nowritebackup

" 自动语法高亮
syntax enable 
set background=dark
colorscheme Guardian



" 突出显示当前行
" set cursorline

" 显示行号
set number

" 用空格代替制表符
set expandtab

" 设定 tab 长度为 4
set tabstop=4

" 统一缩进为4
set softtabstop=4

" 自动缩进的宽度
set shiftwidth=4

" 智能自动缩进(这个东西实际用处不大,因为只是针对简单文本的)
" set autoindent

set smartindent

" 让filetype-plugin根据文件类型自动缩进(这个必须要,它会根据文件类型自动配置缩进,插件在安装vim的时候已经装好了)
filetype plugin indent on

" 在行和段开始处使用制表符
set smarttab

"搜索忽略大小写
set ignorecase

"搜索逐字符高亮
set hlsearch
set incsearch

"代码补全
" 关掉智能补全时的预览窗口
" set completeopt=longest,menu
" vim7.3中已经集成了omnicppcomplete了
set omnifunc=omni
" omnicppcomplete配置 关闭兼容模式
set nocp
" 打开文件类型检测,加了这句才可以用智能补全
filetype plugin on
set ofu=syntaxcomplete#Complete
"共享剪贴板
"set clipboard+=unnamed

" 实现 (、[、{、"、'  输入后自动补全右边部分,光标也会位于中间位置
inoremap ( ()i
inoremap [ []i
inoremap { {}i
inoremap < <>i
inoremap " ""i
inoremap ' ''i

" 高亮显示匹配的括号
set showmatch

" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1


"保存.vimrc文件后会自动调用新的.vimrc
autocmd! bufwritepost _vimrc source $VIM/_vimrc


" 代码折叠
set foldmethod=marker


" 状态栏显示目前所执行的指令
set showcmd


" 行号和标尺
set number
set ruler
set rulerformat=%15(%c%V %p%%%)


" 设置less文件的高亮
au BufNewFile,BufRead *.less set filetype=less


" 始终显示状态行
set ls=2 
"命令行补全以增强模式运行
set wildmenu