Vim自动修改最后更新时间

我们在编辑一些源代码文件时,常会在文件头部的注释中加上一行类似于“Last Update: 2010-10-22 16:09:14”的内容,用于记录这个文件最后更新的时间。不过麻烦的是默认状态下这行内容不会自动更新,必须要你每次改动文件后手动修改它的时间为当前时间,要是它能自动更新该多好。

某些 IDE 中应该实现了这样的功能,不过对于 VIMer 来说,这个功能也可以自己打造。下面是我写的一段脚本。

" 自动更新文件的最后更新时间
function! AutoUpdateTheLastUpdateInfo()
	let s:original_pos = getpos(".")
	let s:regexp = "^s*([#"*]|//)s?[lL]ast ([uU]pdate|[cC]hange):"
	let s:lu = search(s:regexp)
	if s:lu != 0
		let s:update_str = matchstr(getline(s:lu), s:regexp)
		call setline(s:lu, s:update_str . strftime(" %c"))
		call setpos(".", s:original_pos)
	endif
endfunction
autocmd InsertLeave *.{py,c,js,css},*vimrc call AutoUpdateTheLastUpdateInfo()

将上面这段脚本放到你的 .vimrc 或 _vimrc 文件中即可,每次你退出编辑状态(目前绑定了 py、c、js、css 等后缀名的文件)时,这段脚本会被触发,寻找当前文件中第一个形如“# Last Update: …”或“// Last Change: …”的文字,并把它后面的时间改为当前时间,如果没有找到,则什么操作也不做。

你也可以更改上面的正则,让它匹配你的“Last Update”文案,或者修改文件名规则,让它能适用于你常用的文件,也可以修改 InsertLeave 为其它事件,比如 BufWritePre,以便在每次写入缓存时更新时间。

目前这个版本有一个不足是只会在每次退出编辑状态时执行自动更新,无论这时文件是否有修改。比如如果你打开一个 py 文件,按 i 进入了编辑状态,什么也没改马上就按 <ESC> 退出了,这时 Last Update 时间也会被修改为当前时间,另外,如果你只是使用 r 替换了一个字符,虽然文件被更改了,但由于没有进入过编辑状态,它也不会自动更新最后更新时间。我曾想在更新这个时间之前先检查当前文件是否有过改动,但找了半天没找到这个方法,哪位朋友如果知道的麻烦告诉我一下,呵呵。

2 Replies to “Vim自动修改最后更新时间”

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s