ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

WinMergeのプラグインを作成してみた

ソースコード等の差分を見るときに使用するWinMergeというソフトがあります。
VB6のソースコードを手直しする必要があったので、とりあえず最新かどうかの確認に差分を見てみるとコメントの差分がたくさん出て困りました。

それなので、次のWinMergeプラグインを作ってみた。

  • コメント行を削除
  • 連続する空白行を削除

作成したプラグインは、MergePluginsフォルダに入れます。
メニューの[プラグイン]-[自動展開]を選択しておくとファイルを開くだけで、プラグインが適用され同一かの判断をしてくれます。

ファイル名:IgnoreCommentsVB.sct

<scriptlet>

<implements type="Automation" id="dispatcher">
    <property name="PluginEvent">
        <get/>
    </property>
    <property name="PluginDescription">
        <get/>
    </property>
    <property name="PluginFileFilters">
        <get/>
    </property>
    <property name="PluginIsAutomatic">
        <get/>
    </property>
    <method name="UnpackFile"/>
    <method name="PackFile"/>
</implements>

<script language="VBS">

Option Explicit

Function get_PluginEvent()
    get_PluginEvent = "FILE_PACK_UNPACK"
End Function

Function get_PluginDescription()
    get_PluginDescription = "Visual Basic 6.0 のコメントと連続する空白行を削除する"
End Function

Function get_PluginFileFilters()
    get_PluginFileFilters = "\.frm$;\.bas$;\.cls$"
End Function

Function get_PluginIsAutomatic()
    get_PluginIsAutomatic = True
End Function

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
    Dim fso
    Dim foSrc
    Dim foDst
    Dim pos
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
   '読み取り専用モード
    Set foSrc = fso.OpenTextFile(fileSrc, 1, True)
   '上書きモード
    Set foDst = fso.OpenTextFile(fileDst, 2, True)
    
   '1行づつ読み込んでコメントを削除する
   '空白行が続く場合は行削除をする
    Dim srcLine
    Dim dstLine
    Dim cntSpace
    cntSpace = 0
    Do Until foSrc.AtEndOfStream
        srcLine = foSrc.ReadLine
        
       'コメントを検索し以降を削除
       '文字列の"'"を考慮していないので注意
        pos = InStr(1, srcLine, "'")
        If pos > 0 Then
            dstLine = Left(srcLine, pos - 1)
        Else
            dstLine = srcLine
        End If
        
       '末尾のスペースを削除
        dstLine = RTrim(dstLine)
        
       '空白行が2行以上続く場合は出力しない
        If dstLine = "" Then
            cntSpace = cntSpace + 1
        Else
            cntSpace = 0
        End If
        
        If cntSpace <= 1 Then
            foDst.WriteLine(dstLine)
        End If
    Loop
    
    foSrc.Close
    foDst.Close
    
    Set foSrc = Nothing
    Set foDst = Nothing
    Set fso = Nothing
    
    pbChanged = True
    pSubcode = 0
    UnpackFile = True
End Function

Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
    PackFile = False
End Function

</script>
</scriptlet>

プラグインが適用されても元ファイルが変更されることはありません。
コメントが削除されたらどうしよう?と思ったので。

改造するときの手さぐりメモ

  • VBScriptで作成をする。
  • UnpackFileメソッドを変更する。
  • fileSrcにファイルパスが代入されているので、fileDstに編集したソースを書き出す。
    比較元、比較先のファイルのことではないので注意。