2012年8月11日土曜日

サクラエディタ用Grep結果取得マクロ


サクラエディタのGrep結果を取得するために作成しました。
実行するにはVBScript用文字列関連の関数(1)が必要です。
'Grep結果を全て取得します。
Function getGrepResults()
    Dim strFolderPath: strFolderPath = getFolderPath()
    Dim lngRu: lngRu = Editor.GetLineCount(0)
    Dim lngR
    Dim lngI: lngI = -1
    Dim objGrepResults: Redim objGrepResults(lngRu)
    Dim strLine
    For lngR = lngRu To 1 Step -1
        strLine = getLine(lngR)
        If startsWith(strLine, strFolderPath) Then
            lngI = lngI + 1
            Set objGrepResults(lngI) = getGrepResult(strLine)
        End If
    Next
    ReDim Preserve objGrepResults(lngI)
    getGrepResults = objGrepResults
    Erase objGrepResults
End Function

'Grep結果を1行分取得します。
Function getGrepResult(ByRef strLine)
    Dim objGrepResult: Set objGrepResult = New GrepResult
    With objGrepResult
        .strText = getText(strLine)
        .strFilePath = getFilePath(strLine)
        .lngRow = getRow(strLine)
        .lngCol = getCol(strLine)
    End With
    Set getGrepResult = objGrepResult
    Set objGrepResult = Nothing
End Function

'Grep対象のフォルダを取得します。
Function getFolderPath()
    Const PREFIX_FOLDERPATH = "フォルダ   "
    getFolderPath = ""
    Dim lngRu: lngRu = Editor.GetLineCount(0)
    Dim lngR
    Dim strLine
    For lngR = 1 To lngRu
        strLine = getLine(lngR)
        If startsWith(strLine, PREFIX_FOLDERPATH) Then
            getFolderPath = Mid(strLine, Len(PREFIX_FOLDERPATH) + 1)
            Exit Function
        End If
    Next
End Function

'Grep結果からファイルのパスを取得します。
Function getFilePath(ByRef strLine)
    getFilePath = ""
    Dim lngPlPos: lngPlPos = getPlPos(strLine)
    getFilePath = Left(strLine, lngPlPos - 1)
End Function

'Grep結果から行を取得します。
Function getRow(ByRef strLine)
    getRow = 0
    Dim lngPlPos: lngPlPos = getPlPos(strLine)
    Dim lngCmmPos: lngCmmPos = getCmmPos(strLine)
    Dim strRow: strRow = Mid(strLine, lngPlPos + 1, lngCmmPos - lngPlPos - 1)
    getRow = CLng(Trim(strRow))
End Function

'Grep結果から桁を取得します。
Function getCol(ByRef strLine)
    getCol = 0
    Dim lngCmmPos: lngCmmPos = getCmmPos(strLine)
    Dim lngPrPos: lngPrPos = getPrPos(strLine)
    Dim strCol: strCol = Mid(strLine, lngCmmPos + 1, lngPrPos - lngCmmPos - 1)
    getCol = CLng(Trim(strCol))
End Function

'Grep結果からテキストを取得します。
Function getText(ByRef strLine)
    getText = ""
    Dim lngCrnPos: lngCrnPos = getCrnPos(strLine)
    getText = Mid(strLine, lngCrnPos + 2)
End Function

'Grep結果から行,桁の前括弧の位置を取得します。
Function getPlPos(ByRef strLine)
    getPlPos = -1
    Dim lngCrnPos: lngCrnPos = getCrnPos(strLine)
    Dim lngP
    Dim lngPlPos
    For lngP = lngCrnPos To 1 Step -1
        If Mid(strLine, lngP, 1) = "(" Then
            lngPlPos = lngP
            Exit For
        End If
    Next
    getPlPos = lngPlPos
End Function

'Grep結果から行,桁を区切るカンマの位置を取得します。
Function getCmmPos(ByRef strLine)
    getCmmPos = -1
    Dim lngPlPos: lngPlPos = getPlPos(strLine)
    getCmmPos = InStr(lngPlPos, strLine, ",")
End Function

'Grep結果から行,桁の後ろ括弧の位置を取得します。
Function getPrPos(ByRef strLine)
    getPrPos = -1
    Dim lngCmmPos: lngCmmPos = getCmmPos(strLine)
    getPrPos = InStr(lngCmmPos, strLine, ")")
End Function

'Grep結果からパス,行,桁情報の終了の位置を取得します。
Function getCrnPos(ByRef strLine)
    getCrnPos = InStr(1, strLine, "]:") + 1
End Function

'改行を含まない1行分の文字列を取得します。
Function getLine(ByRef lngR)
    getLine = getString(Editor.GetLineStr(lngR))
End Function

'これ以降はクラス

'Grep結果1つ分の情報を保持するクラスです。
Class GrepResult
    Public strText
    Public strFilePath
    Public lngRow
    Public lngCol
End Class

0 件のコメント:

コメントを投稿