关闭

关闭

封号提示

内容

首页 Source_Insight教程.pdf

Source_Insight教程.pdf

Source_Insight教程.pdf

上传者: philip_ok 2011-08-22 评分 5 0 241 33 1096 暂无简介 简介 举报

简介:本文档为《Source_Insight教程pdf》,可适用于IT/计算机领域,主题内容包含作为一个开放源代码的操作系统Linux附带的源代码库使得广大爱好者有了一个广泛学习、深入钻研的机会特别是Linux内核的组织极为复杂同时又不能像wi符等。

作为一个开放源代码的操作系统Linux附带的源代码库使得广大爱好者有了一个广泛学习、深入钻研的机会特别是Linux内核的组织极为复杂同时又不能像windows平台的程序一样可以使用集成开发环境通过察看变量和函数甚至设置断点、单步运行、调试等手段来弄清楚整个程序的组织结构使得Linux内核源代码的阅读变得尤为困难。当然Linux下的vim和emacs编辑程序并不是没有提供变量、函数搜索彩色显示程序语句等功能。它们的功能是非常强大的。比如vim和emacs就各自内嵌了一个标记程序分别叫做ctag和etag通过配置这两个程序也可以实现功能强大的函数变量搜索功能但是由于其配置复杂linux附带的有关资料也不是很详细而且即使建立好标记库要实现代码彩色显示功能仍然需要进一步的配置(在另一片文章我将会讲述如何配置这些功能)同时对于大多数爱好者来说可能还不能熟练使用vim和emacs那些功能比较强大的命令和快捷键。为了方便的学习Linux源程序我们不妨回到我们熟悉的window环境下也算是“师以长夷以制夷”吧。但是在Window平台上使用一些常见的集成开发环境效果也不是很理想比如难以将所有的文件加进去查找速度缓慢对于非Windows平台的函数不能彩色显示。于是笔者通过在互联网上搜索终于找到了一个强大的源代码编辑器它的卓越性能使得学习Linux内核源代码的难度大大降低这便是SourceInsight它是一个Windows平台下的共享软件由于SourceInsight是一个Windows平台的应用软件所以首先要通过相应手段把Linux系统上的程序源代码弄到Windows平台下这一点可以通过在linux平台上将usrsrc目录下的文件拷贝到Windows平台的分区上或者从网上光盘直接拷贝文件到Windows平台的分区来实现。下面主要讲解如何使用SourceInsight考虑到阅读源程序的爱好者都有相当的软件使用水平本文对于一些琐碎、人所共知的细节略过不提仅介绍一些主要内容以便大家能够很快熟练使用本软件减少摸索的过程。安装SourceInsight并启动程序可以进入图界面。在工具条上有几个值得注意的地方如图所示图中内凹左边的是工程按钮用于显示工程窗口的情况右边的那个按钮按下去将会显示一个窗口里边提供光标所在的函数体内对其他函数的调用图通过点击该窗体里那些函数就可以进入该函数所在的地方。图图图图SourceInsightSourceInsightSourceInsightSourceInsight界面图界面图界面图界面图由于SourceInsight实质上是一个支持多种开发语言(java,c,c等等)的编辑器只不过由于其查找、定位、彩色显示等功能的强大而被我们当成源代码阅读工具使用。所以为了有效的阅读源程序首先必须选择功能菜单上的“Project”选项的子菜单“NewProject”新建一个项目项目名称可以自由选定当然也可以选择删除(Remove)一个项目。当删除一个项目的时候并不删除原有的源代码文件,只是将该软件生成的那些工程辅助文件删除。设定之后将会弹出一个对话框如图接受默认选择如果硬盘空间足够可以将第一个复选框选上该选项将会需要与源代码大致同等的空间来建立一个本地数据库以加快查找的速度。图图图图工程设置工程设置工程设置工程设置点击“OK”按钮接受选择后将会有一个新的对话框弹出在这个对话框里可以选择将要阅读的文件加入工程一种方式是通过在FileName中输入要阅读源代码文件的名称点击“Add”按钮将其加入也可以通过其中“AddAll”和“AddTree”两个按钮可以将选中目录的所有文件加入到工程中其中“AddAll”选项会提示加入顶层文件和递归加入所有文件两种方式而“AddTree”相当于“AddAll”选项的递归加入所有文件可以根据需要使用就我来说更喜欢“AddTree”一些。由于该程序采用了部分打开文件的方式没有用到的文件不会打开所以加入数千个文件也不用担心加入的文件超出程序的所能容忍的最大值我就是采用“AddTree”的方式将Linux内核的四千五百九十一个文件加入的。图图图图添加文件添加文件添加文件添加文件加入文件后点击一个文件可以出现使用界面如图所示其中右边的那个窗口(LinuxProject即工程窗口)缺省按照字母顺序列出当前工程中所有的文件。图图图图工作窗口工作窗口工作窗口工作窗口点击一个文件就可以打开该文件显示如图所示进入到右边的那个窗口分别可以以文件列表的方式列出所有的文件每个窗体下边有一排按钮左边的窗口(c)从左至右分别为:按字母顺序排列所有标记、按照文件中行数顺序排列标记、按照类型排列标记、浏览本地文件标记、标记窗口属性。右边的窗口(LinuxProject)从左至右分别为:按字母顺序文件列表、显示文件夹、按照文件类型归类文件、全部文件的所有标记列表、按照标记类型归类标记、跳转到定义处、显示标记信息、浏览工程标记、查找函数调用、工程属性其中全部文件的所有标记列表选项可能要一段时间抽取标记同步到数据库去如果开始选择了建立标记数据库将会在今后节省同步时间最有用的莫过于浏览标记信息和查找函数调用前者可以通过“Jump”按钮在不同的地方查找同样的标志还可以通过“Reference”按钮结合后者进行全局的标记查找。Reference功能是SourceInsight的特色之一它可以在速度极快的在整个工程中找到所有的标记并且在该行程序的前边加上红色箭头的小按钮链接上。图是一个Reference搜索后的结果它可以有两种模式一种集中显示结果图显示的就是这种模式在这种模式下可以通过前边的红色箭头小按钮进入另外一种模式该标记的具体的所在处也可以通过标记的具体所在处点击红色箭头小按钮进入警种模式还可以通过工具条上的两个红色小箭头直接在第二种模式下前后移动察看相应信息。它的这个强大的功能使得阅读Linux源程序有如神助。但是要注意的是当进行了第二次“Reference”时它会提示你将结果集附加在第一个结果集的后边还是取代第一个结果集。如果选择前者不能对结果集根据前后两次搜索结果进行分类然后在其子类里进行移动只能在整个结果集里移动如果选择后者结果集将会被替换为第二次搜索的结果略微有些不方便。图图图图ReferenceReferenceReferenceReference的搜索结果的搜索结果的搜索结果的搜索结果当然SourceInsight还提供了一些其他常见的便利。比如:右键菜单几乎包含了程序的所有功能可以在编辑窗口为程序加上行号还可以统计整个工程的程序行数,当然还有功能强大却用不上自动完成功能似乎连它的天试用期也是别有用心――可以迫使你尽可能快速的阅读源程序其他一些技巧大家可以在使用过程中慢慢摸索。怎么样?爱好读源代码的朋友不妨马上去下载一个去开始我们的Linux内核探险之旅吧!SourceInsight使用技巧使用技巧使用技巧使用技巧:学习研究、、、、缩进与缩进与缩进与缩进与tab()Options菜单PreferencesTyping卡勾掉下面两项Typingtabindentslineregardlessofselection空行按tab无法前进Typingtabreplacescurrentselection选定部分内容、再按tab时会清除所选()Options菜单DocumentOptions(针对不同文件类型分别进行设置)下拉左上文件类型框、选择合适类型(c源文件)EditingOptions框中tabwidth=EditingOptions框中勾选Expandtabs(这样按tab键、等价于输入个空格)()Options菜单DocumentOptions选择合适的文件类型点击右边中间的AutoIndent钮在弹出的框中左边一定要点Smart右边有两个复选框IndentOpenBrace和IndentCloseBrace具体效果可以看SIS的HELP。按照部门里的编程风格要求最方便的就是把两个复选框都取消掉然后点OK。勾选AutoIndent之SMART的效果在C程序里,如果遇到行末没有分号的语句,如IF,WHILE,SWITCH等,写到该行末按回车则新行自动相对上一行缩进两列。勾掉IndentOpenBrace和IndentCloseBrace的效果继上一段在相对缩进行里,如果输入"}",则自动和上一行列对齐(好像勾不勾都会有这个功能)而输入"{"时不会与下面的行对齐(这是勾上IndentOpenBrace时的效果)。、、、、向项目中添加文件时向项目中添加文件时向项目中添加文件时向项目中添加文件时只添加特定类型的文件只添加特定类型的文件只添加特定类型的文件只添加特定类型的文件((((文件类型过滤器文件类型过滤器文件类型过滤器文件类型过滤器))))有个同事比较生猛得整汇编代码但在SIS里建立PROJECT并ADDTREE的时候根据默认设置并不会把该TREE里面所有汇编文件都包含进来只加了inc和asm后缀的s后缀的没有。而且用SIS打开s的文件一片黑白没有色彩感觉回到DOS的EDIT时代了……解决方法是在Options>DocumentOptions里面点左上的DocumentType下拉菜单选择xAsmSourceFile然后在右边的Filefilter里*asm*inc的后面加上*s接着CLOSE就可以了。上面两个问题解决了但注意加入*s后还需要重新ADDTREE一遍才能把这些汇编加到PROJECT里面。、、、、去掉功能强大但是无用的自动完成功能去掉功能强大但是无用的自动完成功能去掉功能强大但是无用的自动完成功能去掉功能强大但是无用的自动完成功能Options菜单PreferencesTyping卡AutoCompletion框勾掉Useautomaticsymbolcompletionwindow(这里是SIS的全局设置)Options菜单DocumentOptionsEditingOptions框中勾掉Allowautocomplete(局部设置)上面两项必须全部勾选才能启用AutoCompletion功能、、、、恢复小键盘的恢复小键盘的恢复小键盘的恢复小键盘的""""*""""功能功能功能功能Options菜单Keyassignments通过关键词Scroll找到ScrollHalfPageUp取消小键盘通过关键词Scroll找到ScrollHalfPageDown取消小键盘*通过关键词Function找到FunctionUp取消小键盘通过关键词Function找到Functiondown取消小键盘。、、、、恢复恢复恢复恢复ctrla的全选功能的全选功能的全选功能的全选功能通过关键词save找到saveall更改为ctrlshifta通过关键词select找到selectall更改为ctrla、、、、解决字符等宽对齐问题解决字符等宽对齐问题解决字符等宽对齐问题解决字符等宽对齐问题。。。。SIS默认字体是VERDANA很漂亮。这网页上应该也是用的VERDANA字体。但由于美观的缘故VERDANA字体是不等宽的。比如下面两行llllllllllMMMMMMMMMM同样个字符长度差多了用VERDANA来看程序有些本应该对齐的就歪了。解放方法是使用等宽的字体但肯定比较丑。可以用DOS字体也就是记事本里的默认字体sysfixed很丑要有心理准备。比较推荐的是用CourierNew。SourceInsight提供的功能提供的功能提供的功能提供的功能、、、、解析日志信息时非常有用的解析日志信息时非常有用的解析日志信息时非常有用的解析日志信息时非常有用的SourceLink总地说来SourceLink根据特定的搜索模式把当前文件中满足模式的行、链接到由该行指定的其他源文件中。所谓特定的搜索模式共有两种"File,thenline"和"Line,thenfile"其中前后两部分依靠正则表达式的组的概念组的概念组的概念组的概念来予以分割。如果当前文件具有匹配行比如"Errord:tcsrcqc:LvaluerequiredinfunctionjsSort"那么SourceInsight在该行创建SourceLink、把该行链接到由该行指定的文件中(即d:tcsrcqc第行)。创建创建创建创建SourceLink运行Search菜单的ParseSourceLinks…命令在弹出的框中、选择搜索模式、并填入相应的正则表达式串点OKSIS就会解析当前文件如果有匹配就创建SourceLink。在解析日志信息时在解析日志信息时在解析日志信息时在解析日志信息时使用使用使用使用SourceLink可以打开日志信息运行ParseSourceLinks命令日志中能够匹配模式的每一行(通常是含有错误信息的行)、就会被设置上一个SourceLink在解析自定义命令输出时在解析自定义命令输出时在解析自定义命令输出时在解析自定义命令输出时使用使用使用使用SourceLink首先勾选CustomCommand中的"ParseLinksinOutput"然后选择特定的搜索模式最后填入合适的正则表达式。这样SourceInsight把输出信息作为当前搜索用文件并且如果有匹配行(通常即编译错误信息行)SIS为该行创建SourceLink、并把每一个错误信息中给定的文件(和行号)作为link目的地这对于我们修改源代码错误非常有帮助。、、、、替换替换替换替换((((Replace))))VS上下文敏感的智能重命名上下文敏感的智能重命名上下文敏感的智能重命名上下文敏感的智能重命名((((ContextSensitiveSmartRename))))替换替换替换替换((((Replace))))目前来说普通的替换命令、快捷键为ctrlH足以已满足工作要求。在弹出的替换窗口中在Search框中勾选Selection来只在所选文本区域中替换(当然这时你要先选定区域然后再按ctrlH)、勾选WholeFile来在整个当前文件内替换、两者都不勾选来从当前光标处替换至文件末尾点右边的Files…按钮可选择替换多个文件的内容。上下文敏感的智能重命名上下文敏感的智能重命名上下文敏感的智能重命名上下文敏感的智能重命名((((ContextSensitiveSmartRename))))SmartRename命令、快捷键是Ctrl'是上下文敏感的全局搜索替换。它可以智能地重命名全部项目文件中的一个标示符。SourceInsight的搜索索引(searchindex)使得搜索过程进行地非常快。而且使用SmartRename所做的替换会被记录在SearchResults窗口中每一条替换记录旁有一个SourceLink链接到替换发生地文件。SmartRename可以用来重命名标记(symbol)。如果勾选了SmartReferenceMatching选项SmartRename就只在正确的上下文范围内进行重命名。它可以智能地重命名全部项目文件中的一个标示符它可以重命名函数本地变量类或结构体成员、函数。在弹出的SmartRename窗口中有下面几项OldName填旧名称。光标下的词会被自动加载光标的位置非常重要这是因为SourceInsight会根据本地上下文背景、准确地确定你想要重命名哪一个标记。推荐只填单个词、而不是字符串。如果你在命名成员变量、或本地变量()OldName框中会显示完全标记名、即上层容器名标记名。例如框中的"DocDrawpaintStruc"代表DocDraw是函数名paintStruc是函数的本地成员变量。NewName填新名称。只填标记名不填上层容器名。OutputSearchResults如果勾选搜索替换结果日志会被输出到SearchResults窗口中。可以通过Windows菜单来切换或ctrltab切换察看。并且每一条记录旁会有SourceLink链接到替换发生地文件。ConfirmEachReplacement每次替换询问。SkipComments不重名注释部分。【使用心得列表】(1)如何用SmartRename重命名数组的数组名?如果只选取数组名会报错!(2)如果勾掉SmartReferenceMatching会搜索全部项目文件并且OldName框中不显示完全限定名如果勾选SmartReferenceMatching无法重命名数组名而且鼠标位置不正确时会报错。应该如何应对?、、、、在在在在SourceInsight中提供的正则表达式中提供的正则表达式中提供的正则表达式中提供的正则表达式在在在在SourceInsight中提供的正则表达式中提供的正则表达式中提供的正则表达式中提供的正则表达式正则表达式是用来匹配复杂模式的特殊搜索用字符串。正则表达式串中许多字符具有特殊的含义。例如有个特殊的字符代表"行首"。下面是SourceInsight提供的所有可用特殊字符Table:RegularExpressionCharactersCharacterMatches^(atthebeginning)beginningofline。如^Hello匹配Hello在句首。anysinglecharacterabcanysinglecharacterthatbelongstothesetabc^abcanysinglecharacterthatdoesnotbelongtothesetabc*zeroormoreoccurrencesoftheprecedingcharacteratabcharactersaspacecharacterwwhitespace(ataboraspacecharacter)$theendoftheline。如TRUE$匹配TRUE在句尾。转义字符。如果在它后面有元字符取消其特殊含义。可利用"("和")"、把正则表达式分割成不同的组组组组模式中的每个组自左向右指定为Group#nn=,,…组的组的组的组的概念概念概念概念在替换时很有用。例如abc(xyz)可匹配abcxyz其中xyz被认为是group#利用来替换(abc)(xyz)替换结果为xyzabc。正则表达式在配置正则表达式在配置正则表达式在配置正则表达式在配置tc编译器中的应用编译器中的应用编译器中的应用编译器中的应用正则表达式格式与源代码文件路径相对应这里我的tc安装目录为d:tctc源文件放在d:tcsrc下并命名为qnc或qtnc(其中n=,,…)。观察Tc编译器某一次输出错误信息的格式Errord:tcsrcqc:LvaluerequiredinfunctionjsSort则我们要匹配"d:tcsrcqc"部分进一步地按照SourceInsight捕捉输出并加以解析时的要求要以组的形式、分别匹配"d:tcsrcqc"中的文件部分和行号部分行号(*)空格行号s(*)文件名(d:tcsrcqQtT*cC)全部加起来为(d:tcsrcqQtT**cC)s(*)正正正正则表达式在配置则表达式在配置则表达式在配置则表达式在配置javac编译器中的应用编译器中的应用编译器中的应用编译器中的应用我的JAVAHOME是c:jdk我的java源文件放于d:javasrc中并命名为qnjava或qtnjava(其中n=,,…)。观察JDK编译器某一次输出错误信息的格式D:javasrcQjava::''expected正则表达式为(dD:javasrcqQtT**java):(*)、、、、自定义命令自定义命令自定义命令自定义命令自定义命令与项目相关在一个项目中定义的所有自定义命令属于该项目、只对该项目有效(包括快捷键等)。自定义命令类似于命令行批处理文件。SIS允许自定义命令在后台运行并可以捕捉自定义命令的输出、放置于文件中、或粘贴入当前光标插入点。分别利用上面SIS对输出信息的处理方式自定义命令对集成编译器相当有用可以捕捉编译器输出并创建SourceLink寻错自定义命令对于文本过滤也相当有用可选中待过滤区块、运行Sort自定义命令、粘贴回选定区块、即完成文本过滤。请按下面步骤创建自定义命令Options菜单CustomCommand点右边Add钮、填入新自定义命令名称或下拉左边Commands、选择命令进行修改Run框、填入待执行命令行可含有特殊元字符见后面的元字符表Dir框、执行命令行时应处的目录如不填以源代码文件所在目录为命令执行目录勾选Output框的CaptureOutput、输出被捕捉如果勾选PasteOutput输出被粘贴勾选ControlGroup框中的SaveFilesFirst、SIS会在运行命令前先检查文件是否保存勾选ControlGroup框中的PauseWhenDone、SIS会在命令结束后暂停、方便检查勾选SourceLinksinOutput框中的ParseSourceLinksp>sourceinsight常用宏转自:http:blogcsdnnetJupinarchiveaspx说明:该宏文件实现一些编码程中能会到的功能,如添加文件头、函数说明和宏定义等,使用时能自动添加文件名、函数名和当前日期使用说明:Project>OpenProject打开Base工程(该工程一般在"我的文档SourceInsightProjectsBase"中)Project>AddandRemoveProjectFiles加入宏文件(即Gaokeem)Options>MenuAssignments打开MenuAssignments窗口,在Command中输入Macro,选中要使用的宏,添加到合适的菜单中*附上宏定义文件**temasmallcollectionofusefuleditingmacros********************************************************************************InsFileHeaderinserttheinformationoffile**modificationhistory**a,mar,addedDESCRIPTIONbyt*a,mar,twritten********************************************************************************INSERTHEADERInsertsacommentheaderblockatthetopofthecurrentfunctionThisactuallyworksfontsize:px">Tousethis,defineanenvironmentvariable"szMyName"andsetittoyouremailnameegsetszMyName=raygr*macroInsFileHeader(){*#########################################################################################################################SetszMyNamevariabletoyourname###############forexampleszMyName="t"##########################################################################################################################*szMyName=""GetcurrenttimeszTime=GetSysTime()Day=szTimeDayMonth=szTimeMonthYear=szTimeYearif(Day<)szDay="Day"elseszDay=DayszMonth=NumToName(Month)hBuf=GetCurrentBuf()szpathName=GetBufName(hBuf)szfileName=GetFileName(szpathName)nlength=StrLen(szfileName)szInf=Ask("Entertheinformationoffile:")szDescription=Ask("Enterthedescriptionoffile:")hbuf=GetCurrentBuf()beginassemblingthetitlestringInsBufLine(hbuf,,"******************************************************************************")InsBufLine(hbuf,,"*szfileNameszInf")InsBufLine(hbuf,,"*")InsBufLine(hbuf,,"*CopyrightGuangzhouGaokeCommunicationTechnologyCo,Ltd")InsBufLine(hbuf,,"*")InsBufLine(hbuf,,"*DESCRIPTION:")InsBufLine(hbuf,,"*szDescription")InsBufLine(hbuf,,"*modificationhistory")InsBufLine(hbuf,,"*")InsBufLine(hbuf,,"*a,szDayszMonthYear,szMyNamewritten")InsBufLine(hbuf,,"*")InsBufLine(hbuf,,"******************************************************************************")puttheinsertionpointinsidetheheadercommentSetBufIns(hbuf,,nlengthstrlen(szInf))}*******************************************************************************InsFunHeaderinsertfunction'sinformation**modificationhistory**a,mar,addedDESCRIPTIONbyt*a,mar,twritten*******************************************************************************macroInsFunHeader(){Gettheowner'snamefromtheenvironmentvariable:szMyNameIfthevariabledoesn'texist,thentheownerfieldisskipped*#########################################################################################################################SetszMyNamevariabletoyourname###############forexampleszMyName="t"##########################################################################################################################*szMyName=""Getahandletothecurrentfilebufferandthenameandlocationofthecurrentsymbolwherethecursorishbuf=GetCurrentBuf()szFunc=GetCurSymbol()ln=GetSymbolLine(szFunc)GetcurrenttimeszTime=GetSysTime()Day=szTimeDayMonth=szTimeMonthYear=szTimeYearif(Day<)szDay="Day"elseszDay=DayszMonth=NumToName(Month)szInf=Ask("Entertheinformationoffunction:")szDescription=Ask("Enterthedescriptionoffunction:")beginassemblingthetitlestringsz="******************************************************************************"InsBufLine(hbuf,ln,sz)InsBufLine(hbuf,ln,"*szFuncszInf")InsBufLine(hbuf,ln,"*DESCRIPTION:")InsBufLine(hbuf,ln,"*szDescription")removebytCutWord(szDescription)InsBufLine(hbuf,ln,"*Input:")InsBufLine(hbuf,ln,"*Output:")InsBufLine(hbuf,ln,"*Returns:")InsBufLine(hbuf,ln,"*")InsBufLine(hbuf,ln,"*modificationhistory")InsBufLine(hbuf,ln,"*")InsBufLine(hbuf,ln,"*a,szDayszMonthYear,szMyNamewritten")InsBufLine(hbuf,ln,"*")InsBufLine(hbuf,ln,"******************************************************************************")puttheinsertionpointinsidetheheadercommentSetBufIns(hbuf,ln,strlen(szFunc)strlen(szInf))}*******************************************************************************NumToNamechangethemonthnumbertoname**modificationhistory**a,mar,twritten*******************************************************************************macroNumToName(Month){if(Month==)return"jan"if(Month==)return"feb"if(Month==)return"mar"if(Month==)return"apr"if(Month==)return"may"if(Month==)return"jun"if(Month==)return"jul"if(Month==)return"aug"if(Month==)return"sep"if(Month==)return"oct"if(Month==)return"nov"if(Month==)return"dec"}*******************************************************************************CutWordautonewline**modificationhistory**a,mar,tfixsomebug*a,mar,twritten*******************************************************************************macroCutWord(ncurLine,szInf){LENGTH=nlength=StrLen(szInf)i=*loopcontrol*begin=*firstcharacter'sindexofcurrentline*pre=*precedingword'sindex*hbuf=GetCurrentBuf()nline=GetBufLnCur()while(i<nlength){*removebytnrow=sz=""while(nrow<){if(nlength<)breaksz=Cat(sz,szInfnrow)nrow=nrownlength=nlength}InsBufLine(hbuf,nline,sz)szInf=szInfnrow}*c=szInfiif(""==c(ib<LENGTH)){pre=i}elseif(""==c){szOutput=""k=begin*loopcontrol*while(k<pre){szOutput=Cat(szOutput,szInfk)k=k}InsBufLine(hbuf,ncurLine,sz)ncurLine=ncurLinebegin=pre}i=i}if(h!=i){szOutput=""k=begin*loopcontrol*while(k<pre){szOutput=Cat(szOutput,szInfk)k=k}InsBufLine(hbuf,ncurLine,sz)ncurLine=ncurLine}}*******************************************************************************GetFileNamegetthefilenamefontsize:px">returnname}*******************************************************************************ReturnTrueOrFalseInserts"ReturnsTrueorFalse"atthecurrentline**modificationhistory**a,mar,twritten*******************************************************************************macroReturnTrueOrFalse(){szReturns="returnTrueifsuccessfulorFalseiferrors"hbuf=GetCurrentBuf()ln=GetBufLnCur(hbuf)szCurLine=GetBufLine(hbuf,ln)DelBufLine(hbuf,ln)InsBufLine(hbuf,ln,"szCurLineszReturns")SetBufIns(hbuf,ln,StrLen(szReturns)StrLen(szCurLine))}*******************************************************************************InsHeade

精彩专题

职业精品

上传我的资料

热门资料

资料评价:

/ 44
所需积分:0 立即下载

意见
反馈

返回
顶部

Q