如何将模板代码自动插入在特定目录中创建的具有特定扩展名的新文件中?

时间:2019-01-19 14:23:58

标签: vim neovim

我在~/project有一个项目目录。在该项目目录下,也有许多子目录。我试图做的是,每当我在特定目录中创建一个c ++文件(这意味着扩展名为.cc,.cpp,.h等文件)时,都会自动将某些代码模板插入该文件中。

模板具有给定的形式:

/* 
 * Author :  Name
 * Date   :  Sat Jan 19 12:42:56 IST 2019 (:r!date)
*/  

通常,日期将是该文件的创建日期,可以使用:r!date插入。

到目前为止,我提出的想法是创建一个template.vim文件,其内容如下:

call setline(1, '/*')
call setline(2, 'Author : ')
" the line below is a blunder. but i hope you get the gist of what im trying.
call setline(3, 'Date : '+ execute "normal! :r!date")
call setline(4, '*/')  

然后直到创建新的c ++文件时采购模板文件,就像这样:

autocmd BufNewFile *.cc,*.cpp,*.h source ~/.vim/ftplugin/template.vim  

我如何才能有效地添加条件来检查我的〜/ project 目录或其任何子目录中文件的创建情况(扩展名为c ++文件),并将上述模板与具体日期和格式?还有如何仅在创建新文件而不是现有文件时插入它?

1 个答案:

答案 0 :(得分:1)

首先:有模板插件,您应该在网上搜索“ vim模板插件”。也许您发现有用的东西。

如果您想自己做:

像这样创建模板文件(我以~/tmpl/tmpl.cpp为名称):

/* 
 * Author :  <<name>>
 * Date   :  <<date>>
 */

并在您的vimrc中:

function AddTemplate(tmpl_file)
    exe "0read " . a:tmpl_file
    let substDict = {}
    let substDict["name"] = $USER
    let substDict["date"] = strftime("%Y %b %d %X")
    exe '%s/<<\([^>]*\)>>/\=substDict[submatch(1)]/g'
    set nomodified
    normal G
endfunction

autocmd BufNewFile *.c,*.cc,*.cpp,*.h call AddTemplate("~/tmpl/tmpl.cpp")

set nomodified告诉Vim文件没有被修改。这样,只要您不添加其他文本,就可以使用:q退出文件。如果输入了错误的文件名,则很有用。

如果只想对特殊目录~/project中的文件执行操作,则可以在函数AddTemplate的开头添加以下内容:

let fully_qualified_file = expand('%:p')
if 0 != match(fully_qualified_file, $HOME . '/project/.*')
    return
endif