Vim - 如何使用 autocmd 和模板文件在新文件的行首插入反斜杠
Vim - How to insert a backslash at the start of a line in a new file using autocmd and a template file
我按照本指南自动将不同的 header 模板插入到基于文件扩展名的不同类型的新文件中:
效果很好!我有一个用于 python 源文件的自定义 header,当我打开一个新的 .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 命令序列。
如果您查看 :help :insert
,它是这样说的:
Watch out for lines starting with a backslash, see
line-continuation.
在 link 到 line-continuation
之后说明 \
是一个连续字符,可以通过将 C
标志传递给 cpoptions
来覆盖它。
如果您按如下方式更改模板,它应该会起作用:
:set cpo+=C
:insert
\documentclass[a4paper,12pt]{article}
.
:set cpo-=C
您可能需要考虑使用像 vim-snipmate or (my favorite) ultisnips 这样的代码片段引擎。通过这些,您可以在任何地方 插入文本片段,而不仅仅是在文件的开头。
作为奖励,这些片段可以例如替换变量甚至 运行 命令。以下是我的代码片段(用于 ultisnips)设置为生成 TeX 文件的 header;
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")`
[=10=]
endsnippet
这将自动填写文件名和上次修改文件的时间。它用默认值填充我的名字和 e-mail,但让我有机会覆盖它们。 fcdate
函数是我编写的一段 Python 代码,用于检索文件的出生时间。
我为几种不同的文件类型定义了 hdr
片段,还有一个用于所有其他文件的通用片段。如果我在行首键入 hdr
tab,则会展开相应的片段。
我按照本指南自动将不同的 header 模板插入到基于文件扩展名的不同类型的新文件中:
效果很好!我有一个用于 python 源文件的自定义 header,当我打开一个新的 .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 命令序列。
如果您查看 :help :insert
,它是这样说的:
Watch out for lines starting with a backslash, see line-continuation.
在 link 到 line-continuation
之后说明 \
是一个连续字符,可以通过将 C
标志传递给 cpoptions
来覆盖它。
如果您按如下方式更改模板,它应该会起作用:
:set cpo+=C
:insert
\documentclass[a4paper,12pt]{article}
.
:set cpo-=C
您可能需要考虑使用像 vim-snipmate or (my favorite) ultisnips 这样的代码片段引擎。通过这些,您可以在任何地方 插入文本片段,而不仅仅是在文件的开头。
作为奖励,这些片段可以例如替换变量甚至 运行 命令。以下是我的代码片段(用于 ultisnips)设置为生成 TeX 文件的 header;
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")`
[=10=]
endsnippet
这将自动填写文件名和上次修改文件的时间。它用默认值填充我的名字和 e-mail,但让我有机会覆盖它们。 fcdate
函数是我编写的一段 Python 代码,用于检索文件的出生时间。
我为几种不同的文件类型定义了 hdr
片段,还有一个用于所有其他文件的通用片段。如果我在行首键入 hdr
tab,则会展开相应的片段。