sourceinsight常用宏

来源:互联网 发布:儿童发音矫正软件 编辑:程序博客网 时间:2024/05/18 21:49

// sourceinsight常用宏 

//

//作者: 佚名 时间:2005-02-03 11:03出处:互连网 

//摘要:sourceinsight常用宏 

//

//

//说明:

//  该宏文件实现一些编码程中能会到的功能, 如添加文件头、函数说明和宏定义等,使用时能自动添加文件名、函数名和当前日期.

//

//使用说明:

//   1.Project->Open Project... 打开Base工程(该工程一般在"我的文档\SourceInsight\Projects\Base"中);

//   2.Project->Add and Remove Project Files...加入宏文件(即Gaoke.em);

//   3.Options->Menu Assignments 打开Menu Assignments窗口,在Command中输入Macro, 选中要使用的宏, 添加到合适的菜单中.

//


 //附上宏定义文件//

 // .em - asmall collection of useful editing macros//

 

 

  


//


//-------------------------------------------------------------------------

// I N S E R T  H E A D E R

//==================

//Inserts a comment headerblock at the top of the current function.

//This actually works on anytype of symbol, not just functions.

//

// To use this, define anenvironment variable "szMyName" and set it

// to your email name. eg. set szMyName=raygr

//-------------------------------------------------------------------------//



macroInsFileHeader()

{

 //#

   # Set szMyName variable to your name  

   # for example   szMyName = ""   

   #//

  szMyName =""


  // Getcurrent time

  szTime =GetSysTime(1)

  Day =szTime.Day

  Month =szTime.Month

  Year =szTime.Year

  if (Day< 10)

       szDay ="@"

 else

  szDay =Day

  szMonth =NumToName(Month)


  hBuf           = GetCurrentBuf()

  szpathName= GetBufName(hBuf)

  szfileName   =GetFileName(szpathName)

  nlength       = StrLen(szfileName)

  szInf           = Ask("Enter the information offile:")

 szDescription = Ask("Enter the description of file:")


  hbuf =GetCurrentBuf()

  // beginassembling the title string

 InsBufLine(hbuf, 0, "//")


  // put theinsertion point inside the header comment

 SetBufIns(hbuf, 1, nlength + strlen(szInf) + 8)

}


//

macroInsFunHeader()

{

  // Get theowner's name from the environment variable: szMyName.

  // If thevariable doesn't exist, then the owner field is skipped.


 //#

  #          Set szMyName variable to yourname 

  #           for example   szMyName = ""

  #

 //

  szMyName =""

  // Get ahandle to the current file buffer and the name

  // andlocation of the current symbol where the cursor is.

  hbuf =GetCurrentBuf()

  szFunc =GetCurSymbol()

  ln =GetSymbolLine(szFunc)


  // Getcurrent time

  szTime =GetSysTime(1)

  Day =szTime.Day

  Month =szTime.Month

  Year =szTime.Year

  if (Day< 10)

  szDay ="@"

 else

  szDay =Day

  szMonth =NumToName(Month)

  szInf =Ask("Enter the information of function:")

 szDescription = Ask("Enter the description offunction:")


  // beginassembling the title string

  sz ="//")


  // put theinsertion point inside the header comment

 SetBufIns(hbuf, ln + 1, strlen(szFunc) + strlen(szInf) +8)

}



//

macroNumToName(Month)

{

  if (Month== 1)

  return"jan"

  if (Month== 2)

  return"feb"

  if (Month== 3)

  return"mar"

  if (Month== 4)

  return"apr"

  if (Month== 5)

  return"may"

  if (Month== 6)

  return"jun"

  if (Month== 7)

  return"jul"

  if (Month== 8)

  return"aug"

  if (Month== 9)

  return"sep"

  if (Month== 10)

  return"oct"

  if (Month== 11)

  return"nov"

  if (Month== 12)

  return"dec"

}


//

macro CutWord(ncurLine,szInf)

{

 LENGTH =63

 nlength =StrLen(szInf)

 i = 0 //loop control//

 begin = 0// first character's index of current line//

 pre = 0 //preceding word's index//

 hbuf =GetCurrentBuf()

 // nline =GetBufLnCur()

 while (i< nlength)

 {

  // removeby 

  nrow =0

  sz =""

  while(nrow < 80)

 {

  if (nlength < 0)

   break

  sz = Cat(sz, szInf[nrow])

  nrow = nrow + 1

  nlength = nlength - 1

 }

 InsBufLine(hbuf, nline, sz)

  szInf =szInf[nrow]

 }

 //

  c =szInf[i]

  if (" " ==@c@ && (i - b <LENGTH))

 {

  pre = i

 }

  else if ("" == @c@)

 {

  szOutput = ""

  k = begin // loop control//

  while (k < pre)

  {

   szOutput = Cat(szOutput, szInf[k])

   k = k + 1

  }

  InsBufLine(hbuf, ncurLine, sz)

  ncurLine = ncurLine + 1

  begin = pre

 }

  i = i +1

 }

 if (h != i- 1)

 {

  szOutput =""

  k = begin// loop control//

  while (k< pre)

 {

  szOutput = Cat(szOutput, szInf[k])

  k = k + 1

 }

 InsBufLine(hbuf, ncurLine, sz)

  ncurLine =ncurLine + 1

 }

}


//

macroGetFileName(pathName)

{

 nlength =strlen(pathName)

 i = nlength- 1

 name =""

 while (i +1)

 {

 ch =pathName[i]

 if ("\\" =="@ch@")

 break

 i = i -1

 }

 i = i +1

 while (i< nlength)

 {

 name =cat(name, pathName[i])

 i = i +1

 }

 returnname

}


//

macroReturnTrueOrFalse()

{

 szReturns ="return True if successful or False if errors."

 hbuf =GetCurrentBuf()

 ln =GetBufLnCur(hbuf)

 szCurLine =GetBufLine(hbuf, ln)

 DelBufLine(hbuf,ln)

 InsBufLine(hbuf,ln, "@szCurLine@@szReturns@")

 SetBufIns(hbuf,ln, StrLen(szReturns) + StrLen(szCurLine) + 3)

}


//

macroInsHeaderDef()

{

 hBuf =GetCurrentBuf()

 szpathName= GetBufName(hBuf)

 szfileName= GetFileName(szpathName)

 szfileName= toupper(szfileName)

 nlength =StrLen(szfileName)

 i = 0 //loop control//

 szdefineName= ""

 while (i< nlength)

 {

  if(szfileName[i] == ".")

  szdefineName = Cat(szdefineName, "_")

 else

  szdefineName = Cat(szdefineName,szfileName[i])

  i = i +1

 }

 szdefineName= Cat("_", szdefineName)

 IfdefineSz(szdefineName)

}


//

macro PrintDate()

{

 szTime =GetSysTime(1)

 Day =szTime.Day

 Month =szTime.Month

 Year =szTime.Year

 if (Day< 10)

  szDay ="@"

 else

  szDay =Day

 szMonth =NumToName(Month)

 hbuf =GetCurrentBuf()

 ln =GetBufLnCur(hbuf)

 szCurLine =GetBufLine(hbuf, ln)

 DelBufLine(hbuf,ln)

 InsBufLine(hbuf,ln, "@szCurLine@ @szDay@@szMonth@@Year@")

 SetBufIns(hbuf,ln, StrLen(szCurLine) + 10)

}



// Ask user for ifdefcondition and wrap it around current

// selection.

// 28mar2003, modified by.

// 26mar2003, modified by.

macro InsIfdef()

{

 sz =Ask("Enter ifdef condition:")

 if (sz !="")

 {

  //IfdefSz(sz);

  hwnd =GetCurrentWnd()

  sel =GetWndSel(hwnd)

  hbuf =GetWndBuf(hwnd)

  // getline the selection (insertion point) is on

  szLine =GetBufLine(hbuf, sel.lnFirst - 1);

  chTab =CharFromAscii(9)

  // preparea new indented blank line to be inserted.

  // keepwhite space on left and add a tab to indent.

  // thispreserves the indentation level.

  i = 0 //loop control//

  ich =""

  while(szLine[i] == " " || szLine[i] == chTab)

 {

  ich = Cat(ich, szLine[i])

  i = i + 1

 }

 InsBufLine(hbuf, sel.lnFirst, "")

 InsBufLine(hbuf, sel.lnFirst + 1, "@ich@#ifdef @sz@")

 InsBufLine(hbuf, sel.lnFirst + 2, "@ich@" # chTab)

 InsBufLine(hbuf, sel.lnFirst + 3, "@ich@#endif  //@sz@//")

 SetBufIns(hbuf, sel.lnFirst + 2, StrLen(ich) +StrLen(chTab))

 }

}



// Wrap ifdeinef .. endifaround the current selection

macroIfdefineSz(sz)

{

 hwnd =GetCurrentWnd()

 lnFirst =GetWndSelLnFirst(hwnd)

 lnLast =GetWndSelLnLast(hwnd)


 hbuf =GetCurrentBuf()

 InsBufLine(hbuf,lnFirst, "#ifndef @sz@")

 InsBufLine(hbuf,lnFirst + 1, "#define @sz@")

 InsBufLine(hbuf,lnLast + 3,  "#endif  //@sz@//")

 SetBufIns(hbuf,lnFirst + 2, 0)

}



//   A U T O  E X P A N D  //

//-------------------------------------------------------------------------

Automatically expands Cstatements like if, for, while, switch, etc..

To use this macro,

1. Add this file to yourproject or your Base project.

2. Run theOptions->Key Assignments command and assigna

convenient keystroke to the"AutoExpand" command.

3. After typing a keyword,press the AutoExpand keystroke to have the

statement expanded. The expanded statement will contain a ###string

which represents a fieldwhere you are supposed to type more.


The ### string is also loadedin to the search pattern so you can

use "Search Forward" toselect the next ### field.


For example:

1. you type "for" +AutoExpand key

2. this isinserted:

 for (###;###; ###)

 {

 ###

 }

3. and the first ### field isselected.

-------------------------------------------------------------------------//

//

macro AutoExpand()

{

 // getwindow, sel, and buffer handles

 hwnd =GetCurrentWnd()

 if (hwnd ==0)

 stop

 sel =GetWndSel(hwnd)

 if(sel.ichFirst == 0)

 stop

 hbuf =GetWndBuf(hwnd)


 // get linethe selection (insertion point) is on

 szLine =GetBufLine(hbuf, sel.lnFirst);

 // parseword just to the left of the insertion point

 wordinfo =GetWordLeftOfIch(sel.ichFirst, szLine)

 ln =sel.lnFirst;

 chTab =CharFromAscii(9)

 // preparea new indented blank line to be inserted.

 // keepwhite space on left and add a tab to indent.

 // thispreserves the indentation level.

 ich =0

 while(szLine[ich] == ' ' || szLine[ich] == chTab)

 {

  ich = ich+ 1

 }

 szLine =strmid(szLine, 0, ich)

 sel.lnFirst= sel.lnLast

 sel.ichFirst= wordinfo.ich

 sel.ichLim= wordinfo.ich

 // expandszWord keyword...

 if(wordinfo.szWord == "if" ||

 wordinfo.szWord== "while" ||

 wordinfo.szWord== "elseif")

 {

 SetBufSelText(hbuf, " (###)")

 InsBufLine(hbuf, ln + 1, "@szLine@" # "{");

 InsBufLine(hbuf, ln + 2, "@szLine@" # chTab);

 InsBufLine(hbuf, ln + 3, "@szLine@" # "}");

 }

 else if(wordinfo.szWord == "for")

 {

 SetBufSelText(hbuf, " (###)")

 InsBufLine(hbuf, ln + 1, "@szLine@" # "{");

 InsBufLine(hbuf, ln + 2, "@szLine@" # chTab);

 InsBufLine(hbuf, ln + 3, "@szLine@" # "}");

 }

 else if(wordinfo.szWord == "switch")

 {

 SetBufSelText(hbuf, " (###)")

 InsBufLine(hbuf, ln + 1, "@szLine@" # "{")

 InsBufLine(hbuf, ln + 2, "@szLine@" # "case ")

 InsBufLine(hbuf, ln + 3, "@szLine@" # chTab)

 InsBufLine(hbuf, ln + 4, "@szLine@" # chTab # "break;")

 InsBufLine(hbuf, ln + 5, "@szLine@" # "default:")

 InsBufLine(hbuf, ln + 6, "@szLine@" # chTab)

 InsBufLine(hbuf, ln + 7, "@szLine@" # "}")

 }

 else if(wordinfo.szWord == "do")

 {

 InsBufLine(hbuf, ln + 1, "@szLine@" # "{")

 InsBufLine(hbuf, ln + 2, "@szLine@" # chTab);

 InsBufLine(hbuf, ln + 3, "@szLine@" # "} while ();")

 }

 else if(wordinfo.szWord == "case")

 {

 SetBufSelText(hbuf, " ###")

 InsBufLine(hbuf, ln + 1, "@szLine@" # chTab)

 InsBufLine(hbuf, ln + 2, "@szLine@" # chTab # "break;")

 }

 else

 stop

 SetWndSel(hwnd,sel)

 LoadSearchPattern("###",true, false, false);

 Search_Forward

}



//   G E T  W O R D   L E F T  O F   I C H //

//-------------------------------------------------------------------------

   Given an index to a character (ich) and a string(sz),

   return a "wordinfo" record variable thatdescribes the

   text word just to the left of theich.

   Output:

    wordinfo.szWord = the wordstring

    wordinfo.ich = the first ichof the word

    wordinfo.ichLim = the limitich of the word

-------------------------------------------------------------------------//

macro GetWordLeftOfIch(ich,sz)

{

 wordinfo ="" // create a "wordinfo" structure

 chTab =CharFromAscii(9)

 // scanbackwords over white space, if any

 ich = ich -1;

 if (ich>= 0)

  while(sz[ich] == " " || sz[ich] == chTab)

 {

  ich = ich - 1;

  if (ich < 0)

  break;

 }

 // scanbackwords to start of word

 ichLim =ich + 1;

 asciiA =AsciiFromChar("A")

 asciiZ =AsciiFromChar("Z")

 while (ich>= 0)

 {

  ch =toupper(sz[ich])

  asciiCh =AsciiFromChar(ch)

  if((asciiCh < asciiA || asciiCh >asciiZ) &&!IsNumber(ch))

  break // stop at first non-identifiercharacter

  ich = ich- 1;

 }

 ich = ich +1

 wordinfo.szWord= strmid(sz, ich, ichLim)

 wordinfo.ich= ich

 wordinfo.ichLim= ichLim;

 returnwordinfo

}


 


// Utils.em - a smallcollection of useful editing macros//


//-------------------------------------------------------------------------

 I N S E R T  H E A D E R


 Inserts acomment header block at the top of the currentfunction. 

 Thisactually works on any type of symbol, not justfunctions.


 To usethis, define an environment variable "MYNAME" and set it

 to youremail name.  eg. set MYNAME=raygr

-------------------------------------------------------------------------//

macroInsertHeader()

{

 // Get theowner's name from the environment variable: MYNAME.

 // If thevariable doesn't exist, then the owner field is skipped.

 szMyName =getenv(MYNAME)

 

 // Get ahandle to the current file buffer and the name

 // andlocation of the current symbol where the cursor is.

 hbuf =GetCurrentBuf()

 szFunc =GetCurSymbol()

 ln =GetSymbolLine(szFunc)


 // beginassembling the title string

 sz = "//  "

 

 // convertsymbol name to T E X T   L I K E  T H I S//

 cch =strlen(szFunc)

 ich =0

 while (ich< cch)

 {

  ch =szFunc[ich]

  if (ich> 0)

  if (isupper(ch))

   sz = cat(sz, "   ")

  else

   sz = cat(sz, " ")

  sz =Cat(sz, toupper(ch))

  ich = ich+ 1

 }

 

 sz =Cat(sz, "  //")

 InsBufLine(hbuf,ln, sz)

 InsBufLine(hbuf,ln+1,"//-------------------------------------------------------------------------")

 

 // if ownervariable exists, insert Owner: name//

 if(strlen(szMyName) > 0)

 {

 InsBufLine(hbuf, ln+2, "   Owner: @szMyName@")

 InsBufLine(hbuf, ln+3, " ")

  ln = ln +4

 }

 else

  ln = ln +2

 

 InsBufLine(hbuf,ln,   "    ") //provide an indent already

 InsBufLine(hbuf,ln+1,"-------------------------------------------------------------------------//")

 

 // put theinsertion point inside the header comment

 SetBufIns(hbuf,ln, 4)

}



//InsertFileHeader:


  Inserts a comment header block at the top of thecurrent function. 

  This actually works on any type of symbol, notjust functions.


  To use this, define an environment variable"MYNAME" and set it

  to your email name.  eg. setMYNAME=raygr

//


macroInsertFileHeader()

{

 szMyName =getenv(MYNAME)

 

 hbuf =GetCurrentBuf()


 InsBufLine(hbuf,0,"//-------------------------------------------------------------------------")

 

 // if ownervariable exists, insert Owner: name//

 InsBufLine(hbuf,1, "    ")

 if(strlen(szMyName) > 0)

 {

  sz = "   Owner: @szMyName@"

 InsBufLine(hbuf, 2, " ")

 InsBufLine(hbuf, 3, sz)

  ln =4

 }

 else

  ln =2

 

 InsBufLine(hbuf,ln,"-------------------------------------------------------------------------//")

}


// Inserts "Returns True ..or False..." at the current line

macroReturnTrueOrFalse()

{

 hbuf =GetCurrentBuf()

 ln =GetBufLineCur(hbuf)


 InsBufLine(hbuf,ln, "    Returns True ifsuccessful or False if errors.")

}


// Inserts ifdef REVIEWaround the selection//

macroIfdefReview()

{

 IfdefSz("REVIEW");

}



// Inserts ifdef BOGUS aroundthe selection//

macro IfdefBogus()

{

 IfdefSz("BOGUS");

}



// Inserts ifdef NEVER aroundthe selection//

macro IfdefNever()

{

 IfdefSz("NEVER");

}



// Ask user for ifdefcondition and wrap it around current

// selection.

macroInsertIfdef()

{

 sz =Ask("Enter ifdef condition:")

 if (sz !="")

 IfdefSz(sz);

}


macroInsertCPlusPlus()

{

 IfdefSz("__cplusplus");

}



// Wrap ifdef<sz> .. endif around the currentselection

macro IfdefSz(sz)

{

 hwnd =GetCurrentWnd()

 lnFirst =GetWndSelLnFirst(hwnd)

 lnLast =GetWndSelLnLast(hwnd)

  

 hbuf =GetCurrentBuf()

 InsBufLine(hbuf,lnFirst, "#ifdef @sz@")

 InsBufLine(hbuf,lnLast+2, "#endif // @sz@//")

}



// Delete the current lineand appends it to the clipboard buffer

macro KillLine()

{

 hbufCur =GetCurrentBuf();

 lnCur =GetBufLnCur(hbufCur)

 hbufClip =GetBufHandle("Clipboard")

 AppendBufLine(hbufClip,GetBufLine(hbufCur, lnCur))

 DelBufLine(hbufCur,lnCur)

}



// Paste lines killed withKillLine (clipboard is emptied)

macroPasteKillLine()

{

 Paste

 EmptyBuf(GetBufHandle("Clipboard"))

}


// delete all lines in thebuffer

macroEmptyBuf(hbuf)

{

 lnMax =GetBufLineCount(hbuf)

 while(lnMax > 0)

 {

 DelBufLine(hbuf, 0)

  lnMax =lnMax - 1

 }

}



// Ask the user for a symbolname, then jump to its declaration

macroJumpAnywhere()

{

 symbol =Ask("What declaration would you like to see?")

 JumpToSymbolDef(symbol)

}


 

// list all siblings of auser specified symbol

// A sibling is any othersymbol declared in the same file.

macroOutputSiblingSymbols()

{

 symbol =Ask("What symbol would you like to list siblings for?")

 hbuf =ListAllSiblings(symbol)

 SetCurrentBuf(hbuf)

}



// Given a symbol name, openthe file its declared in and 

// create a new output bufferlisting all of the symbols declared

// in that file. Returns the new buffer handle.

macroListAllSiblings(symbol)

{

 loc =GetSymbolLocation(symbol)

 if (loc =="")

 {

  msg("@symbol@ not found.")

 stop

 }

 

 hbufOutput= NewBuf("Results")

 

 hbuf =OpenBuf(loc.file)

 if (hbuf ==0)

 {

  msg("Can't open file.")

 stop

 }

  

 isymMax =GetBufSymCount(hbuf)

 isym =0;

 while (isym< isymMax)

 {

 AppendBufLine(hbufOutput, GetBufSymName(hbuf, isym))

  isym =isym + 1

 }


 CloseBuf(hbuf)

 

 returnhbufOutput


}

0 0