// 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
}