autocmd {event} {pattern} {cmd}
Events: There are more than 40 autocmd events. Following are few sample autocmd events.
BufNewFile - Starting to edit a file that doesn't exist. FileReadPre - Before reading a file with a ":read" command. BufWritePre - Starting to write the whole buffer to a file. FileWritePre - Starting to write part of a buffer to a file. BufDelete - Before deleting a buffer from the buffer list. BufWipeout - Before completely deleting a buffer. BufNew - Just after creating a new buffer. BufEnter - After entering a buffer. BufLeave - Before leaving to another buffer. SwapExists - Detected an existing swap file.
Most of the developers want some default header for their programs. Lets take an example. When opening a “.c” file, you need a file header which has author, filename etc.. Consider that I need the following template to be loaded automatically while opening a new “.c” file. You can achieve this in three steps as mentioned below.
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : 1.c * Purpose : * Creation Date : 22-12-2008 * Last Modified : Mon 22 Dec 2008 10:36:49 PM PST * Created By : _._._._._._._._._._._._._._._._._._._._._.*/
Save the above template in a text file with “:insert” in the first line, followed by the template and a “.”(dot) in the last line as shown below.
$ cat c_header.txt :insert /* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : * Purpose : * Creation Date : * Last Modified : * Created By : _._._._._._._._._._._._._._._._._._._._._.*/ .
Add the following lines in the ~/.vimrc file.
$ cat ~/.vimrc autocmd bufnewfile *.c so /home/jsmith/c_header.txt autocmd bufnewfile *.c exe "1," . 10 . "g/File Name :.*/s//File Name : " .expand("%") autocmd bufnewfile *.c exe "1," . 10 . "g/Creation Date :.*/s//Creation Date : " .strftime("%d-%m-%Y") autocmd Bufwritepre,filewritepre *.c execute "normal ma" autocmd Bufwritepre,filewritepre *.c exe "1," . 10 . "g/Last Modified :.*/s/Last Modified :.*/Last Modified : " .strftime("%c") autocmd bufwritepost,filewritepost *.c execute "normal `a"
Now, when you create a new *.c file using vim, this will automatically add the header defined in the Step1 and populate the File Name and Creation Date automatically as shown below.
$ vi myfile.c /* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : myfile.c * Purpose : * Creation Date : 20-12-2008 * Last Modified : * Created By : _._._._._._._._._._._._._._._._._._._._._.*/
When you save the myfile.c file, it will automatically update the Last Modified field accordingly as shown below.
$ vi myfile.c /* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : myfile.c * Purpose : * Creation Date : 20-12-2008 * Last Modified : Sat 20 Dec 2008 09:37:30 AM PST * Created By : _._._._._._._._._._._._._._._._._._._._._.*/
$ cat -n ~/.vimrc 1 autocmd bufnewfile *.c so /home/jsmith/c_header.txt 2 autocmd bufnewfile *.c exe "1," . 10 . "g/File Name :.*/s//File Name : " .expand("%") 3 autocmd bufnewfile *.c exe "1," . 10 . "g/Creation Date :.*/s//Creation Date : " .strftime("%d-%m-%Y") 4 autocmd Bufwritepre,filewritepre *.c execute "normal ma" 5 autocmd Bufwritepre,filewritepre *.c exe "1," . 10 . "g/Last Modified :.*/s/Last Modified :.*/Last Modified : " .strftime("%c") 6 autocmd bufwritepost,filewritepost *.c execute "normal `a"