为VS2010编写IDE宏

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

网上有不少好书,可惜其中有很多是扫描版的,摘抄加注起来很麻烦。为方便自己,也为造福大众,我会将自己喜爱的整理一遍,转换成文本版。

网上有现成的工具,可以将图片版的pdf转换成文本,保存到ms word中。如果源图片足够清晰的话,文本的识别率还是很高的。

不过对于代码,其格式则往往比较混乱。手工在word中进行修正,麻烦不说,还容易出错。想起曾经有过几次在VS2010中整理代码,进行的操作基本上都是查找替换和格式化等等;并且,从vs中拷贝的代码,在word中还可以保留语法高亮(关键字蓝色,字符串暗红色,注释绿色)。(不足的是,从VS2010中拷贝的中文,在word中显示为乱码;而从VS2008中拷贝,则完全正常,并且语法高亮也仍然有效)

查找替换和格式化都是些重复性的劳动,因此想着法子让电脑去做。

一开始打算使用dos批处理,但这样一来如果仍要使用语法高亮,就要手工拷贝到VS2010,在拷贝到word,多了一个步骤,麻烦。于是就想能不能直接在VS2010中完成。没想到还真行。通过网络和MSDN,知道VS提供了一个叫做IDE宏的东西。

IDE宏原理上和VBA差不多,或者说就是应用于VS的VBA,只不过使用的VB变成.Net版的了(我不懂VB,如果说错了勿怪)。

下面说说编写IDE宏的具体步骤(VS2010):

按ALT+F11或者点击菜单:工具-》宏-》宏IDE,出现一个和VS类似的IDE窗口:

在MyMacros上右键添加模块,模块名称随便起(我的如上图所示,叫TieWen,是本人的网名)。

双击模块名称,打开编辑窗口,默认的内容如下:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module aaa


End Module




我们所要作的,就是在Module TieWen和End Module之间写入合适的Sub(过程,无返回值)(能否写成Function(有返回值)本人并未深入研究)。

我最近正在整理的书籍中源码是基于Java的,因此给Sub取名为Macro_FormatJava,完整的代码如下(有点问题,多多包涵):

Imports System
Imports System.Collections.Generic
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module TieWen

    Sub MergeAll(ByRef Content As String, ByVal From As String, ByVal sTo As String)
        While (Content.Contains(From))
            Content = Content.Replace(From, sTo)
        End While
    End Sub

    Sub PrefixLf(ByRef Content As String, ByVal Who As String)
        Content = Content.Replace(Who, vbLf + Who)
    End Sub

    Sub PostfixLf(ByRef Content As String, ByVal Who As String)
        Content = Content.Replace(Who, Who + vbLf)
    End Sub

    Sub DTEReplaceAll(ByVal Target As EnvDTE.vsFindTarget, ByVal From As String, ByVal sTo As String, Optional ByVal UseRegEx As Boolean = False, Optional ByVal bLoop As Boolean = True)

        DTE.Find.FindWhat = From
        DTE.Find.ReplaceWith = sTo
        DTE.Find.Target = Target
        DTE.Find.MatchCase = True
        DTE.Find.MatchWholeWord = False
        DTE.Find.MatchInHiddenText = False
        If (UseRegEx) Then
            DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
        Else
            DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
        End If
        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()
        DTE.ActiveDocument.Selection.SelectAll()
        Dim Content As String
        Content = DTE.ActiveDocument.Selection.Text


        '处理开始
        Dim operators_NeedPrefixAndPostfixSpace(), operators_IfIsAssignmentNeedPrefixAndPostfixSpace(), operators_NeedPrefixSpace(), operators_NeedPostfixSpace(), operators_NeedNoSpace(), operators_IfMatchedThenNeedPrefixAndPostfixSpace()
        '此处无法使用VB的Array函数
        operators_NeedPrefixAndPostfixSpace = "public,class,interface,implements,return,:,+,-,*,/,%,&,|,^,<<,>>,=,==,!=,<,<=,>,>=,&&,||".Split(",")
        operators_IfIsAssignmentNeedPrefixAndPostfixSpace = "+,-,*,/,%,&,|,^,<<,>>".Split(",")
        operators_NeedPrefixSpace = "{,!,~".Split(",")
        operators_NeedPostfixSpace = ",|;".Split("|")
        operators_NeedNoSpace = "},->,::,.".Split(",") '不考虑case标签或其它符号后紧跟::的情形
        operators_IfMatchedThenNeedPrefixAndPostfixSpace = "new,delete".Split(",")
        '尚未处理的符号:++、--(前后缀形式的区分比较麻烦)、()、[]、?:
        '一元操作符+、-、*、&被当作二元操作符处理了;
        For Each i In operators_NeedPrefixAndPostfixSpace
            Content = Content.Replace(i, " " + i + " ")
        Next

        For Each i In operators_NeedPrefixSpace
            Content = Content.Replace(i, " " + i)
        Next

        For Each i In operators_NeedPostfixSpace
            Content = Content.Replace(i, i + " ")
        Next

        Content = Content.Replace(vbTab, " ")
        '去除多余的空格
        MergeAll(Content, "  ", " ")

        '合并被分开的//、/*、*/、**,必须在去除多余的空格之后调用
        MergeAll(Content, "/ /", "//")
        MergeAll(Content, "/ *", "/*")
        MergeAll(Content, "* /", "*/")
        MergeAll(Content, "* *", "**")

        '必须在去除多余的空格之后调用
        For Each i In operators_IfIsAssignmentNeedPrefixAndPostfixSpace
            Content = Content.Replace(i + " =", i + "=")
        Next

        '必须在去除多余的空格之后调用
        For Each i In operators_NeedPrefixSpace
            Content = Content.Replace(i + " ", i)
        Next
        For Each i In operators_NeedPostfixSpace
            Content = Content.Replace(" " + i, i)
        Next

        '必须在去除多余的空格之后调用
        For Each i In operators_NeedNoSpace
            Content = Content.Replace(" " + i, i)
            Content = Content.Replace(i + " ", i)
        Next

        'operators_IfMatchedThenNeedPrefixAndPostfixSpace无需处理

        Dim operators_NeedPrefixLf(), operators_NeedPostfixLf()
        '此处无法使用VB的Array函数
        operators_NeedPrefixLf = "},if(,if( ,for(, for (,return".Split(",")
        operators_NeedPostfixLf = "{".Split(",")

        For Each i In operators_NeedPrefixLf
            PrefixLf(Content, i)
        Next
        For Each i In operators_NeedPostfixLf
            PostfixLf(Content, i)
        Next

        Content = Content.Replace(vbCrLf, vbLf)
        Content = Content.Replace(vbCr, vbLf)
        MergeAll(Content, " " + vbLf, vbLf)
        MergeAll(Content, vbLf + vbLf, vbLf)

        '调用ALT+F8格式化代码(在我的机器上会自动在行尾增加空格,因此上面的替换仅为处理{}使用,具体的去除行尾空格,已使用查找替换实现)
        DTE.ActiveDocument.Selection.Text = Content
        DTE.ActiveDocument.Selection.SelectAll()
        DTE.ExecuteCommand("Edit.FormatSelection")

        DTE.ActiveDocument.Selection.SelectAll()

        '将Tab替换成四个空格
        '由于DTE.ActiveDocument.Selection.Text = Content会自动进行格式化,
        '所以不能用代码进行替换再赋值,否会会导致多余的空格。
        '通过查找替换功能实现
        DTEReplaceAll(vsFindTarget.vsFindTargetCurrentDocumentSelection, vbTab, "    ")
        '结束处理
    End Sub
End Module


 

 Sub写好之后,就是将之应用到VS。

点击VS的菜单:工具-》选项,切换到环境-》键盘:


在显示命令包含下的输入框中输入先前的模块名或Sub的名称,等上1-2秒钟,会将过滤后的结果刷新在输入框下发的列表中:

选中对应的宏(刚刚我们所编写的Sub),然后将光标放在“按快捷键P”下方的输入框中,按一个快捷键,如果该快捷键已经被其它命令占用,会在“快捷键的当前使用对象U”下方的下拉框中显示出来:

此时按Backspace,删除快捷键,重新选择一个(注意,一定要按Backspace删除,不要直接继续按),直到该快捷键未被占用(我选到的时候ALT+T),然后点击“分配”按钮,点击确定关闭选项窗口。

然后,打开一个源码文档,按下快捷键(我的是ALT+T)试试效果吧。

如果觉得不好,就修改Sub,直到自己满意为止。

 

补充:

如果发现有些IDE已经实现的功能而自己不会写,可以使用VS的宏记录功能:

按Ctrl+Shift+R或者点击菜单项“工具-〉宏-〉记录TemporaryMacro”,然后执行VS动作(比如执行查找替换),完毕后停止宏记录,然后打开宏编辑器,打开RecordingModule,代码全在这里头。

CATIA VBA二次开发(二) 快速入门之VBA IDE 本文介绍了如何快速创建CATIA VBA项目,如何进行基本的编辑操作。参考上一节内容,给出了一个演示示例 阅读详情

相关推荐

VBA语言的软件开发工具

VBA是一种由微软开发的事件驱动编程语言,主要用于自动化Microsoft Office应用程序(如Excel、Word、Access等)的操作。由于其直观易学的特点,VBA逐渐成为了非程序员用户进行软件开发的首选语言。VBA可以通过的方式,让用户记录和执行重复的操作,也可以通过编写代码创建复杂的功能。VBA作为一种强大的办公自动化工具,以其易学性、自动化能力和与Office的深度集成,广泛应用于各个行业。虽然VBA存在一些局限性,如运行速度较慢和跨平台性差,但在办公环境中,其优势依然显著。

2501_90494486的博客 425

VBA manual(微软官方VBA手册)

VBA manual 英文原版 微软官方出品 简单清楚 VBA编程入门最好的书籍

VS2010使用教程(使用VS2010编写C语言程序)

VS2010使用教程(使用VS2010编写C语言程序) 提示:VS2010 可以在 XP、Win7 和 Win8 下完美运行,但在 Win10 下可能会有兼容性问题,使用 Win10 的读者建议安装 VS2015 或者 VS2017。 前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中”,如下所示: #include <stdio.h> int main() { puts("C语言"); return 0; } 本节我们就来看看如何通过 VS2010 来运行这段代

ccc369639963的博客 2万+

让VB6/VBA的IDE代码编辑器(VBE代码窗口)支持鼠标滚轮

VB6的IDE窗口居然不支持鼠标滚轮,每次翻页都要去拖动滚动条,十分的不方便。在MS网上搜索了一下,发现盖茨早已经发现这个问题了,已经有了补丁 但是这个补丁使用起来很不方便,还要手工注册啥的,所以,我解包后加了一个批处理,然后重新打包,提供下载。 使用方法: 1、下载这个文件,解压,运行,有个窗口一闪而过,注册完毕。 2、在VB或VBA窗口中,依次单击 外接程序→外接程序管理器,选中MouseWheel Fix,然后勾选“在启动中加载”和“加载/卸载”两项,确定。 3、试试鼠标滚轮,已经可以用了。 我增加的批处理文件reg.bat内容如下: regsvr32.exe /s VB6IDEMouseWheelAddin.dll regedit.exe /s "VBA Mouse Wheel Fix.reg" 经过实际使用,在VB6和Office 2003的VBA环境中测试通过。

滑动窗口问题

我借鉴大佬的代码如下: public static int lengthOfLongestSubstring(String s) { char[] c = s.toCharArray(); if (c.length == 0) return 0; int l = 0, r = 0, m = 0; for (; r < c.length; r++) { for (int k = l; k < r; k++) { if (c[k] == c[r]) { .

qq_47627886的博客 281

引领VBA代码管理新时代:VBA IDE CodeExport

引领VBA代码管理新时代:VBA IDE CodeExport 项目简介 VBA IDE CodeExport,一个纯VBA编写的Excel插件,让你无需安装额外的COM组件即可将你的Excel VBA项目源码导出,适用于版本控制系统如Git。这个插件特别为Excel设计,但其VBIDE扩展性使其也能应用于整个MS Office套件。 它不仅能够导出.cls, .bas, 和.frm文件,还能处理...

gitblog_00047的博客 786

推荐开源项目:VBA IDE CodeExport

推荐开源项目:VBA IDE CodeExport 在Excel的世界里,版本控制常常是开发者头疼的问题。但是有了VBA IDE CodeExport,这一切变得轻松无比。本篇文章将深度解析这一神器,探讨其技术原理,应用场景,并突出其独特之处,带你领略如何优雅地管理Excel中的VBA代码。 项目介绍 VBA IDE CodeExport是一个专为Excel设计的开源工具,通过纯VBA编写的插件...

gitblog_00712的博客 931

VS2010编写IDE(2)

在上篇中,我给了一个格式化Java代码IDE的示例。 该代码存在不少错误,今天我们来重写它。 首先说说我想要的Java代码的格式(我不懂Java,如有遗漏和错误请勿见怪): 1. {}:{和类声明、函数声明、if、for、while等同处一行,且前面有一个空格;}位于单独一行。如: class X implements Y { } String func() throw Exc

tiewen的专栏 1450

VS2010编写自定义

这里所说的可不是指#define PI 3.14159之类的,而是按下Alt + 1,Alt + 2之类的键盘组合之后可以方便地插入一大串自定义的内容,如: [cpp] view plaincopy /*******************************************************************  * 函数名称

CHEN_DO_IT的专栏 1165

用Qt Creator编写代码+ vs2010编译调试的配置

1.我在的系统是win7 64位的操作系统 2G内存 2.已安装了vs2010旗舰版 3.顺序安装 后面的是我的安装路径                  1. qt-win-opensource-4.8.2-vs2010.exe         E:\work\QT482_Creator250_add1_1_11\qt4.8.2   //注意不是源码。

A_sungirl的专栏 6855

最全VS2010初级教程学习手册

目录 《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010 1 写在前面        第一章 关于Visual Studio、VC和C++的那些事 1 第二章 安装、配置和首次使用VS2010 2 安装 2 配置 10 HelloWorld. 18 VS2010正式到手,说说几点试用体会 29 VS2010 中使用main函数作为C++的入口函数

小林哥专栏 1万+

VBA to VSTO VS2010项目代码

From VBA to VSTO 的项目代码。 使用VS2010开发。 通过调试测试。使用excel2007.

使用VS2008 2010编写arduino程序及编译下载

因不知明原因,arduino的IDE从0018以后都不开始支持中文注释输入。这点让广大洋文水平不好的爱好者很郁闷。。。 使用其他第三方文本编辑软件倒是可以解决了输入中文问题,如:notepad++,但是下载还是还是需要使用官方的IDE。 国外某大侠开发出来VS2008 2010使用的arduino插件,不仅可以使用VS进行代码编写,而且也可以直接在VS中下载,非常之方便,下面我们就以

HexBug 6492

VS2010简介

今天参加微软组织的VS2010 Launch Event Train-The-Trainer Traning,Brian A. Randell同学讲的眉飞色舞、demo的激情澎湃,我却听的懵懵懂懂:( 听听课,才发现自己的知识落伍太多了。还没研究过WPF到底是怎么回事儿,现在Silverlight已经大行其道。没做过Web方面的开发,现在Cloud又火得不行。SharePoint & Of

Thinking in ... 2万+

VS 2010 IDE 学习总结

自动添加注释—VS2010的使用     在敲代码的过程中类和函数都需要进行注释,但总是一遍一遍的复制粘贴觉得很是麻烦,终于找到 了一个不错的解决方法:使用。     所谓,就是一些命令组织在一起,作为一个单独命令完成一个特定任务。在日常的办公环境中, 不论是Office还是Foxmail以及我们所使用的VS甚至输入法都具有的功能。VS2010中的,不仅可

bcbobo21cn的专栏 2644

vs2010中如何自动给函数或者类加上注释

1. 打开vs2010,依次点击工具->Macro 资源管理器,会在右侧出现资源管理器。如下图所示: 2.在资源管理器的Samples模块上右键->新建模块,弹出如下对话框,输入模块名FunctionComment,点击添加 3. 随后在samples模块下会多出一个FunctionComment模块,双击FunctionComment模块,在Public Module Fu

a549875231的专栏 5691

回文数c语言程序编写_VS2010使用教程(使用VS2010编写C语言程序)

提示:VS2010 可以在 XP、Win7 和 Win8 下完美运行,但在 Win10 下可能会有兼容性问题,使用 Win10 的读者建议安装 VS2015 或者 VS2017。前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示:#include int main(){ puts("C语言中文网"); return 0;}本节我们就来看看如何通过...

weixin_39805906的博客 1110

Visual Studio 2010利用添加注释

在Visual Studio 2010(下面简称VS编写类的过程中通常会在类的前面写上如下注释: 1: '------------------------------------------------------------------------------

郗晓勇|利己者生,利人者恒 7978

VS2010黑色主题Dark完美设置!

------------------------------------------------------------------------------------------------------------------------------------------- 工欲善其事,必先利其器!作为宇宙最强IDE,Visual Studio的每个版本的相较之前的版本都有相对人...

allin_allin的恋爱小屋 4万+
上一篇: 编写可读性代码的艺术
下一篇: 色谱工作站
铁文
博客等级 码龄22年 441粉丝 148原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值