http://qiita.com/items/940cab68f7e112af249f の続きです。
やりたいこと
Google ChromeやPyCharmなんかで検索を行うと、どの辺にヒットしたキーワードがあるのか、マーカーで教えてくれます。
この機能が、TortoiseHgにも欲しいなあと。
<ステマ>ちなみにTortoiseBzrにはもうありますよ。</ステマ>
やったこと
とりあえず、先日のネタで手を入れたBlockListクラスが、ほぼそのまま使えそうです。
Chromeとかに倣って、ファイルビューの右側に配置するようにしましょう。
ということで、こんな感じになりました。
ソースはこちらです。 https://bitbucket.org/iwata0303/thg/commits/d8452bd98690ab2f939164358976ff68
TortoiseHgのコードでは丁寧にSIGNAL/SLOTが定義されているので、この手の拡張はし易いですね :)
エクステンション化
さて、先日のやつと同じように、この機能をプラグインで実現してみます。自分でTortoiseHgビルドするの面倒ですしね。
前回は、BlockListクラスに実行時にメソッドを追加するという方法で実現したんですが、今回は修正箇所がいくつかに分かれていますし、既存のメソッドにも修正が入っているので、それはちょっと面倒です。
この際、クラスごと差し替える方が早そうです。バージョンアップのときの対応もその方が楽ですし。
手順は、こんな感じです。
- 適当な場所に、
thg-ext
というフォルダ(名前は何でもいいですが)を作る。 - そのフォルダに、今回変更したファイル(
blockmatcher.py
、qscilib.py
、fileview.py
)を放り込む。 -
__init__.py
というファイルを、以下の内容で同じフォルダに作成する。
# -*- coding: utf-8 -*-
import sys
import os
def extsetup():
# TortoiseHgから起動された時だけ動くようにする
if not os.path.basename(sys.argv[0]).startswith('thg'):
return
# qscilib.Scintillaを置き換える
from tortoisehg.hgqt import qscilib
from .qscilib import Scintilla
qscilib.Scintilla = Scintilla
# blockmatcher.BlockListを置き換える
from tortoisehg.hgqt import blockmatcher
from .blockmatcher import BlockList
blockmatcher.BlockList = BlockList
# fileview.HgFileViewを置き換える
from tortoisehg.hgqt import fileview
from .fileview import HgFileView
fileview.HgFileView = HgFileView
ちなみに、Scintilla
→ HgFileView
という置き換えの順番は重要です。HgFileViewはScintillaを継承しているので、先にHgFileViewの方をロードしてしまうと置き換え前のScintillaを使ってしまうんですね。
4.mercurial.ini
や hgrc
内で、thg-ext
フォルダのパスをエクステンションとして登録する。
[extensions]
thgext = C:\Work\thg-ext
で、めでたく検索マーカー機能が動きました :)
動的言語はフリーダムでいいですねえ。プラグイン機構を用意する側からすると悩みの種ですがw