- 目前情况:
- 多行注释
- 用最小的缩进数进行注释
- 跳过空行
- 只选中当前一行空行的,不跳过
- 单行加注释时候,光标自动跳到最后
- 注释时,双斜杠和一个空格
- 去掉注释时候,自动判断有没有空格
- todo:
- 支持tab
- 有选中文本的时候,加完注释,重新选中正确的文本
- 现在的判断为单斜杠,完善一下
macro MultiLineComment()
{
hwnd = GetCurrentWnd()
selection = GetWndSel(hwnd)
LnFirst = GetWndSelLnFirst(hwnd) //取首行行号
LnLast = GetWndSelLnLast(hwnd) //取末行行号
hbuf = GetCurrentBuf()
// 判断是否需要注释,条件:只要有一行没有注释就需要全部添加一次注释
Ln = Lnfirst
flagAddComment = false
spaceCnt = 256
while(Ln <= Lnlast) {
buf = GetBufLine(hbuf, Ln) //取Ln对应的行
// 统计前置空白数
len = strlen(buf)
q = 0
while(q < len) {
if(StrMid(buf,q,q+1) !=" ")
break
q = q + 1
}
//跳过空行
if(q == len){
Ln = Ln + 1
continue
}
if(q < spaceCnt){
spaceCnt = q
spaces = StrMid(buf,0,q)
}
// 判断是否需要添加注释
if(StrMid(buf,q,q+1) !="/"){
// todo 这里可能会有问题
flagAddComment = true
}
Ln = Ln + 1
}
//debug
//PutBufLine(hbuf, Ln-1, Cat(buf, spaceCnt))
Comment = Cat(spaces, "// ")
Ln = Lnfirst
buf = GetBufLine(hbuf, Ln)
len =strlen(buf)
while(Ln <= Lnlast) {
buf = GetBufLine(hbuf, Ln) //取Ln对应的行
// 统计前置空白数
len = strlen(buf)
p = 0
while(p < len) {
if(StrMid(buf,p,p+1) !=" ")
break
p = p + 1
}
//跳过空行
if(p == len){
//特殊处理,只选中一行,且为空
if(LnFirst == Lnlast){
PutBufLine(hbuf, Ln, Cat(buf, "// "))
SetBufIns(hbuf, Ln, p + 3)
}
Ln = Ln + 1
continue
}
if(flagAddComment){
len = strlen(buf)
buf = StrMid(buf,spaceCnt,len)
PutBufLine(hbuf, Ln, Cat(Comment, buf))
}else{
if(p <= len - 3){
if(StrMid(buf, p, p+3) =="// ")
PutBufLine(hbuf, Ln, Cat(spaces, StrMid(buf, p+3, Strlen(buf))))
else if(StrMid(buf, p, p+2) =="//")
PutBufLine(hbuf, Ln, Cat(spaces, StrMid(buf, p+2, Strlen(buf))))
}else if(p <= len - 2){
if (StrMid(buf, p, p+2) =="//")
PutBufLine(hbuf, Ln, Cat(spaces, StrMid(buf, p+2, Strlen(buf))))
}
}
Ln = Ln + 1
}
// SetWndSel(hwnd, selection)
}