为VS2010编写IDE宏(2)
来源:互联网 发布:oracle sqlserver 编辑:程序博客网 时间:2024/05/16 09:40
在上篇中,我给了一个格式化Java代码的IDE宏的示例。
该宏的代码存在不少错误,而且还有效率上的问题。用正则重写了一遍。当然,由于个人能力有限,而且未加测试,错误在所难免,欢迎指出,将不断完善,下面是完整的代码:
Imports SystemImports System.Collections.GenericImports EnvDTEImports EnvDTE80Imports EnvDTE90Imports EnvDTE90aImports EnvDTE100Imports System.DiagnosticsPublic Module TieWen Sub DTEReplaceAll(ByVal Target As EnvDTE.vsFindTarget, ByVal From As String, ByVal sTo As String, Optional ByVal FindPattern As vsFindPatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral, Optional ByVal bLoop As Boolean = False) DTE.Find.FindWhat = From DTE.Find.ReplaceWith = sTo DTE.Find.Target = Target DTE.Find.MatchCase = True DTE.Find.MatchWholeWord = False DTE.Find.MatchInHiddenText = False DTE.Find.PatternSyntax = FindPattern DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone DTE.Find.Action = vsFindAction.vsFindActionReplaceAll While ((DTE.Find.Execute() <> vsFindResult.vsFindResultNotFound) And bLoop) End While End Sub ' 以上几个是辅助Sub,而不是宏 Sub Macro_FormatJava() '在VS2010查找对话框中使用的正则: '<匹配字首,>匹配字尾 '用{}来保存匹配值(在js中是()) ':有特殊的用途;:i:C++标识符(变量名、类名等),:q:双引号括起来的字符串(该匹配似乎有问题) '完整的正则参考:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(VS.REGULAREXPRESSIONBUILDER)&rd=true DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\{", " {", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '去除{前无用的空格换行等(如果换行是特意增加的,则会丢失) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "\{:b*{[^\n]}", "{" + vbCrLf + "\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '如果{后没有换行,则增加换行 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[^:b\n]}:b*\}", "\1" + vbCrLf + "}", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '如果}前没有换行,则增加 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "\}:b*{[^\n]}", "}" + vbCrLf + "\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '如果}后没有换行,则增加 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, ";:b*{[^\n]}", ";" + vbCrLf + "\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '如果;后没有换行,则增加换行 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*{[\+-\*/%&\|\^=\?\:<>]}[:b\n]*", " \1 ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '+-*/%&|^=?:<>前后增加空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[\+-\*/%&\|\^=\<\>!]}[:b\n]+=[:b\n]*", "\1= ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '+=,-=,*=,/=,%=,&=,|=,^=,==,<=,>=,!=,==前后增加空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "&[:b\n]+&", "&&", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '&& DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "\|[:b\n]+\|", "||", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '|| DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\,[:b\n]*", ", ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) ',后加空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "\:[:b\n]*\:[:b\n]*\:[:b\n]*", ": ::", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) 'case xxx: ::或 a ? b : ::GetInt() DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[^\::a_]}[:b\n]*\:[:b\n]*\:[:b\n]*", "\1 ::", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) 'x += ::GetInt() DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[:a_]}[:b\n]*\:[:b\n]*\:[:b\n]*", "\1::", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) 'x::GetInt() DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[:a_]}[:b\n]*-[:b\n]*>[:b\n]*", "\1->", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) 'x->GetInt() DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[:a_]}[:b\n]*\.[:b\n]*", "\1.", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) 'x.GetInt() 或小数 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{^:i}[:b\n]*{[&\*]}[:b\n]*{:i}", "\1 \2\3", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '一元用于变量:&*,前加空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{^:i}[:b\n]*{[\~!\+-]}[:b\n]*{[:a_]}", "\1 \2\3", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '一元用于变量或常量:~!+-,前加空格 '后缀++、-- DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{:i}[:b\n]*\+[:b\n]*\+[:b\n]*", "\1++ ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{:i}[:b\n]*-[:b\n]*-[:b\n]*", "\1-- ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '前缀++、-- DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\+[:b\n]*\+[:b\n]*{:i}", " ++\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*-[:b\n]*-[:b\n]*{:i}", " --\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\<[:b\n]*\<[:b\n]*=[:b\n]*", " <<= ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '<<=前后加空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\>[:b\n]*\>[:b\n]*=[:b\n]*", " >>= ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '>>=前后加空格 '< <,> >:指在C++模板中 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "\<[:b\n]{2,}\<", "< <", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "\>[:b\n]{2,}\>", "> >", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '<<,>>:二元操作符左移右移,前后加空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\<\<[:b\n]*", " << ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\>\>[:b\n]*", " >> ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '//,/*,*/,** DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*/[:b\n]*/[:b\n]*", " // ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*/[:b\n]*\*[:b\n]*", "/*", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\*[:b\n]*/[:b\n]*", "*/", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*\*[:b\n]**\[:b\n]*", "**", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '/*,*/前若无换行则增加 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[^:b\n]}:b*{/\*+}", "\1" + vbCrLf + "\2", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[^:b\n]}:b*{\*+/}", "\1" + vbCrLf + "\2", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '/*,*/后若无换行则增加 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{/\*+}:b*{[^\n]}", "\1" + vbCrLf + "\2", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{\*+/}:b*{[^\n]}", "\1" + vbCrLf + "\2", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '去除;前的空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]*;", ";", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '()[]去除空格,处理内部的空格即可,外部和符号相关的已在上面处理完毕 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[\(\[]}[:b\n]+", "\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b\n]+{[\)\]]}", "\1", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '去除多余的空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "[:b]+", " ", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) '调用ALT+F8格式化选中区 DTE.ActiveDocument.Selection.SelectAll() DTE.ExecuteCommand("Edit.FormatSelection") '将Tab替换成四个空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, vbTab, " ", vsFindPatternSyntax.vsFindPatternSyntaxLiteral) '去除行尾的空格 DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocument, "{[^:b\n]}:b*{[\n]}", "\1\2", vsFindPatternSyntax.vsFindPatternSyntaxRegExpr) End SubEnd Module
0 0
- 为VS2010编写IDE宏(2)
- 为VS2010编写IDE宏
- 使用VS2010 IDE编写jQuery
- IDE VS2010
- VS2010编写自定义宏
- VS2010编写自定义宏
- VS2010编写自定义宏
- VS2010编写自定义宏
- vs2010 编写64为下的程序
- 通过C# OLDEB读取excel2007中的内容(IDE为VS2010)
- VS2010编写自定义宏注释
- VS2010 C++ 调用 DLL (C++编写)
- 为JSP编写自定义标签(2)
- 编写自己的IDE
- 编写自己的IDE
- 编写自己的IDE
- 编写自己的IDE
- 编写自己的IDE
- 旧题再做涨工资
- Python - 每次处理一个字符
- Windows 2008 R2 安装.Net 3.5 SP1
- Linux典藏大系再度来袭!!!京东大促销活动!!!!
- 面试阿里巴巴前端工程师的一点经历
- 为VS2010编写IDE宏(2)
- 概率统计:数学期望、方差、协方差、相关系数
- WPF中各个Template的分析
- java Junit 整理
- 【C语言】08-数组
- Apache配置中文域名
- 深入分析 Java 中的中文编码问题
- 存储那些事儿(二): 下一代Linux文件系统BTRFS简介
- android Theme使用一