Source Insight实现Ctrl+/,自动注释或者去掉注释

  1. 目前情况:
    1. 多行注释
    2. 用最小的缩进数进行注释
    3. 跳过空行
    4. 只选中当前一行空行的,不跳过
      1. 单行加注释时候,光标自动跳到最后
    5. 注释时,双斜杠和一个空格
    6. 去掉注释时候,自动判断有没有空格
  2. todo:
    1. 支持tab
    2. 有选中文本的时候,加完注释,重新选中正确的文本
    3. 现在的判断为单斜杠,完善一下
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)
}
posted @ 2020-06-29 18:19  AmosLee94  阅读(1017)  评论(0编辑  收藏  举报