分享

工具篇之SOURCE INSIGHT快捷功能设置

 刀首木 2022-12-02 发布于广东

此文转载

原文链接:分享一下source insight 3.5的快捷配置及我的utils.em

使用方式

写入代码

打开Source Insight的base工程:
在这里插入图片描述
在这里插入图片描述打开utils.em文件:
在这里插入图片描述将本文末尾的代码替换进去(建议先把源来的代码复制一份做备份),因为代码太长避免影响阅读放在文章末尾了。

设置快捷键

utils.em中的函数可以再Options菜单->Key assignments,通过关键词搜索到,找到对应的函数后录入自己希望使用的快捷键组合(各个函数的使用说明在下面):

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述快捷键组合录入完成后点击OK完成设置。

函数说明

插入文件注释

1、Options菜单 Key assignments,通过关键词为macro InsertFileHeader,指定快捷键ctrl+shift+f。
2、Options菜单Menu assignments,通过关键词为macro InsertFileHeader, insert 到edit cut.
3、重启SourceInsight后,可以使用快捷键盘为文件自动生成注释

插入函数注释

1、Options菜单 Key assignments,为macro InsertHeader,指定快捷键ctrl+shift+h
2、Options菜单Menu assignments,通过关键词为macro InsertHeader, insert 到edit cut.
3、重启 SourceInsight后,可以使用快捷键盘为函数自动生成注释

使用SupperBack完成中文操作

1、Options菜单 Key assignments,通过关键词为macro SuperBackspace, 指定快捷键:backspace
(这里会提示已经有相应功能,无视提示。后续对Utils.em的删除只能用delete键,或者shift+backspace)
2、重启 SourceInsight后,可以自动操作中文,不会产生乱码问题。

使用InsertIfdef完成#ifdef宏块

1、Options菜单 Key assignments,通过关键词为macro InsertIfdef,指定快捷键ctrl+d
2、Options菜单Menu assignments, 通过关键词为macro InsertIfdef, 添加到edit cut.

选中代码多行注释功能

1、Options菜单 Key assignments,通过关键词为macro CodeComment,指定快捷键ctrl+/
2、Options菜单Menu assignments, 通过关键词为macro CodeComment, 添加到edit cut.

代码屏蔽#if 0

1、Options菜单 Key assignments,通过关键词为macro MacroComment,指定快捷键ctrl+0
2、Options菜单Menu assignments, 通过关键词为macro MacroComment, 添加到edit cut.

完成TAB和空格的替换

1、 Options菜单 Key assignments,通过关键词为macro Save_Tabs_To_Spaces指定快捷键ctrl+shift+空格
2、 Options菜单Menu assignments,通过关键词为macro InsertFileHeader, insert 到edit cut.
3、 重启 SourceInsight后,使用快捷键可以替换选中文字中的TAB为空格,并保存。

程序的自动补全功能

1、 Options菜单 Key assignments,通过关键词为macro AutoExpand指定快捷键ctrl+shift+a
2、重启 SourceInsight后,在输入while、for、do、if等c++关键词后,使用快捷键可以自动生成区块框架。

恢复文本全选功能

1、 Options菜单Key assignments,通过关键词select找到select all, 更改为ctrl +a.(无视提示冲突)
关闭其他打开文件
3、Options菜单Key assignments,通过关键词macro CloseOldWindows, 更改为ctrl+shift +w.(无视提示冲突)

utils.em代码

macro InsertHeader()
{
    // Get the owner's name from the environment variable: MYNAME.
    // If the variable doesn't exist, then the owner field is skipped.
    szMyName = getenv(MyName)

    // Get a handle to the current file buffer and the name
    // and location of the current symbol where the cursor is.
    hbuf = GetCurrentBuf()
    szFunc = GetCurSymbol()
    ln = GetSymbolLine(szFunc)

    InsBufLine(hbuf, ln, "/************************************************************");
    ln = ln +1

    // begin assembling the title string
    sz = "** 函数名称: " 

    /* convert symbol 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
    } 
    InsBufLine(hbuf, ln, sz)
    ln = ln + 1

    InsBufLine(hbuf, ln, "** 功能描述: ")
    ln = ln + 1

    InsBufLine(hbuf, ln, "** 输入参数:")
    ln = ln + 1

    InsBufLine(hbuf, ln, "** 输出参数: ")
    ln = ln + 1

    InsBufLine(hbuf, ln, "** 返 回 值    :")
    ln = ln + 1

    /* if owner variable exists, insert Owner: name */
    if (strlen(szMyName) > 0)
    {
        InsBufLine(hbuf, ln, "** 作    者       :  @szMyName@")                 
    }
    else
    {
        InsBufLine(hbuf, ln, "** 作    者       :  ")                 
    }
    ln = ln + 1

    // Get current time
    szTime  = GetSysTime(1)
    Day      = szTime.Day
    Month   = szTime.Month
    Year     = szTime.Year
    if (Day < 10)
        szDay = "0@Day@"
    else
        szDay = Day  

    InsBufLine(hbuf, ln, "** 日    期       :  @Year@年@Month@月@szDay@日")
    ln = ln + 1

    InsBufLine(hbuf, ln, "** 版    本       :  1.0")
    ln = ln + 1

    InsBufLine(hbuf, ln, "** 修改日期  版本号   修改人  修改内容")
    ln = ln + 1

    InsBufLine(hbuf, ln, "**************************************************************/")
}


/* InsertFileHeader:

   Inserts a comment header block at the top of the current function. 
   This actually works on any type of symbol, not just functions.

   To use this, define an environment variable "MYNAME" and set it
   to your email name.  eg. set MYNAME=raygr
*/

macro InsertFileHeader()
{
    szMyName = getenv(MyName)

    hbuf = GetCurrentBuf()

    InsBufLine(hbuf, 0, "/***************************************************************************")
    InsBufLine(hbuf, 1, "** 版权所有:  Desay Copyright (c) 2010-2015  ********************             ")
    filename = GetBufName(hbuf)
    InsBufLine(hbuf, 2, "** 文件名称:  @filename@")
    InsBufLine(hbuf, 3, "** 文件标识: ")
    InsBufLine(hbuf, 4, "** 内容摘要:  ")
    InsBufLine(hbuf, 5, "** 当前版本:  v1.0")

    /* if owner variable exists, insert Owner: name */
    if (strlen(szMyName) > 0)
    {
        sz = "** 作      者     :  @szMyName@"
    }
    else
    {
        sz = "** 作      者     :"
    }

    InsBufLine(hbuf, 6, sz)

    // Get current time
    szTime  = GetSysTime(1)
    Day      = szTime.Day
    Month   = szTime.Month
    Year     = szTime.Year
    if (Day < 10)
        szDay = "0@Day@"
    else
        szDay = Day               

    InsBufLine(hbuf, 7,   "** 完成日期: @Year@年@Month@月@szDay@日")
    InsBufLine(hbuf, 8,   "** 修改记录: ")
    InsBufLine(hbuf, 9,   "** 修改记录: ")
    InsBufLine(hbuf, 10, "** 修改日期: ")
    InsBufLine(hbuf, 11, "** 版本号      : ")
    InsBufLine(hbuf, 12, "** 修改人      : ")
    InsBufLine(hbuf, 13, "** 修改内容: ")
    InsBufLine(hbuf, 14, "***************************************************************************/")
}



// Inserts "Returns True .. or False..." at the current line
macro ReturnTrueOrFalse()
{
    hbuf = GetCurrentBuf()
    ln = GetBufLineCur(hbuf)

    InsBufLine(hbuf, ln, "    Returns True if successful or False if errors.")
}

// Ask user for ifdef condition and wrap it around current
// selection.
macro InsertIfdef()
{
    hwnd = GetCurrentWnd()
    lnFirst = GetWndSelLnFirst(hwnd)
    lnLast = GetWndSelLnLast(hwnd)

    hbuf = GetCurrentBuf()
    InsBufLine(hbuf, lnFirst, "#if defined(###)")
    InsBufLine(hbuf, lnLast+2, "#endif /* ### */")
    LoadSearchPattern("###", true, false, false);
    Search_Forward
}

macro InsertCPlusPlus()
{
    IfdefSz("__cplusplus");
}


// Wrap ifdef <sz> .. endif around the current selection
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 line and 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 with KillLine (clipboard is emptied)
macro PasteKillLine()
{
    Paste
    EmptyBuf(GetBufHandle("Clipboard"))
}



// delete all lines in the buffer
macro EmptyBuf(hbuf)
{
    lnMax = GetBufLineCount(hbuf)
    while (lnMax > 0)
    {
        DelBufLine(hbuf, 0)
        lnMax = lnMax - 1
    }
}


// Ask the user for a symbol name, then jump to its declaration
macro JumpAnywhere()
{
    symbol = Ask("What declaration would you like to see?")
    JumpToSymbolDef(symbol)
}

    
// list all siblings of a user specified symbol
// A sibling is any other symbol declared in the same file.
macro OutputSiblingSymbols()
{
    symbol = Ask("What symbol would you like to list siblings for?")
    hbuf = ListAllSiblings(symbol)
    SetCurrentBuf(hbuf)
}


// Given a symbol name, open the file its declared in and 
// create a new output buffer listing all of the symbols declared
// in that file.  Returns the new buffer handle.
macro ListAllSiblings(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)
    
    return hbufOutput

}

macro CodeComment(){//多行注释
    hwnd=GetCurrentWnd()
    selection=GetWndSel(hwnd)
    LnFirst=GetWndSelLnFirst(hwnd)//取首行行号
    LnLast=GetWndSelLnLast(hwnd)//取末行行号
    hbuf=GetCurrentBuf()
    if(GetBufLine(hbuf,0)=="//magic-number:tph85666031")
    {
        stop
    }
    Ln=Lnfirst
    buf=GetBufLine(hbuf,Ln)
    len=strlen(buf)
    while(Ln<=Lnlast)
    {
        buf=GetBufLine(hbuf,Ln)//取Ln对应的行
        if(buf=="")
        {//跳过空行
            Ln=Ln+1
            continue
        }
        if(StrMid(buf,0,1)=="/")
        {//需要取消注释,防止只有单字符的行
            if(StrMid(buf,1,2)=="/")
            {
                PutBufLine(hbuf,Ln,StrMid(buf,2,Strlen(buf)))
            }
        }
        if(StrMid(buf,0,1)!="/")
        {//需要添加注释
            PutBufLine(hbuf,Ln,Cat("//",buf))
        }
        Ln=Ln+1
    }
    SetWndSel( hwnd, selection )
}

macro MacroComment()
{
    hwnd=GetCurrentWnd()
    sel=GetWndSel(hwnd)
    lnFirst=GetWndSelLnFirst(hwnd)
    lnLast=GetWndSelLnLast(hwnd)
    hbuf=GetCurrentBuf()
  
    if (LnFirst == 0) {
            szIfStart = ""
    } else
    {
            szIfStart = GetBufLine(hbuf, LnFirst-1)
    }
    szIfEnd = GetBufLine(hbuf, lnLast+1)
    if (szIfStart == "#if 0" && szIfEnd == "#endif")
    {
            DelBufLine(hbuf, lnLast+1)
            DelBufLine(hbuf, lnFirst-1)
            sel.lnFirst = sel.lnFirst -1
            sel.lnLast = sel.lnLast -1
    }
    else
    {
            InsBufLine(hbuf, lnFirst, "#if 0")
            InsBufLine(hbuf, lnLast+2, "#endif")
            sel.lnFirst = sel.lnFirst + 1
            sel.lnLast = sel.lnLast + 1
    }
    SetWndSel( hwnd, sel )
}


/*   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)
    szLineTab = strmid(szLine, 0, ich) # "    "
    sel.lnFirst = sel.lnLast
    sel.ichFirst = wordinfo.ich
    sel.ichLim = wordinfo.ich

    // expand szWord keyword...


    if (wordinfo.szWord == "while")
    {
        SetBufSelText(hbuf, " (###)")
        InsBufLine(hbuf, ln + 1, "@szLine@" # "{");
        InsBufLine(hbuf, ln + 2, "@szLine@" # "");
        InsBufLine(hbuf, ln + 3, "@szLine@" # "}");
    }
    else if (wordinfo.szWord == "if" || wordinfo.szWord == "elseif" || wordinfo.szWord == "else if")
    {
        SetBufSelText(hbuf, " (###)")
        InsBufLine(hbuf, ln + 1, "@szLine@" # "{");
        InsBufLine(hbuf, ln + 2, "@szLine@" # "");
        InsBufLine(hbuf, ln + 3, "@szLine@" # "}");
        InsBufLine(hbuf, ln + 4, "@szLine@" # "else");
        InsBufLine(hbuf, ln + 5, "@szLine@" # "{");
        InsBufLine(hbuf, ln + 6, "@szLine@" # "");
        InsBufLine(hbuf, ln + 7, "@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, "@szLineTab@" # "")
        InsBufLine(hbuf, ln + 4, "@szLineTab@" # "break;")
        InsBufLine(hbuf, ln + 5, "@szLine@" # "default :")
        InsBufLine(hbuf, ln + 6, "@szLineTab@" # "")
        InsBufLine(hbuf, ln + 7, "@szLineTab@" # "break;")
        InsBufLine(hbuf, ln + 8, "@szLine@" # "}")
    }
    else if (wordinfo.szWord == "do")
    {
        InsBufLine(hbuf, ln + 1, "@szLine@" # "{")
        InsBufLine(hbuf, ln + 2, "@szLineTab@" # "");
        InsBufLine(hbuf, ln + 3, "@szLine@" # "} while (###);")
    }
    else if (wordinfo.szWord == "case")
    {
        SetBufSelText(hbuf, " ###:")
        InsBufLine(hbuf, ln + 1, "@szLineTab@" # "")
        InsBufLine(hbuf, ln + 2, "@szLineTab@" # "break;")
    }
    else if (wordinfo.szWord == "try")
    {
        SetBufSelText(hbuf, " ")
        InsBufLine(hbuf, ln + 1, "@szLine@" # "{");
        InsBufLine(hbuf, ln + 2, "@szLineTab@" # "");
        InsBufLine(hbuf, ln + 3, "@szLine@" # "}");
        InsBufLine(hbuf, ln + 4, "@szLine@" # "catch (Exception ###)");
        InsBufLine(hbuf, ln + 5, "@szLine@" # "{");
        InsBufLine(hbuf, ln + 6, "@szLineTab@" # "");
        InsBufLine(hbuf, ln + 7, "@szLine@" # "}");
        InsBufLine(hbuf, ln + 8, "@szLine@" # "finally");
        InsBufLine(hbuf, ln + 9, "@szLine@" # "{");
        InsBufLine(hbuf, ln +10, "@szLineTab@" # "");
        InsBufLine(hbuf, ln +11, "@szLine@" # "}");
    }
    else if (wordinfo.szWord == "catch")
    {
        SetBufSelText(hbuf, " (Exception ###)")
        InsBufLine(hbuf, ln + 5, "@szLine@" # "{");
        InsBufLine(hbuf, ln + 6, "@szLineTab@" # "");
        InsBufLine(hbuf, ln + 7, "@szLine@" # "}");
    }
    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
}




// Closes all but the most recently visited windows and files.
// Any dirty files are kept open.
macro CloseOldWindows()
{
    var hwnd
    var cWnd

    // This is the number of recent windows to keep open.  You may change
    // this constant to suit your needs.
    var NumberOfWindowsToKeep; NumberOfWindowsToKeep = 1

    hwnd = GetCurrentWnd()
    cWnd = 0

    // skip the most recently visited windows in the z-order
    while (hwnd != hNil && cWnd < NumberOfWindowsToKeep)
    {
        cWnd = cWnd + 1
        hwnd = GetNextWnd(hwnd)
    }

    // close the remaining windows
    while (hwnd != hNil)
    {
        var hwndNext

        hwndNext = GetNextWnd(hwnd)

        // only close the window if the file is not edited
        if (!IsBufDirty(GetWndBuf(hwnd)))
            CloseWnd(hwnd)

        hwnd = hwndNext
    }

    // close all files that are not visible in a window anymore
    var cBuf
    cBuf = BufListCount()
    while (cBuf > 0)
    {
        var hbuf
        cBuf = cBuf - 1
        hbuf = BufListItem(cBuf)
        if (GetWndHandle(hbuf) == hNil)
            CloseBuf(hbuf)
    }
}

// Convert spaces to tabs and save the file
macro Save_Spaces_To_Tabs()
{
    hbuf = GetCurrentBuf()
    if (hbuf != hNil)
    {
        Spaces_To_Tabs()
        SaveBuf(hbuf)
    }
}

// Convert tabs to spaces and save the file
macro Save_Tabs_To_Spaces()
{
    hbuf = GetCurrentBuf()
    if (hbuf != hNil)
    {
        Tabs_To_Spaces()
        SaveBuf(hbuf)
    }
}

 

//----------------------------------------------------------------------------
//  Function: Spaces_To_Tabs
//
// Description:
//   Convert all sets of two or more spaces in the current buffer into the
//      appropriate number of tab characters.
//
macro Spaces_To_Tabs()
{
 hbuf = GetCurrentBuf()
 hwnd = GetCurrentWnd()
 srSave = GetWndSel(hwnd)

    // Phase 1: convert the spaces at the beginning of lines
    //
 Leading_Spaces_To_Tabs()

    // Phase 2: convert the spaces NOT at the beginning of lines
    //
 sr = SearchInBuf(hbuf, "  +", 0, 0, 1, 1, 0)
 
 while (sr != "")
 {
     SetWndSel(hwnd, sr)
  ReTab_Current_Line()
     sr = GetWndSel(hwnd)
        sr = SearchInBuf(hbuf, "  +", sr.lnLast, sr.ichLim, 1, 1, 0)
 }
 SetBufIns(hbuf, srSave.lnFirst, srSave.ichFirst)
}

//----------------------------------------------------------------------------
//  Function: Tabs_To_Spaces
//
// Description:
//   Convert all tab characters in the current buffer into the appropriate
//      number of spaces.
//
macro Tabs_To_Spaces()
{
    hbuf = GetCurrentBuf()
    hwnd = GetCurrentWnd()
    srSave = GetWndSel(hwnd)

    // Phase 1: convert the tabs at the beginning of lines
    //
    Leading_Tabs_To_Spaces()

    // Phase 2: convert the tabs NOT at the beginning of lines
    //
    sr = SearchInBuf(hbuf, "//t", 0, 0, 1, 1, 0)

    while (sr != "")
    {
        SetWndSel(hwnd, sr)
        DeTab_Current_Line()
        sr = GetWndSel(hwnd)
        sr = SearchInBuf(hbuf, "//t", sr.lnLast, sr.ichLim, 1, 1, 0)
    }
    SetBufIns(hbuf, srSave.lnFirst, srSave.ichFirst)
}

 

//----------------------------------------------------------------------------
//  Function: Leading_Spaces_To_Tabs
//
// Description:
//   Convert all sets of two or more spaces in the current buffer into the
//      appropriate number of tab characters.
//
macro Leading_Spaces_To_Tabs()
{
 hbuf = GetCurrentBuf()
    iConsecutiveTabs = 0
    while (iConsecutiveTabs < 15)
    {
  ReplaceInBuf(hbuf, "^//(//t*//)    ", "//1//t", 0,
       GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
  iConsecutiveTabs = iConsecutiveTabs + 1
 }
}

 

//----------------------------------------------------------------------------
//  Function: Leading_Tabs_To_Spaces
//
// Description:
//   Convert all tab characters at line beginnings in the current buffer
//  into the appropriate number of spaces. Brute force method.
//
macro Leading_Tabs_To_Spaces()
{
     hbuf = GetCurrentBuf()
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t//t//t//t//t//t//t",
        "                                                            ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t//t//t//t//t//t",
        "                                                        ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t//t//t//t//t",
        "                                                    ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t//t//t//t",
        "                                                ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t//t//t",
        "                                            ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t//t",
        "                                        ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t//t",
        "                                    ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t//t",
        "                                ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t//t",
        "                            ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t//t",
        "                        ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t//t",
        "                    ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t//t",
        "                ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t//t",
        "            ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t//t",
        "        ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
    ReplaceInBuf(hbuf, "^//t",
        "    ",
     0, GetBufLineCount(hbuf) + 1, 1, 1, 0, 0)
}

 

//----------------------------------------------------------------------------
//  Function: DeTab_Current_Line
//
// Description:
//   Convert all tabs in the current line into the appropriate number of
//  spaces, based upon line position. Good for up to 25 consecutive tabs.
//
macro DeTab_Current_Line()
{
 szSpaces = "                                                                                                    "
 tabSize  = 4
 hbuf = GetCurrentBuf()
 iLine = GetBufLnCur(hbuf)
 cLines = GetBufLineCount(hbuf)
 szLine = GetBufLine(hbuf, iLine)
 cchLine = strlen(szLine)

 ichL = 0
 ichR = 0
 icoL = 0
 icoR = 0
 ichLine = 0
 icoLine = 0
 inTabs = '<'
 szNewLine = ""

 while (ichLine < cchLine)
 {
  if (szLine[ichLine] == "/t")
  {
   if (inTabs == 'N')
   {
    szNewLine = cat(szNewLine, strmid(szLine, ichL, ichR + 1))
    icoL = icoLine
   }
   icoLine = (((icoLine + tabSize) / tabSize) * tabSize)
   icoR = icoLine
   inTabs = 'Y'
  }
  else
  {
   if (inTabs == 'Y')
   {
    cSpaces = icoR - icoL
    szNewLine = cat(szNewLine, strtrunc(szSpaces, cSpaces))
    ichL = ichLine
    ichR = ichLine
   }
   else
   {
    ichR = ichLine
   }
   icoLine = icoLine + 1
   inTabs = 'N'
  }
  ichLine = ichLine + 1
 }
 if (inTabs == 'Y')
 {
  cSpaces = icoR - icoL
  szNewLine = cat(szNewLine, strtrunc(szSpaces, cSpaces))
 }
 else
 {
  szNewLine = cat(szNewLine, strmid(szLine, ichL, ichR + 1))
 }
 PutBufLine(hbuf, iLine, szNewLine)

 // Work around weirdness of PutBufLine(); it moves UP one line when
 // putting the last line in the buffer!
 //
 if (iLine + 1 == cLines)
 {
  Cursor_Down
 }
 End_Of_Line
}

//----------------------------------------------------------------------------
//  Function: ReTab_Current_Line
//
// Description:
//   Convert all sets of two or more spaces in the current line into the
//      appropriate number of tab and space characters, based upon line
//  position. Good for indentations up to 100 columns.
//
macro ReTab_Current_Line()
{
 szTabs   = "                         ";
 szSpaces = "    "  // As many spaces as value of tabSize
 tabSize  = 4
 hbuf = GetCurrentBuf()
 iLine = GetBufLnCur(hbuf)
 cLines = GetBufLineCount(hbuf)
 szLine = GetBufLine(hbuf, GetBufLnCur(hbuf))
 cchLine = strlen(szLine)

 ichL = 0
 ichR = 0
 icoL = 0
 icoR = 0
 ichLine = 0
 icoLine = 0
 inText = '<'
 quotes = 'N'
 szNewLine = ""

 while (ichLine < cchLine)
 {
  if (szLine[ichLine] == "/t")
  {
      if (quotes == 'N')
      {
       if (inText == 'Y')
       {
        szNewLine = cat(szNewLine, strmid(szLine, ichL, ichR + 1))
        icoL = icoLine
       }
       else if (inText == '?')
       {
        ichR = ichR - 1
        szNewLine = cat(szNewLine, strmid(szLine, ichL, ichR + 1))
       }
       inText = 'N'
      }
      icoLine = (((icoLine + tabSize) / tabSize) * tabSize)
      icoR = icoLine
  }
  else if (szLine[ichLine] == " ")
  {
      if (quotes == 'N')
      {
       if (inText == 'Y')
       {
        icoL = icoLine
        ichR = ichLine
        inText = '?'
       }
       else if (inText == '?')
       {
        ichR = ichR - 1
        szNewLine = cat(szNewLine, strmid(szLine, ichL, ichR + 1))
        inText = 'N'
       }
       else
       {
        inText = 'N'
       }
      }
      icoLine = icoLine + 1
      icoR = icoLine
  }
  else
  {
   if (inText == 'N')
   {
    cTabs = (icoR / tabSize) - (icoL / tabSize)
    if (cTabs > 0)
    {
     szNewLine = cat(szNewLine, strtrunc(szTabs, cTabs))
     cSpaces = icoR - ((icoR / tabSize) * tabSize)
    }
    else
    {
     cSpaces = icoR - icoL
    }
    if (cSpaces > 0)
    {
     szNewLine = cat(szNewLine, strtrunc(szSpaces, cSpaces))
    }
    ichL = ichLine
    ichR = ichLine
   }
   else
   {
    ichR = ichLine
   }
   if (szLine[ichLine] == "/")
   {
    if (quotes == 'N')
    {
        quotes = 'Y'
       }
       else if (szLine[ichLine - 1] != "//")
       {
        quotes = 'N'
       }
   }
   icoLine = icoLine + 1
   inText = 'Y'
  }
  ichLine = ichLine + 1
 }
 if ((inText == 'Y') || (inText == '?'))
 {
  szNewLine = cat(szNewLine, strmid(szLine, ichL, ichR + 1))
 }
 else if (inText == 'N')
 {
  cTabs = (icoR / tabSize) - (icoL / tabSize)
  if (cTabs > 0)
  {
   szNewLine = cat(szNewLine, strtrunc(szTabs, cTabs))
   cSpaces = icoR - ((icoR / tabSize) * tabSize)
  }
  else
  {
   cSpaces = icoR - icoL
  }
  if (cSpaces > 0)
  {
   szNewLine = cat(szNewLine, strtrunc(szSpaces, cSpaces))
  } 
 }
 PutBufLine(hbuf, iLine, szNewLine)

 // Work around weirdness of PutBufLine(); it moves UP one line when
 // putting the last line in the buffer!
 //
 if (iLine + 1 == cLines)
 {
  Cursor_Down
 }
 End_Of_Line
}



/*
* 代替SourceInsight原有的Backspace功能(希望如此)
* 增加了对双字节汉字的支持,在删除汉字的时候也能同时删除汉字的高字节而缓解半个汉字问题
* 能够对光标在汉字中间的情况进行自动修正
*
* 安装:
* ① 复制入SourceInsight安装目录;
* ② Project→Open Project,打开Base项目;
* ③ 将复制过去的SuperBackspace.em添加入Base项目?
* ④ 重启SourceInsight;
* ⑤ Options→Key Assignments,将Marco: SuperBackspace绑定到BackSpace键;
* ⑥ Enjoy!!
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
macro SuperBackspace()
{
    hwnd = GetCurrentWnd();
    hbuf = GetCurrentBuf();

    if (hbuf == 0)
        stop;   // empty buffer

    // get current cursor postion
    ipos = GetWndSelIchFirst(hwnd);

    // get current line number
    ln = GetBufLnCur(hbuf);

    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd)))
    {
        // sth. was selected, del selection
        SetBufSelText(hbuf, " "); // stupid & buggy sourceinsight :(
        // del the " "
        SuperBackspace(1);
        stop;
    }

    // copy current line
    text = GetBufLine(hbuf, ln);

    // get string length
    len = strlen(text);

    // if the cursor is at the start of line, combine with prev line
    if (ipos == 0 || len == 0)
    {
        if (ln <= 0)
            stop;   // top of file
        ln = ln - 1;    // do not use "ln--" for compatibility with older versions
        prevline = GetBufLine(hbuf, ln);
        prevlen = strlen(prevline);
        // combine two lines
        text = cat(prevline, text);
        // del two lines
        DelBufLine(hbuf, ln);
        DelBufLine(hbuf, ln);
        // insert the combined one
        InsBufLine(hbuf, ln, text);
        // set the cursor position
        SetBufIns(hbuf, ln, prevlen);
        stop;
    }

    num = 1; // del one char
    if (ipos >= 1) {
        // process Chinese character
        i = ipos;
        count = 0;
        while (AsciiFromChar(text[i - 1]) >= 160) {
            i = i - 1;
            count = count + 1;
            if (i == 0)
                break;
        }
        if (count > 0) {
            // I think it might be a two-byte character
            num = 2;
            // This idiot does not support mod and bitwise operators
            if ((count / 2 * 2 != count) && (ipos < len))
                ipos = ipos + 1;    // adjust cursor position
        }
    }

    // keeping safe
    if (ipos - num < 0)
        num = ipos;

    // del char(s)
    text = cat(strmid(text, 0, ipos - num), strmid(text, ipos, len));
    DelBufLine(hbuf, ln);
    InsBufLine(hbuf, ln, text);
    SetBufIns(hbuf, ln, ipos - num);
    stop;
}
/*2、删除——SuperDelete.em*/
macro SuperDelete()
{
    hwnd = GetCurrentWnd();
    hbuf = GetCurrentBuf();

    if (hbuf == 0)
        stop;   // empty buffer

    // get current cursor postion
    ipos = GetWndSelIchFirst(hwnd);

    // get current line number
    ln = GetBufLnCur(hbuf);

    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd)))
    {
        // sth. was selected, del selection
        SetBufSelText(hbuf, " "); // stupid & buggy sourceinsight :(
        // del the " "
        SuperDelete(1);
        stop;
    }

    // copy current line
    text = GetBufLine(hbuf, ln);

    // get string length
    len = strlen(text);
      
    if (ipos == len || len == 0)
    {
        totalLn = GetBufLineCount (hbuf);
        lastText = GetBufLine(hBuf, totalLn-1);
        lastLen = strlen(lastText);

        if (ipos == lastLen)// end of file
           stop;

        ln = ln + 1;    // do not use "ln--" for compatibility with older versions
        nextline = GetBufLine(hbuf, ln);
        nextlen = strlen(nextline);
        // combine two lines
        text = cat(text, nextline);
        // del two lines
        DelBufLine(hbuf, ln-1);
        DelBufLine(hbuf, ln-1);
        // insert the combined one
        InsBufLine(hbuf, ln-1, text);
        // set the cursor position
        SetBufIns(hbuf, ln-1, len);
        stop;
    }

    num = 1; // del one char
    if (ipos > 0)
    {
        // process Chinese character
        i = ipos;
        count = 0;
        while (AsciiFromChar(text[i-1]) >= 160)
        {
            i = i - 1;
            count = count + 1;
            if (i == 0)
                break;
        }
        if (count > 0)
        {
            // I think it might be a two-byte character
            num = 2;
            // This idiot does not support mod and bitwise operators
            if (((count / 2 * 2 != count) || count == 0) && (ipos < len-1))
                ipos = ipos + 1;    // adjust cursor position
        }

        // keeping safe
        if (ipos - num < 0)
            num = ipos;
    }
    else
    {
        i = ipos;
        count = 0;
        while(AsciiFromChar(text[i]) >= 160)
        {
            i = i + 1;
            count = count + 1;
            if(i == len-1)
                break;
        }

        if(count > 0)
        {
             num = 2;
        }
    }
   
    text = cat(strmid(text, 0, ipos), strmid(text, ipos+num, len));
    DelBufLine(hbuf, ln);
    InsBufLine(hbuf, ln, text);
    SetBufIns(hbuf, ln, ipos);
    stop;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426
  • 427
  • 428
  • 429
  • 430
  • 431
  • 432
  • 433
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439
  • 440
  • 441
  • 442
  • 443
  • 444
  • 445
  • 446
  • 447
  • 448
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • 460
  • 461
  • 462
  • 463
  • 464
  • 465
  • 466
  • 467
  • 468
  • 469
  • 470
  • 471
  • 472
  • 473
  • 474
  • 475
  • 476
  • 477
  • 478
  • 479
  • 480
  • 481
  • 482
  • 483
  • 484
  • 485
  • 486
  • 487
  • 488
  • 489
  • 490
  • 491
  • 492
  • 493
  • 494
  • 495
  • 496
  • 497
  • 498
  • 499
  • 500
  • 501
  • 502
  • 503
  • 504
  • 505
  • 506
  • 507
  • 508
  • 509
  • 510
  • 511
  • 512
  • 513
  • 514
  • 515
  • 516
  • 517
  • 518
  • 519
  • 520
  • 521
  • 522
  • 523
  • 524
  • 525
  • 526
  • 527
  • 528
  • 529
  • 530
  • 531
  • 532
  • 533
  • 534
  • 535
  • 536
  • 537
  • 538
  • 539
  • 540
  • 541
  • 542
  • 543
  • 544
  • 545
  • 546
  • 547
  • 548
  • 549
  • 550
  • 551
  • 552
  • 553
  • 554
  • 555
  • 556
  • 557
  • 558
  • 559
  • 560
  • 561
  • 562
  • 563
  • 564
  • 565
  • 566
  • 567
  • 568
  • 569
  • 570
  • 571
  • 572
  • 573
  • 574
  • 575
  • 576
  • 577
  • 578
  • 579
  • 580
  • 581
  • 582
  • 583
  • 584
  • 585
  • 586
  • 587
  • 588
  • 589
  • 590
  • 591
  • 592
  • 593
  • 594
  • 595
  • 596
  • 597
  • 598
  • 599
  • 600
  • 601
  • 602
  • 603
  • 604
  • 605
  • 606
  • 607
  • 608
  • 609
  • 610
  • 611
  • 612
  • 613
  • 614
  • 615
  • 616
  • 617
  • 618
  • 619
  • 620
  • 621
  • 622
  • 623
  • 624
  • 625
  • 626
  • 627
  • 628
  • 629
  • 630
  • 631
  • 632
  • 633
  • 634
  • 635
  • 636
  • 637
  • 638
  • 639
  • 640
  • 641
  • 642
  • 643
  • 644
  • 645
  • 646
  • 647
  • 648
  • 649
  • 650
  • 651
  • 652
  • 653
  • 654
  • 655
  • 656
  • 657
  • 658
  • 659
  • 660
  • 661
  • 662
  • 663
  • 664
  • 665
  • 666
  • 667
  • 668
  • 669
  • 670
  • 671
  • 672
  • 673
  • 674
  • 675
  • 676
  • 677
  • 678
  • 679
  • 680
  • 681
  • 682
  • 683
  • 684
  • 685
  • 686
  • 687
  • 688
  • 689
  • 690
  • 691
  • 692
  • 693
  • 694
  • 695
  • 696
  • 697
  • 698
  • 699
  • 700
  • 701
  • 702
  • 703
  • 704
  • 705
  • 706
  • 707
  • 708
  • 709
  • 710
  • 711
  • 712
  • 713
  • 714
  • 715
  • 716
  • 717
  • 718
  • 719
  • 720
  • 721
  • 722
  • 723
  • 724
  • 725
  • 726
  • 727
  • 728
  • 729
  • 730
  • 731
  • 732
  • 733
  • 734
  • 735
  • 736
  • 737
  • 738
  • 739
  • 740
  • 741
  • 742
  • 743
  • 744
  • 745
  • 746
  • 747
  • 748
  • 749
  • 750
  • 751
  • 752
  • 753
  • 754
  • 755
  • 756
  • 757
  • 758
  • 759
  • 760
  • 761
  • 762
  • 763
  • 764
  • 765
  • 766
  • 767
  • 768
  • 769
  • 770
  • 771
  • 772
  • 773
  • 774
  • 775
  • 776
  • 777
  • 778
  • 779
  • 780
  • 781
  • 782
  • 783
  • 784
  • 785
  • 786
  • 787
  • 788
  • 789
  • 790
  • 791
  • 792
  • 793
  • 794
  • 795
  • 796
  • 797
  • 798
  • 799
  • 800
  • 801
  • 802
  • 803
  • 804
  • 805
  • 806
  • 807
  • 808
  • 809
  • 810
  • 811
  • 812
  • 813
  • 814
  • 815
  • 816
  • 817
  • 818
  • 819
  • 820
  • 821
  • 822
  • 823
  • 824
  • 825
  • 826
  • 827
  • 828
  • 829
  • 830
  • 831
  • 832
  • 833
  • 834
  • 835
  • 836
  • 837
  • 838
  • 839
  • 840
  • 841
  • 842
  • 843
  • 844
  • 845
  • 846
  • 847
  • 848
  • 849
  • 850
  • 851
  • 852
  • 853
  • 854
  • 855
  • 856
  • 857
  • 858
  • 859
  • 860
  • 861
  • 862
  • 863
  • 864
  • 865
  • 866
  • 867
  • 868
  • 869
  • 870
  • 871
  • 872
  • 873
  • 874
  • 875
  • 876
  • 877
  • 878
  • 879
  • 880
  • 881
  • 882
  • 883
  • 884
  • 885
  • 886
  • 887
  • 888
  • 889
  • 890
  • 891
  • 892
  • 893
  • 894
  • 895
  • 896
  • 897
  • 898
  • 899
  • 900
  • 901
  • 902
  • 903
  • 904
  • 905
  • 906
  • 907
  • 908
  • 909
  • 910
  • 911
  • 912
  • 913
  • 914
  • 915
  • 916
  • 917
  • 918
  • 919
  • 920
  • 921
  • 922
  • 923
  • 924
  • 925
  • 926
  • 927
  • 928
  • 929
  • 930
  • 931
  • 932
  • 933
  • 934
  • 935
  • 936
  • 937
  • 938
  • 939
  • 940
  • 941
  • 942
  • 943
  • 944
  • 945
  • 946
  • 947
  • 948
  • 949
  • 950
  • 951
  • 952
  • 953
  • 954
  • 955
  • 956
  • 957
  • 958
  • 959
  • 960
  • 961
  • 962
  • 963
  • 964
  • 965
  • 966
  • 967
  • 968
  • 969
  • 970
  • 971
  • 972
  • 973
  • 974
  • 975
  • 976
  • 977
  • 978
  • 979
  • 980
  • 981
  • 982
  • 983
  • 984
  • 985
  • 986
  • 987
  • 988
  • 989
  • 990
  • 991
  • 992
  • 993
  • 994
  • 995
  • 996
  • 997
  • 998
  • 999
  • 1000
  • 1001
  • 1002
  • 1003
  • 1004
  • 1005
  • 1006
  • 1007
  • 1008
  • 1009
  • 1010
  • 1011
  • 1012
  • 1013
  • 1014
  • 1015
  • 1016
  • 1017
  • 1018
  • 1019
  • 1020
  • 1021
  • 1022
  • 1023
  • 1024
  • 1025
  • 1026
  • 1027
  • 1028
  • 1029
  • 1030
  • 1031
  • 1032
  • 1033
  • 1034
  • 1035
  • 1036
  • 1037
  • 1038
  • 1039
  • 1040
  • 1041
  • 1042
  • 1043
  • 1044
  • 1045
  • 1046
  • 1047
  • 1048
  • 1049
  • 1050
  • 1051
  • 1052
  • 1053
  • 1054
  • 1055
  • 1056
  • 1057
  • 1058
  • 1059
  • 1060
  • 1061
  • 1062
  • 1063
  • 1064
  • 1065
  • 1066
  • 1067
  • 1068
  • 1069
  • 1070
  • 1071
  • 1072
  • 1073
  • 1074
  • 1075
  • 1076
  • 1077
  • 1078
  • 1079
  • 1080
  • 1081
  • 1082
  • 1083
  • 1084
  • 1085
  • 1086
  • 1087
  • 1088
  • 1089
  • 1090
  • 1091
  • 1092
  • 1093
  • 1094
  • 1095
  • 1096
  • 1097
  • 1098
  • 1099
  • 1100
  • 1101
  • 1102
  • 1103
  • 1104
  • 1105
  • 1106
  • 1107
  • 1108
  • 1109
  • 1110
  • 1111
  • 1112
  • 1113
  • 1114
  • 1115
  • 1116
  • 1117
  • 1118
  • 1119
  • 1120
  • 1121
  • 1122
  • 1123
  • 1124
  • 1125
  • 1126
  • 1127
  • 1128
  • 1129
  • 1130
  • 1131
  • 1132
  • 1133
  • 1134
  • 1135
  • 1136
  • 1137
  • 1138
  • 1139
  • 1140
  • 1141
  • 1142
  • 1143
  • 1144
  • 1145
  • 1146
  • 1147
  • 1148
  • 1149
  • 1150
  • 1151
  • 1152
  • 1153
  • 1154
  • 1155
  • 1156
  • 1157
  • 1158
  • 1159
  • 1160
  • 1161
  • 1162
  • 1163
  • 1164
  • 1165
  • 1166
  • 1167
  • 1168
  • 1169
  • 1170
  • 1171
  • 1172
  • 1173
  • 1174
  • 1175
  • 1176
  • 1177
  • 1178
  • 1179
  • 1180
  • 1181
  • 1182
  • 1183
  • 1184

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多