vim 从模板创建文件
On 2012-12-03 19:25:18 By Solivim 从模板创建文件
经常会写一些小程序,比如测试程序、demo。这些程序关键代码没几行,但包含头文件、main函数体等就得敲半天。另外,在比较严格的编码规范下,每个源文件都有差不多固定的头部注释。这些情况下,如果有文件模板的话,会剩下不少麻烦。
需求
在网上搜到了几个 vim 从模板创建文件的代码或插件。经过比较后,发现有两个功能是我需要的:
根据文件类型加载不同的模板
比如,.c 文件一般是需要包含“stdio.h” 和“stdlib.h”,而 .cpp 文件一般是需要包含“string”和“iostream”。所以,我希望可以通过后缀名,加载不同的模板。
定位光标位置
从模板创建新文件并打开后,我希望立即开始写代码,而不是先移动光标到 main 函数体内。也就是说,在模板里可以定位光标的起始位置。
现有实现
下面三个链接是我搜到的三种实现方法。
- http://www.gracecode.com/posts/2414.html
- http://www.vim.org/scripts/script.php?script_id=2957
- http://codeplay.tk/blog/2012/03/05/vim-template/
它们有的可以满足我的要求但需要安装插件,有的不需要安装插件但不满足我的要求。又因为这个功能实现起来不麻烦,所以我决定自己造个轮子。
我自己的轮子
在 ~/.vimrc
中插入以下代码
""""""""""""""""""""""""""""""""""""""""""""
" 新建文件时,自动根据扩展名加载模板文件
autocmd! BufNewFile * call LoadTemplate()
fun LoadTemplate()
"获取扩展名或者类型名
let ext = expand ("%:e")
let tpl = expand("~/.vim/tpl/".ext.".tpl")
if !filereadable(tpl)
echohl WarningMsg | echo "No template [".tpl."] for .".ext | echohl None
return
endif
"读取模板内容
silent execute "0r ".tpl
"指定光标位置
silent execute "normal G$"
silent call search("#cursor#", "w")
silent execute "normal 8x"
"进入插入模式
startinsert
endfun
""""""""""""""""""""""""""""""""""""""""""""
因为我的 .vimrc 是用 bitbucket.org 的 git 库进行备份的,所以修改后我只需要在其他机器上 git pull
就可以同步了。这也是为什么我不喜欢安装额外插件的原因。
在 ~/.vim/tpl/
下新建模板文件
模板文件的路径可以修改 a 中的代码进行自定义;模板文件名为 xxx.tpl。其中,“xxx”为以此模板新建文件的文件名后缀。如,c.tpl、cpp.tpl。
另外,新建文件后,光标的默认位置用 #cursor#
标记。
下面是一个 c.tpl 的例子(~/.vim/tpl/c.tpl
):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
printf(#cursor#);
return 0;
}
已知 bug
光标定位符 #cursor#
在行末时,光标定位会出现偏差,定位到下一行。