zoukankan      html  css  js  c++  java
  • 【Source Insight 】之marco学习笔记2

    现在我们看先看一个

     官方地址https://www.sourceinsight.com/download/macro-files/中的

    autoexp.em              Automatically expands C statements like if, for, while, switch, etc..  
    /*   A U T O   E X P A N D   */
    /*-------------------------------------------------------------------------
        Automatically expands C statements like if, for, while, switch, etc..
    
        To use this macro, 
            1. Add this file to your project or your Base project.
            
            2. Run the Options->Key Assignments command and assign a 
            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 field where you are supposed to type more.
            
            The ### string is also loaded in to the search pattern so you can 
            use "Search Forward" to select the next ### field.
    
        For example:
            1. you type "for" + AutoExpand key
            2. this is inserted:
                for (###; ###; ###)
                    {
                    ###
                    }
            3. and the first ### field is selected.
    -------------------------------------------------------------------------*/
    macro AutoExpand()
    {
        // get window, sel, and buffer handles
        hwnd = GetCurrentWnd()
        if (hwnd == 0)
            stop
        sel = GetWndSel(hwnd)
        if (sel.ichFirst == 0)
            stop
        hbuf = GetWndBuf(hwnd)
        
        // get line the selection (insertion point) is on
        szLine = GetBufLine(hbuf, sel.lnFirst);
        
        // parse word just to the left of the insertion point
        wordinfo = GetWordLeftOfIch(sel.ichFirst, szLine)
        ln = sel.lnFirst;
        
        chTab = CharFromAscii(9)
        
        // prepare a new indented blank line to be inserted.
        // keep white space on left and add a tab to indent.
        // this preserves the indentation level.
        ich = 0
        while (szLine[ich] == ' ' || szLine[ich] == chTab)
            {
            ich = ich + 1
            }
        
        szLine = strmid(szLine, 0, ich) # chTab
        sel.lnFirst = sel.lnLast
        sel.ichFirst = wordinfo.ich
        sel.ichLim = wordinfo.ich
        
        // expand szWord keyword...
    
        
        if (wordinfo.szWord == "if" || 
            wordinfo.szWord == "while" ||
            wordinfo.szWord == "elseif")
            {
            SetBufSelText(hbuf, " (###)")
            InsBufLine(hbuf, ln + 1, "@szLine@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "###");
            InsBufLine(hbuf, ln + 3, "@szLine@" # "}");
            }
        else if (wordinfo.szWord == "for")
            {
            SetBufSelText(hbuf, " (###; ###; ###)")
            InsBufLine(hbuf, ln + 1, "@szLine@" # "{");
            InsBufLine(hbuf, ln + 2, "@szLine@" # "###");
            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@" # "}")
            }
        else if (wordinfo.szWord == "do")
            {
            InsBufLine(hbuf, ln + 1, "@szLine@" # "{")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "###");
            InsBufLine(hbuf, ln + 3, "@szLine@" # "} while (###);")
            }
        else if (wordinfo.szWord == "case")
            {
            SetBufSelText(hbuf, " ###:")
            InsBufLine(hbuf, ln + 1, "@szLine@" # "###")
            InsBufLine(hbuf, ln + 2, "@szLine@" # "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 that describes the 
        text word just to the left of the ich.
    
        Output:
            wordinfo.szWord = the word string
            wordinfo.ich = the first ich of the word
            wordinfo.ichLim = the limit ich of the word
    -------------------------------------------------------------------------*/
    macro GetWordLeftOfIch(ich, sz)
    {
        wordinfo = "" // create a "wordinfo" structure
        
        chTab = CharFromAscii(9)
        
        // scan backwords over white space, if any
        ich = ich - 1;
        if (ich >= 0)
            while (sz[ich] == " " || sz[ich] == chTab)
                {
                ich = ich - 1;
                if (ich < 0)
                    break;
                }
        
        // scan backwords 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-identifier character
            ich = ich - 1;
            }
        
        ich = ich + 1
        wordinfo.szWord = strmid(sz, ich, ichLim)
        wordinfo.ich = ich
        wordinfo.ichLim = ichLim;
        
        return wordinfo
    }

  • 相关阅读:
    学习笔记|数组的扩展
    javascript日期 时间处理类库
    v-if v-for同时使用 解决eslint报错问题
    跳出foreach循环
    live-player live-pusher惨案
    TypeError: Object(…) is not a function
    实现垂直水平居中的方法
    面试时候遇到的笔试题
    ajax跨域
    Bootstrap响应式相关
  • 原文地址:https://www.cnblogs.com/libra13179/p/6741441.html
Copyright © 2011-2022 走看看