Visual Studio .NET 代码模板插件






4.90/5 (65投票s)
2002 年 11 月 11 日
13分钟阅读

497335

1157
一个 Visual Studio .NET 插件,提供了一种插入常用代码片段的机制。
版本 1.9 - RC3 最新消息?
引言
Code<Template>.NET 是 Visual Studio .NET 的一个插件,它提供了一种将常用文本片段插入到源代码中的机制。它基于 Michael Taylor 对 Darren Richard 最初的 CodeTmpl 插件的扩展,我在 http://www.codeguru.com/mfc/comments/9606.shtml 的添加中提出的想法。
与原始 CodeTmpl 插件的主要区别是
- 支持 Visual Studio .NET。
- 用 C# 从头重写。
- 更干净的文件格式。
- 关键字、环境和提示的可替换值。
- 预定义和 .NET 标准格式化器。
Code<Template>.NET 使用的文本片段包含在名为 *CodeTmpl.*(其中 * 是特定语言的扩展名)的文件中,这些文件位于用户的漫游配置文件中。这些文件最初是从位于插件可执行文件相同目录下的示例文件中复制的。这些文本文件的格式非常简单:命名块包含将插入到源代码中的文本片段。除了直接插入的文本之外,这些片段还可以包含表示可替换关键字和提示值的标签。这些命名块将显示在 Code<Template>.NET 工具栏按钮的菜单和子菜单中。当您单击其中一个菜单项时,相应的文本片段将被插入到活动窗口的插入点。
配置
模板文件是完全可配置的,因此您可以替换或更改默认文本片段以满足您自己的需求。模板文件的格式非常简单。基本上,您将代码块粘贴到文件中,并用 **菜单打开**(`#{`)和 **菜单关闭**(`}#`)标签将其包围起来。菜单打开标签后面应跟着将显示在弹出菜单上的名称。菜单打开标签还可以包含一个用竖线(`|`)分隔于显示名称的菜单 ID;此菜单 ID 用于通过按 **Ctrl+Enter** 将模板直接插入编辑器。菜单打开标签和菜单关闭标签之间的任何文本都将按原样复制到文本编辑器中。菜单项可以嵌套,从而创建模板的层次视图。您还可以通过在要用作访问键的字符前放置一个“**&**”字符来指定访问键。例如,要将“File”中的“F”指定为访问键,您应将菜单名称的标题指定为“&File”。您可以使用此功能为模板提供键盘导航。 **分隔符**(`##`)标签可用于分隔菜单项,行首的 **感叹号**(`!`)用于单行注释。
可以通过添加以“`#include`”开头后跟文件名的一行来包含其他模板文件。如果文件名没有绝对路径,则会在用户漫游配置文件相对于基础模板文件的位置中搜索该文件。包含语句只能插入在菜单和子菜单定义之间。
例如
#{Hello World - &Console|hwc #include <iostream> int main() { std::cout << "Hello, new world!\n"; } #} ########################## #{Hello World - &GUI|hwg #include <WinUser.h> int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCommandLine, int cmdShow) { MessageBox(NULL, "Hello, World", "Example", MB_OK); } #}
如果您的模板文件包含上述文本,那么单击 CodeTmpl 工具栏按钮将显示一个弹出菜单,其中包含“Hello World - Console”和“Hello World - GUI”选项,它们之间有一个分隔符。选择“Hello World - Console”会将'`#{`'和'`#}``'标签之间的文本粘贴到您的源代码中;更快的插入此模板的方法是键入 **hwc** 然后按 **ctrl+<space>**。
关键词
菜单打开和菜单关闭标签之间的可替换文本可以包含可替换关键字。这些关键字由 **关键字打开**(`<%` )和 **关键字关闭**(`%>`)标签包围,并且不区分大小写。要在文本中按原样插入这些标签(例如在 ASP 模板中),请在 **百分号**(`%`)前加上 **反斜杠**(`\`)进行转义。 **小于号**(`<`)和 **大于号**(`>`)字符也可以转义。
当前,以下关键字是预定义的
SOLUTION
返回解决方案名称。
PROJECT
返回当前项目名称。
文件
返回当前文件名。
NOW
返回当前日期和时间。
TODAY
返回当前日期。
GUID
返回一个 GUID。
TEMPLATE
插入另一个模板的文本。
例如
#{Sample
The solution's name is <%SOLUTION%>
and the current project is <%PROJECT%>
}#
将扩展为
The solution's name is CodeTemplateNET
and the current project is CodeTemplateNET
如果使用未定义的关键字,则在其值将在系统的环境中搜索;如果找不到环境变量,则关键字将被替换为空字符串。例如
#{User name
Logged-in user name: <%USERNAME%>
}#
将扩展为
Logged-in user name: velasqueze
使用嵌套模板使用 `template` 关键字时,被引用的模板必须具有 `MenuID`。例如
#{Template A|tpla
// This is template A
}#
#{Template B|tplb
// <%template:tpla%>
// This is template B
}#
哦,顺便说一句……递归模板嵌套是 **坏事**……不要这样做!
如果关键字名称以 **问号**(?)开头,则该关键字表示提示值,其名称用作输入对话框中的提示字符串。提示关键字名称可以包含空格。例如
#{Ask me something
<%?Please answer the prompt%>
}#
将扩展为:(假设您在输入框中键入了“我刚刚回答了!”:)
I just answered!
**光标位置** 标签(`%$%`)将在格式化并插入文本到编辑器窗口后重新定位插入点。
格式化器
关键字的值可以通过一个或多个 *格式化器* 进行修改。格式化器跟在关键字名称后面,由 **冒号**(**:**)分隔,并且可以带有参数。
当前,以下格式化器是预定义的
U |
U[=start[,length]] |
返回大写形式的键值。Start 是从零开始的。 |
L |
L[=start[,length]] |
返回小写形式的键值。Start 是从零开始的。 |
W |
W=width | 返回截断到参数宽度的键值。 |
R |
R=str1[,str2] |
如果仅存在 str1,则返回键值,用参数字符串中的第二个字符替换第一个字符。如果还存在 str2,则返回键值,用 str2 替换 str1。 |
|
FMT=str |
返回格式化后的键值,将参数应用于 `System.String.Format()`。例如:`String.Format("{0:str }", key)` |
VALUES |
VALUES=v1{, vn}* |
强制提示关键字显示为具有预定义值列表的 ComboBox。可以输入其他值。 |
FIXEDVALUES |
FIXEDVALUES=v1{, vn}* |
强制提示关键字显示为具有预定义值列表的 ComboBox。只能使用列表中的值。 |
MULTILINE |
MULTILINE=int |
强制提示关键字显示为多行文本框。提供的值表示控件的高度(以行为单位)。 |
DRIVE |
DRIVE |
返回键值中的驱动器部分。 |
DIR |
DIR |
返回键值中的目录部分。 |
FNAME |
FNAME |
返回键值中的文件名部分。 |
EXT |
EXT |
返回键值中的文件扩展名部分。 |
PATH |
PATH |
返回键值中的驱动器和目录部分。 |
BASENAME |
BASENAME |
返回键值中的文件名和扩展名部分。 |
例如
#{Sample
User name: <%USERNAME:U%> // User name uppercased
GUID: <%GUID:R=-_:U%> // GUID replacing all the '-' with '_' and uppercased
File's base name: <%FILE:BASENAME%>
m_a is a <%?Access:values= public,protected,private%> variable.
}#
将扩展为
User name: VELASQUEZE // User name uppercased
// GUID replacing all the '-' with '_' and uppercased
GUID: 33784DF9_4EF5_49AE_8E8B_2F8FAAC8B1A2
File's base name: connect.cs
m_a is a protected variable.
更新
版本 1.9 - RC3 (05/07/04)
- 扩展字符从插入的文本中“消失”了。(感谢 Frank Sandersen 发现此问题。)
- 如果模板文件中存在语法错误,则无法访问菜单。
- 语法错误消息框现在会显示错误发生的文件名和行号。(感谢 Frank Sandersen 的建议。)
- 现在可以通过以下两个注册表值之一显式指定模板目录:“HKLM\Eddie Velasquez\CodeTemplate\TemplateDir”或“HKCU\Eddie Velasquez\CodeTemplate\TemplateDir”,分别用于系统范围或每个用户设置。如果找不到这两个值,则将使用用户的漫游配置文件目录。不幸的是,此版本没有用户界面,因此所有更改都必须通过 Regedit 进行。(感谢 Frank Sandersen 的建议。)
- 参数对话框现在会预先填充以前使用过的值。这些值以每个用户的形式存储在注册表中。
已知问题
- 安装程序文件太大了。Visual Studio 坚持要添加一个名为 *MSVBDPCA.DLL* 的 204KB 文件。我不知道它来自哪里,也不知道如何摆脱它。
- 卸载后,CommandBar 未被移除。该该死的工具栏就是不消失。
- 尚未在 Visual Studio .NET 2002 中进行测试。
非常欢迎您就如何解决这些问题提供任何建议!
版本 1.9 - RC2 (04/12/04)
- 自动完成功能删除了模板 ID 之后的部分文本。
- 以空格开头的模板在插入时会错位。(感谢 EnderJSC 的报告。)
版本 1.9 - RC1 (04/08/04)
- 添加了对包含模板文件的支持。模板定义之间的以“`#include`”开头的行指示要包含的模板文件。如果文件名不包含绝对路径,Code<Template> 将尝试在当前用户的漫游配置文件中找到该文件。(感谢 Ken Blood 的建议。)
- 添加了对特定语言模板文件的支持。例如,“*CodeTmpl.cs*”模板文件将用于 C# 文件,“*CodeTmpl.cpp*”将用于 C++ 文件等。
- 添加了对使用“`MULTILINE`”格式化器的多行提示标签的支持。
- 添加了对嵌套模板的支持。(感谢 Alex Kucherenko 的想法。)
- 修复了如果用户清除提示对话框中的文本框,标签将不会重新显示的错误。(感谢 Jean-Claude Lanz 的报告。)
- “Rebind Keyboard”将键盘绑定到了错误的命令。
- “Rebind Keyboard”菜单项现在将在必要时自动创建默认键盘绑定的副本。
- 修复了在使用 AutoComplete 插入模板时,剪贴板的内容被模板 ID 替换的错误。
- 添加了对管理安装的支持。
- 卸载时现在会移除插件命令。
- 现在使用 Visual Studio .NET 2003 进行开发。
版本 1.8.5 (08/10/03)
- 字符“<”、“>”和“%”现在可以通过在前面加上反斜杠来转义。这允许在模板中嵌入 ASP 标签。(感谢 popsy1111 的建议。)
- 菜单分隔符不能在根菜单中使用。(感谢 rb126 的报告。)
版本 1.8.4 (04/03/03)
- “额外回车”错误在版本 1.8.3 中再次出现。(感谢 matt310 的报告。)
版本 1.8.3 (04/01/03)
- 由于版本 1.8.1 中引入的一个错误,模板在模板参数对话框中预览时未按预期显示。(感谢 Kris Vandermotten 发现此问题。)
- 添加了对注释的支持。模板定义之间以感叹号(!)开头的行是单行注释,不会插入到编辑器中。(感谢 Kris Vandermotten 的建议。)
- 添加了帮助菜单项,该菜单项在默认浏览器中打开 *readme.htm* 文件。(感谢 Kris Vandermotten 的建议。)
- 当一个提示标签在模板中多次使用时,它将被插入到与第一次使用不同格式化器的标签的第一个实例中。(感谢 Jason Buxton 的报告。)
版本 1.8.2 (03/26/03)
- 即使找不到模板 ID,按下 ctrl+' 后,模板 ID 也会被删除。(感谢 M. Lansdaal 和 Stefano Del Furia 的学生发现此问题。)
- 将默认键盘绑定更改为 Ctrl + Space。如果找不到模板 ID,则调用默认的 `autocomplete` 函数。(感谢 David Hearn 的建议。)
版本 1.8.1 (03/12/03)
- 插件在模板末尾插入了一个额外的换行符。(感谢 Stefano Del Furia 发现此问题。)
版本 1.8 (02/30/03)
- 数据文件现在保存在漫游配置文件中。如果存在本地副本,则将其移动到漫游配置文件;如果不存在,则从示例文件中复制一份。(感谢 Stefano Del Furia 的建议。)
- 修复了插入文本中的一些格式化错误,特别是在使用光标定位标记(%$%)时。(感谢 Stefano Del Furia 发现此问题。)
- 如果模板文件格式错误,弹出菜单将不允许用户在 Visual Studio 中打开文件进行编辑。(感谢 Stefano Del Furia 发现此问题。)
- **U**ppercase 和 **L**owercase 格式化器已扩展为允许可选的起始位置和长度。(感谢 Jason Buxton 的建议。)
- **R**eplace 格式化器已扩展为除了替换单个字符外,还允许替换子字符串。
版本 1.7 (02/18/03)
- 为菜单项添加了命名 ID。键入 menuID 然后按 ctrl+' 将插入模板,而无需经过菜单。(感谢 Stefano del Furia 和 jsimons007 的建议。)请注意,Visual Studio 不允许修改默认键盘方案,因此必须手动创建副本才能启用键盘绑定。创建默认键盘方案的副本后,在插件菜单中单击“Rebind Keyboard”。
- 将版本 1.6 中引入的键盘绑定重新分配给上述新的模板插入方法。原始方法不太有用。
- 从未更改过的提示字段会插入到文本编辑器中,显示的是原始标签文本而不是空字符串。
- 添加了对 Visual Studio .NET 2003 - Final Beta(也称为 Everett)的支持。
版本 1.6 (02/03/03)
- 向工具栏按钮添加了简单的键盘绑定(ctrl+')。请注意,Visual Studio 不允许修改默认键盘方案,因此必须手动创建副本才能启用键盘绑定。创建默认键盘方案的副本后,在插件菜单中单击“Rebind Keyboard”。
- 安装后,工具栏现在应该始终可见。(这是多个用户报告的问题。)如果问题仍然存在,请使用 *setup* 命令行选项(*devenv.exe /setup*)运行开发环境。这将强制所有插件重新创建它们的命令和工具栏。
版本 1.5 (01/07/03)
- 将版本号从 x.x.x.x 更改为 x.x。
- Code<Template> 的工具栏现在有一个真正的位图,而不是笑脸。
- 对模板文件的更改现在可以自动检测到。(感谢 Oz Solomonovich 的建议。)
- SmartFormat 不再应用于插入的文本。(感谢 Oz Solomonovich 的建议。)
- 参数对话框现在有模板替换预览。(感谢 Alex Kucherenko 的建议。)
- 提示关键字现在接受 `values` 和 `fixedvalues` 格式化器,它们在参数对话框中显示为组合框而不是文本框。(感谢 Alex Kucherenko 的建议。)
- 插入的文本可以在一步中撤销。
- 更改了将模板文本插入编辑器的 G方式。现在,编辑器不会以任何方式修改文本(例如,当模板在一个行首插入单行注释时,“Smart Comment Editing”功能会添加更多斜杠,从而破坏了模板格式)。
- 现在将 *CodeTmpl.txt* 文件保存在用户目录中(“*C:\Documents and Settings\username\Local Settings\Application Data\Eddie Velasquez\CodeTemplate\codetmpl.txt*”)。这样更改是为了避免在更新或卸载 CodeTemplate 的未来版本时丢失您的更改。**在安装此更新之前,请务必手动保存您修改过的 *CodeTmpl.txt***。
版本 1.0.0.4 (11/15/02)
- 添加了 `SELECTION` 关键字,它会插入当前选定的文本。(感谢 Alex Kucherenko 的建议。)
- 有时,当插入点在行的最后一列时,会弹出“无效参数”消息。(感谢 rchecketts 发现此问题。)
版本 1.0.0.1 (11/13/02)
- 修复了 Visual Studio 未创建插件命令的安装程序问题。(感谢 Paul Watson 发现此问题。)
- 删除了尝试添加默认键绑定的代码。(它总是失败,而且我不知道为什么。)
版本 1.0 (11/11/02)
- 初始发布。
待办事项
- 编写更好的文档。