source insight自定义宏脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了source insight自定义宏脚本相关的知识,希望对你有一定的参考价值。

  1 /* 获取当前的文件名*/
  2 macro wcjFileName()
  3 {
  4     hbuf = GetCurrentBuf()
  5     
  6     fullname = GetBufName(hbuf)  
  7     length = strlen(fullname) 
  8     if (length == 0)
  9         return ""
 10 
 11     index = length
 12     while ("\\" !=  fullname[--index]);
 13 
 14     purename = ""
 15     while (index < length)
 16         purename = cat(purename, fullname[++index])
 17         
 18     return purename
 19 }
 20 
 21 /*头文件定义名称*/
 22 macro wcjIncDefName()
 23 {
 24     filename = wcjFileName();
 25     length = strlen(filename);
 26 
 27     defname = "__"
 28     index = 0;
 29     while (index < length)
 30     {
 31         if (filename[index] == ".")
 32             defname = cat(defname, "_")
 33         else
 34             defname = cat(defname, toupper(filename[index]))
 35 
 36         ++index
 37     }
 38 
 39     defname = cat(defname, "__")
 40 
 41     return defname
 42 }
 43 
 44 /*获取当前时间*/
 45 macro wcjGetTime()
 46 {
 47     var  year
 48     var  month
 49     var  day
 50     var  commTime
 51     var  sysTime
 52 
 53     sysTime = GetSysTime(1)
 54     year = sysTime.Year
 55     month = sysTime.month
 56     day = sysTime.day
 57     commTime = "@[email protected]@[email protected]@[email protected]"
 58     return commTime
 59 }
 60 
 61 /**************************************new file related***********************************************/
 62 macro _wcjCommentFile()
 63 {
 64     szMyName = "wcj"
 65     
 66     hbuf = GetCurrentBuf()
 67     ln = 0
 68     InsBufLine(hbuf, ln++, "/*-------------------------------------------------------------------------")
 69     InsBufLine(hbuf, ln++, cat("    File:     ", wcjFileName())
 70     InsBufLine(hbuf, ln++, cat("    Author: ", szMyName))
 71     InsBufLine(hbuf, ln++, cat("    Date:     ", wcjGetTime())
 72     InsBufLine(hbuf, ln++, cat("    Desc:     ", ""))
 73     InsBufLine(hbuf, ln++, "-------------------------------------------------------------------------*/")
 74 
 75     /* 设置光标正确的位置 */
 76     SetBufIns(hbuf, ln, 0)
 77     
 78     return true
 79 }
 80 
 81 /*在当前行的前一行添加注释*/
 82 macro _wcjCommentBefore()
 83 {
 84     hbuf = GetCurrentBuf()
 85     ln      = GetBufLnCur(hbuf)
 86 
 87     comment = ""
 88 
 89     /*补足空格*/
 90     text = GetBufLine(hbuf, ln)
 91     index = 0
 92     while (true) 
 93     {
 94         c = text[index++]
 95         if (c != " " && c != "    ")
 96             break;
 97             
 98         comment = cat(comment, c)    
 99     }
100     
101     comment = cat(comment, "/**<  */")
102         
103     InsBufLine(hbuf, ln, comment)
104 
105     /* 设置光标正确的位置 */
106     SetBufIns(hbuf, ln, strlen(comment) - 3)
107     
108     return true
109 }
110 
111 macro _wcjCommentHeader()
112 {
113     hbuf = GetCurrentBuf()
114 
115     szFunc = GetCurSymbol()
116     ln = GetSymbolLine(szFunc)
117     SetBufIns(hbuf, ln, 0)
118     
119     return _wcjCommentBefore()
120 
121 }
122 
123 macro _wcjHandleComment(key)
124 {
125     if (key == "commentfile" || key == "cf")    
126         return _wcjCommentFile()
127     if (key == "commentbefore" || key == "commentbef" || key == "cb")    
128         return _wcjCommentBefore()
129     if (key == "commentheader" || key == "ch")
130         return _wcjCommentHeader()
131 
132     return false
133 }
134 
135 /**************************************new file related***********************************************/
136 macro _wcjNewFile(bInc)
137 {
138     defname = wcjIncDefName()
139 
140     _wcjCommentFile()
141     
142     hbuf = GetCurrentBuf()
143     ln      = GetBufLnCur(hbuf)
144 
145     if (bInc) 
146     {
147         InsBufLine(hbuf, ln++, "#ifndef @[email protected]")
148         InsBufLine(hbuf, ln++, "#define @[email protected]")
149         InsBufLine(hbuf, ln++, "")        
150     }
151     InsBufLine(hbuf, ln++, "#ifdef _cplusplus")
152 
153     InsBufLine(hbuf, ln++, "#ifdef _cplusplus")
154     InsBufLine(hbuf, ln++, "#if _cplusplus")
155     InsBufLine(hbuf, ln++, "extern \"C\"{")
156     InsBufLine(hbuf, ln++, "#endif")
157     InsBufLine(hbuf, ln++, "#endif")    
158 
159     InsBufLine(hbuf, ln++, "")
160     cursorln = ln
161     InsBufLine(hbuf, ln++, "")
162     InsBufLine(hbuf, ln++, "")
163     
164     InsBufLine(hbuf, ln++, "#ifdef _cplusplus")
165     InsBufLine(hbuf, ln++, "#if _cplusplus")
166     InsBufLine(hbuf, ln++, "}")
167     InsBufLine(hbuf, ln++, "#endif")
168     InsBufLine(hbuf, ln++, "#endif")    
169 
170     if (bInc)
171         InsBufLine(hbuf, ln++, "#endif /* @[email protected] */")
172 
173     /* 设置光标正确的位置 */
174     SetBufIns(hbuf, cursorln, 4)    
175 }
176 macro _wcjHandleNewFile(key)
177 {
178     /*插入C标准的include文件内容*/
179     if (key == "newinc")    return _wcjNewFile(true)
180     /*插入C标准的C文件内容*/
181     if (key == "newc")        return _wcjNewFile(true)
182 
183     return false
184 }
185 
186 /**************************************ufp type related***********************************************/
187 /*程序中用到的自定义快捷键*/
188 macro _wcjGetUfpType(key)
189 {
190     key = tolower(key);
191     
192     if (key == "i")        return "UFP_INT32"
193     if (key == "ui" || key=="u")    
194         return "UFP_UINT32"
195     if (key == "ull")    return "UFP_UINT64"
196     if (key == "uv")    return "UFP_UINTPTR"
197     if (key == "v")        return "UFP_VOID"
198     if (key == "vp")    return "UFP_PHYS_ADDR"
199 
200     if (key == "n")        return "UFP_NULL_PTR"
201     
202     
203     return ""
204 }
205 /*快捷内容插入*/
206 macro _wcjHandleUfpType(key)
207 {
208     /*key = Ask("Enter ufp type short key");*/
209     ufptype = _wcjGetUfpType(key)
210     if (ufptype == "")
211         return false;
212     
213     /* 获得指定行文本 */
214     hbuf = GetCurrentBuf()
215     ln = GetBufLnCur(hbuf)
216     text = GetBufLine(hbuf, ln)
217 
218     /* 获得光标位置 */
219     hwnd = GetCurrentWnd()
220     sel     = GetWndSel(hwnd)
221     column = sel.ichFirst
222     
223     /* 为当前位置插入正确内容 */
224     DelBufLine(hbuf, ln)
225     before = strtrunc(text, column)
226     after  = strmid(text, column, strlen(text))
227     newtext = "@[email protected]@[email protected]@[email protected]"    
228     InsBufLine(hbuf, ln, newtext)
229 
230     /* 设置光标正确的位置 */
231     pos = column + strlen(ufptype)
232     SetBufIns(hbuf, ln, pos)
233 
234     return true;
235 }
236 
237 /**************************************macro related***********************************************/
238 /*插入ifdef*/
239 macro _wcjIfdefSz()
240 {
241     data = Ask("Enter ifdef condition:")
242     if (data == "")
243         return true
244         
245     hwnd = GetCurrentWnd()
246     lnFirst = GetWndSelLnFirst(hwnd)
247     lnLast = GetWndSelLnLast(hwnd)
248      
249     hbuf = GetCurrentBuf()
250     InsBufLine(hbuf, lnFirst, "#ifdef @[email protected]")
251     InsBufLine(hbuf, lnLast+2, "#endif /* @[email protected] */")
252 
253     return true
254 }
255 
256 /*插入if*/
257 macro _wcjIfSz(data)
258 {
259     hwnd = GetCurrentWnd()
260     lnFirst = GetWndSelLnFirst(hwnd)
261     lnLast = GetWndSelLnLast(hwnd)
262      
263     hbuf = GetCurrentBuf()
264     InsBufLine(hbuf, lnFirst, "#if @[email protected]")
265     InsBufLine(hbuf, lnLast+2, "#endif")
266 
267     return true
268 }
269 
270 macro _wcjHandleMacro(key)
271 {
272     if (key == "if0")        return _wcjIfSz(0)    
273     if (key == "ifdef")        return _wcjIfdefSz()
274 
275     return false
276 }
277 
278 /* 主入口 */
279 macro wcjMain()
280 {
281     key = Ask("Enter anthing you want:")
282     if (key == "")
283         return ""
284 
285     /*ufp type处理*/
286     if (_wcjHandleUfpType(key))            return ""
287     /*macro相关*/
288     if (_wcjHandleMacro(key))            return ""
289     /*new file*/
290     if (_wcjHandleNewFile(key))            return ""            
291     /*comment*/
292     if (_wcjHandleComment(key))            return ""
293     
294     return ""
295 }

注:

1. 这个source insight中用的脚本,将其另存为任意名称.em文件

2. base工程中add该脚本

3. 在option->key assignment中将wcjMain关联某个快捷键后即可使用

4. 该脚本功能包括类型替换、注释添加、标准的C头文件及实现文件的标准格式添加、部分宏操作等。

5. 功能尚待完善,使用时缺什么补什么。

以上是关于source insight自定义宏脚本的主要内容,如果未能解决你的问题,请参考以下文章

Source Insight添加快速注释宏定义

Source Insight添加快速注释宏定义

source insight(SI)符号标记含义

Source Insight 自定义命令说明

如何在 Source Insight 中编译和执行Java 程序

Source Insight中的多行注释