LauncherEX で共通部分自動確定

以下の環境で動作確認しました。

LauncherEX で補完候補リスト作成時に、候補の共通部分を自動的に確定します。

コード

config.py などに記述します。

## LauncherEX
import clmode_lex # `from clconst import *' より前に記述する


from clapi import *
from clconst import *


# 共通部分自動確定
def _DecideCommonParts(event):
    import clmode
    import clcore

    if (clmode.Top().abbrev and event.sel[0] and event.candlist
        and clcore.List_IsShown() and (GetListSelection() != -1)):
        lst = [x.lower() for x in event.candlist if x.find(';') == -1]
        if not lst:
            return
        n = min([len(x) for x in lst])
        if not n or (n <= event.sel[0]):
            return
        start = 0
        for i in xrange(event.sel[0], n):
            for x in lst[1:]:
                if lst[0][i] != x[i]:
                    start = i
                    break
            if start:
                break
        else:
            start = i + 1
        s = event.candlist[0][:start]
        n = event.str.find(';')
        SetValue(s + event.str[n:] if n >= event.sel[0] else s)
        SetSelection(start, len(s))

# 補完リスト作成時
clmode_lex.AddHook(clmode_lex.lex_hook_on_listup_abbrev, _DecideCommonParts)

この関数を作ってるときに気付いたんですが、フック関数を実行する関数 RunHook() は、ShowInfoException 以外の例外を捕捉すると StandardError を返却するので、どんな例外が送出されたのか分かりません。
そこで、捕捉した例外オブジェクトを返却するよう変更してみました。

from clapi import *
from clconst import *

import clmode_lex

def _RunHook(HookTable, event):
    u"""フックを実行する"""
    rv = None
    for func in HookTable.itervalues():
        try:
            func(event)
        except ShowInfoException, e:
            rv = e
        except Exception, e:
            return e
    return rv
clmode_lex.clLauncherEX.RunHook = _RunHook