Vim - 如何使用autocmd和模板文件

时间:2015-11-02 18:23:07

标签: vim latex tex autocmd

我按照本指南自动将不同的标题模板插入到基于文件扩展名的不同类型的新文件中:

http://www.thegeekstuff.com/2008/12/vi-and-vim-autocommand-3-steps-to-add-custom-header-to-your-file/

效果很好!我有一个python源文件的自定义标头,当我打开一个新的.py文件时会自动插入。

我想做类似的事情,以便在打开新的.tex文件时插入基本的LaTeX模板......

除非我无法让它发挥作用......

我的〜/ .vimrc说:

autocmd bufnewfile *.tex so /home/steve/Work/tex_template.txt

和我的tex_template.txt说:

:insert
\documentclass[a4paper,12pt]{article}
.

但是当我打开一个这样的新文件时:

vim test.tex

(其中test.tex尚不存在)

我明白了:

"test.tex" [New File]
Error detected while processing /home/steve/Work/tex_template.txt:
line    2:
E492: Not an editor command: :insertdocumentclass[a4paper,12pt]{article}
Press ENTER or type command to continue

问题似乎与行开头的反斜杠有关,因为如果我从tex_template.txt中删除反斜杠,则新文件会打开,其中包含documentclass [a4paper,12pt] {article}。除非我需要反斜杠,否则它不是tex命令序列。

2 个答案:

答案 0 :(得分:4)

如果你看:help :insert,就会说:

  

注意以反斜杠开头的行,请参阅   行继续。

点击line-continuation的链接说明\是一个延续字符,可以通过将C标记传递给cpoptions来覆盖该字符。

如果您按如下方式更改模板,它应该有效:

:set cpo+=C
:insert
\documentclass[a4paper,12pt]{article}
.
:set cpo-=C

答案 1 :(得分:1)

您可能需要考虑使用代码vim-snipmate或(我最喜欢的)ultisnips这样的代码段引擎。有了这些,您可以在任何地方插入文本的片段,而不仅仅是在文件的开头。

作为奖励,这些片段可以是例如替换变量甚至运行命令。以下是我的片段(用于ultisnips)设置为生成TeX文件的标题;

snippet hdr "File header for LaTeX" b
% file: `!v expand('%:t')`
% vim:fileencoding=utf-8:ft=tex
%
% Copyright © `!v strftime("%Y")` ${1:R.F. Smith} ${2:<my@email>}. All rights reserved.
% Created: `!p snip.rv = fcdate(path)`
% Last modified: `!v strftime("%F %T %z")`

$0
endsnippet

这将自动填写文件名和上次修改文件的时间。它使用默认值填写我的姓名和电子邮件,但让我有机会覆盖它们。 fcdate函数是我编写的一段Python代码,用于检索文件的生成时间。

我为几种不同的文件类型定义了hdr代码段,以及用于所有其他文件的常规代码段。如果我在行的开头键入hdr tab ,则会展开相应的代码段。