Visual Studio 宏的高级用法

我已经介绍了如何编写一个最简单的宏,本文将进一步介绍如何用宏来实现对代码编辑窗口控制。在本文结束的时候,你应该能自己实现如下两个功能,第一个用于对方法体进行 phase0 标记;第二个可以将当前窗口中的代码进行归类,将所有方法、属性、变量通过region进行分块。

动画演示:phase0

动画演示:设置 region

为什么使用宏

  在计算机行业内,宏的出现由来已久,因为它能替代人们执行一些重复发生的简单但烦琐的事情,所以广受人们欢迎。在 Visual Studio 中也提供了进行宏编程的方法,从而方便开发人员录制一些宏脚本来扩展Visual Studio,以提高开发效率。

  要想在 Visual Studio 中操作宏来操控代码编辑窗口,就必须要了解如下几个东东:EnvDTEDTETextSelectionEditPoint。宏可实现地远不止是操控代码编辑窗口,关于其它能力请见参考资源[1]

  本文中的内容在阅读过程中最好能结合实践进行练习,这样印象会更深刻。

EnvDTE

  EnvDTE 是最核心的程序集,所有后续要讲到的东西都归于它名下。

  MSDN上对它的介绍:

EnvDTE 是包含 Visual Studio 内核自动化的对象和成员的用程序集包装的 COM 库。 在 EnvDTE80、EnvDTE90、 EnvDTE90a 和 EnvDTE100 命名空间中包含更改和新功能。

  EnvDTE80、90、100按照数字,越大的表示越新,因为Visual Stuido有好多版本,不同的版本会提供新的功能,而这几个版本的 EnvDTE 正是对应了这些更新,不同的版本只是在功能上做了补充,并没有谁能替代谁的关系,比如editPoint2 比 editPoint 可能多了某些新特性,当你要使用这些新特性的时候,就应该使用editPoint2,否则还是使用 editPoint。

  在编写自己的扩展前,可以把EnvDTE、EnvDTE80 等全部引用进来。

Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100

DTE对象

  在 Visual Studio 中, DTE 对象是自动化模型中的顶级对象,通过操作DTE对象可以获取对 Visual Studio 的控制,比如你可以得到当前活动的文档、活动的窗口、活动的项目、查找与替换、向解决方案中添加文件、执行预定义命令、录制宏等。

  DTE包含的属性(局部)

上面只是截取了一部分,完整的请查看 MSDN

  DTE包含的方法

  通过操控这些属性和方法就可以实现强大的功能,下面的例子中通过操纵DTE对象的TextSelecion子对象和Find子对象来调用 Visual Studio 的查找功能。

 1 Dim selection As TextSelection = DTE.ActiveDocument.Selection
 2
 3 DTE.Find.MatchWholeWord = False
 4 DTE.Find.Action = vsFindAction.vsFindActionFind
 5 DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
 6 DTE.Find.MatchCase = False
 7 DTE.Find.Backwards = False
 8 DTE.Find.MatchInHiddenText = True
 9 DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
10
11 ‘跳出输入框,接收你的输入
12 what = InputBox(prompt)
13 If (what <> "") Then
14      DTE.Find.FindWhat = what
15
16      ‘相当于在当前文档向下搜索一次
17      Dim result = DTE.Find.Execute()
18      If (result = vsFindResult.vsFindResultFound) Then
19
20          ’如果找到,就把那一行选中
21          selection.SelectLine()
22      End If
23 End If

  上面的代码并不复杂,就是简单地对 Find 的调用和赋值。如果你正好看到这里,不仿也试着写一下吧~ Find 相关内容请查看参考资源[2]

TextSelection

  用于代表当前选定的区域,一个文档有且只有一个实例,即使你在代码中创建了多个实例,这些实例其实都是指向同一个选定区域。对 TextSelection 的操控会直接体现在界面上。通过控制该对象可以剪切、复制、删除选中的文本,插入删除空白行,大小写转换,定位到某个位置、格式化等。

  TextSelection 的属性

  TextSelection 的方法(局部)

完整的请查看 MSDN

  一句话获取 TextSelection 实例,因为 TextSelection 是针对文档的,所以在获取 Selection 之前,必须先获取文档。如果当前文档中并没有选中任何文本,则 TextSelection 表示的是当前光标所在的位置。

Dim selection As TextSelection = DTE.ActiveDocument.Selection

  下面演示几个例子,来说明 TextSelection 的能力。

  第一个例子将演示如何获取当前光标所在的方法的名称,主要通过获取当前光标所在位置的 CodeElement 元素来得到具体的方法信息,通过传入 CodeElement 的参数不一致可以获取不同块的信息,包括方法、枚举、属性、类、名称空间等。关于 vsCMElement 的枚举请见参考资源[4]

1 Sub DemoFunctionInfo()
2         Dim selection As TextSelection = DTE.ActiveDocument.Selection
3         Dim func As CodeFunction = selection.ActivePoint.CodeElement(vsCMElement.vsCMElementFunction)
4         If Not func Is Nothing Then
5             MsgBox(func.Name)
6         End If
7 End Sub

动画演示:显示方法名

  第二个示例,演示如何在光标位置所在的行上下加上Region。

 1     Sub DemoRegion()
 2
 3         ‘获取 TextSelection 实例
 4         Dim selection As TextSelection = DTE.ActiveDocument.Selection
 5
 6         ‘移动到当前光标所在行的最前面
 7         selection.StartOfLine()
 8         ‘在该位置插入一个新行,相当于按了下回车
 9         selection.NewLine()
10         ‘将光标移回到新行
11         selection.LineUp()
12         ‘在当前光标所在的位置开始输入文字
13         selection.Text = "#region start"
14
15         ‘将光标移动到下一行
16         selection.LineDown()
17         ‘将光标移动到行末
18         selection.EndOfLine()
19         ‘回车
20         selection.NewLine()
21         selection.Text = "#endregion"
22
23         ‘格式化
24         selection.SmartFormat()
25
26     End Sub

动画演示:在特定行的上下添加region

  再来看一个示例,用户输入起始和结束文字,然后自动选中位于这两个起始结束标记之间的一段文本。

 1     Sub DemoSelectTextRange()
 2
 3         ‘获取 TextSelection
 4         Dim selection As TextSelection = DTE.ActiveDocument.Selection
 5         Dim startLine As Integer
 6         Dim startLineOffset As Integer
 7         Dim startPoint As TextPoint
 8         Dim endLine As Integer
 9         Dim endLineOffset As Integer
10
11         DTE.Find.Action = vsFindAction.vsFindActionFind
12         DTE.Find.MatchCase = False
13
14         ‘-------------- 找到起始的文字 ----------------------
15         Dim input = InputBox("Enter a word to find as the start tag")
16         If input = "" Then
17             Exit Sub
18         End If
19
20         DTE.Find.FindWhat = input
21         Dim result As vsFindResult = DTE.Find.Execute()
22         If result <> vsFindResult.vsFindResultFound Then
23             Exit Sub
24         End If
25
26         startLineOffset = selection.BottomPoint.LineCharOffset
27         startLine = selection.BottomPoint.Line
28         ‘-----------------------------------------------------
29
30         ‘--------------- 找到结束的文字 ----------------------
31         input = InputBox("Enter a word to find as the end tag")
32         If input = "" Then
33             Exit Sub
34         End If
35
36         DTE.Find.FindWhat = input
37         result = DTE.Find.Execute()
38         If result <> vsFindResult.vsFindResultFound Then
39             Exit Sub
40         End If
41
42         endLine = selection.TopPoint.Line
43         endLineOffset = selection.TopPoint.LineCharOffset
44         ‘-----------------------------------------------------
45
46         ‘------------- 遍历,记录经过的字符数用于选中 --------
47         Dim index As Integer
48         Dim len As Integer = 0
49
50         selection.GotoLine(startLine)
51         len += selection.ActivePoint.LineLength - startLineOffset
52         For index = startLine + 1 To endLine - 1
53             selection.GotoLine(index)
54             len += selection.ActivePoint.LineLength
55         Next
56         selection.GotoLine(endLine)
57         len += endLineOffset
58         ‘-----------------------------------------------------
59
60         ‘设置起始位置
61         selection.MoveToLineAndOffset(startLine, startLineOffset)
62         ‘True 表示鼠标跟随移动,len 表示要移动的字符数
63         selection.CharRight(True, len)
64
65     End Sub

动画演示:选中一段文本

EditPoint

  Visual Studio 除了在代码编辑窗口中会保留代码,还有一个叫代码缓冲区的地方(用户是看不到的)也会保留代码,但这个缓冲区中的代码不受自动换行和虚拟空格的影响。前面我们说过 TextSelection 只能有一个,那如果开发人员事先选中了一行代码,而我们又在宏中不小心改变了这个 TextSelection,那就会导致用户的选中被丢失。另外,EditPoint提供了一些TextSelection所不具备的操作能力。比如剪切一段文本,使用 EditPoint 的 Cut 方法只要设置起始位置然后直接传入结束的位置给
Cut 方法就可以完成,但是如果使用 TextSelection ,因为它的 Cut 不带参数,所以就必须先选中这段文本才能使用 Cut 方法。

  这里补充一个小知识点,什么是虚拟空格?这个东东默认是关闭的,在 Visual Studio 开发的时候也很少用。一般我们在写代码的时候,如果在一行的结尾处使用小键盘向右继续移动的话,光标很快就会自动跳转到下一行。如果开启之后,则永远不会自动跳转到下一行,你可以在任意一个位置进行编辑。开启的方式:工具 / 选项 / 文本编辑器 / 所有语言 -> 启用虚拟空格。

  所以如果你在项目中会存在自动换行或开启了虚拟空格,那么想要精准的控制编辑器,还是使用 EditPoint 吧。

  下面一样举个例子来讲解。该示例将把一个方法的位置进行移动,思路就是先剪切,然后粘贴。

 1    Sub DemoCut()
 2         Dim selection As TextSelection = DTE.ActiveDocument.Selection
 3         ‘获取editPointer
 4         Dim edit = selection.ActivePoint.CreateEditPoint
 5         ‘获取 方法
 6         Dim func As CodeFunction = selection.ActivePoint.CodeElement(vsCMElement.vsCMElementFunction)
 7         If Not func Is Nothing Then
 8             edit.MoveToPoint(func.StartPoint)
 9             edit.Cut(func.EndPoint)
10
11             edit.MoveToLineAndOffset(20, 1)
12             edit.Paste()
13         End If
14     End Sub

动画演示:如何剪贴一个方法

Have a try

  辛苦了,看到这里实在不容易。既然已经看到这了,何不来尝试着自己写一个呢?回到开头的两个示例,看看能不能写出来了。

Visual Studio 宏的高级用法,布布扣,bubuko.com

时间: 2024-10-21 18:23:07

Visual Studio 宏的高级用法的相关文章

Visual Studio 宏

原文地址:Visual Studio 宏作者:一叶水草平 在visual studio中加入项目文件,也就是引用外部文件,比如在toolsoptions中的show directions for中选择include files,我们需要引用项目(solution)中文件夹中的文件,可以选用下文中的如下宏:$(SolutionDir)DshowInclude,这样就将项目中的Dshowinclude文件加入到编译文件列表中. $(RemoteMachine) 在"调试"属性页上设置为 R

解决Visual Studio 2017隐藏“高级保存选项”命令

Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2017中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能显示该命令.操作方法如下: (1)单击“工具”|“自定义”命令,弹出“自定义”对话框. (2)单击“命令”标签,进入“命令”选项卡. (3)在“菜单栏”下拉列表中,选择“文件”选项. (4)单击“添加命令”按钮,弹出“添加命令”对话框. (5)在“类别”列表中,选择“文件”选项:在“命令”列表中,选

C++宏的高级用法

#ifndef __GNUC__     #error 编译器为g++,windows下,好像没有把##生成的新字符串当成一个宏处理 #endif #define conn(x,y)    x#y // x必须是一个字符串,使用时,conn("2",3),而不能是conn(2,3),3可以是任何类型的字符串 // ## 有两种用法,一种是字符串连接,另一种是把连接生成的字符串当成一个新的宏 // 新宏必须存在 // 用##连接中参数中包含已定义的宏时,宏不会展开 #define STR

#define 宏的高级用法(转)

一,宏的定义与撤销 #普通宏定义 #define PI 3.14 //编译阶段替换掉宏 #define T1 3+4 //容易产生歧义 #define T2 (3+4) //添加括号后,语义清楚 float r = 1.0; float area = PI * r * r; int a = 2* T1 #宏替换后变成 int a = 2*3+4 不符合本意 ing a = 2* T2 #红替换后变成 int a = 2*(3+4) 符合本意 #undef PI float area = PI *

visual studio 中GIT的用法

http://msdn.microsoft.com/zh-cn/library/vstudio/hh850445 Git 使用最新版:Git-1.8.4-preview20130916http://pan.baidu.com/share/link?shareid=4006639853&uk=1427042506 简单的说一下GIT的使用.... 参见:http://tieba.baidu.com/p/2669973158   GIT已嵌入VS ,无需命令行操作

如何利用 Visual Studio 自带工具提高开发效率

原文:如何利用 Visual Studio 自带工具提高开发效率 Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 / 选项 / 文本编辑器 -> 选择对应的语言 2. 勾选 "行号" 使用书签 和平常意义的书签类似,当我们希望在日后某一时刻快速定位到一处代码时使用.比如在项目例会上,你需要演示本周你所做的一些改进,在开会前可以事先

Visual Studio 2012简体中文专业版密钥(激活码)

VS2012 正式版在Beta版的基础上进行了很多改进,尤其是加入了全新的用户界面. VS2012 的硬件需求与VS2010相同,不过由于 Visual Studio 2012 利用了新版 Windows 的核心功能,因此它必须运行在 Win7 以上的操作系统,当然如果你打算要开发 Win8 的程序,那么配合Windows 8 使用将会更加完美 点击下载ISO文件:VS2012__pro_CHS  这个是简体中文专业版 Microsoft Visual Studio Professional 2

Microsoft Visual Studio 2012注册密钥

Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥:YKCW6-BPFPF-BT8C9-7DCTH-QXGWCMicrosoft Visual Studio Premium 2012 高级版 有效注册密钥:MH2FR-BC9R2-84433-47M63-KQVWCMicrosoft Visual Studio Professional 2012 专业版 有效注册密钥:4D974-9QX42-9Y43G-YJ7JG-JDYBP Microsoft Ex

Visual Studio高级调试技巧

1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持汇编) _asm int 3 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows API DebugBreak(); WerFault.exe进程(Windows Error Reporting)弹出ConsoleTest.exe已停止工作: 要想出现“调试程序”选项,需要将Windows Error Reporting注册表信息设置成如下图所示(注:特别是红框的内容)