vim 从模板创建文件

经常会写一些小程序,比如测试程序、demo。这些程序关键代码没几行,但包含头文件、main函数体等就得敲半天。另外,在比较严格的编码规范下,每个源文件都有差不多固定的头部注释。这些情况下,如果有文件模板的话,会剩下不少麻烦。

需求

在网上搜到了几个 vim 从模板创建文件的代码或插件。经过比较后,发现有两个功能是我需要的:

  1. 根据文件类型加载不同的模板

    比如,.c 文件一般是需要包含“stdio.h” 和“stdlib.h”,而 .cpp 文件一般是需要包含“string”和“iostream”。所以,我希望可以通过后缀名,加载不同的模板。

  2. 定位光标位置

    从模板创建新文件并打开后,我希望立即开始写代码,而不是先移动光标到 main 函数体内。也就是说,在模板里可以定位光标的起始位置。

现有实现

下面三个链接是我搜到的三种实现方法。

  1. http://www.gracecode.com/posts/2414.html
  2. http://www.vim.org/scripts/script.php?script_id=2957
  3. 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# 在行末时,光标定位会出现偏差,定位到下一行。

Creative Commons License Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 4.0 International license .