LauncherEX で BackSpace で補完するときカーソルより後ろの『;』以降が消えないようにする

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

LauncherEX で OPTION_EX_ABBREV_ON_BS を有効にしているとき、BackSpace でも補完が実行されますが、カーソル位置より後ろに『;』があっても、それ以降が消されてしまいます。
これを、CraftLaunch の『&SubCommand;&Backspace,&PopList』に似た挙動にします。
ついでに、コマンド入力エリアが空で、補完候補リストが表示されていないときに、OPTION_EX_SWAP_CTRL_SPACE によるキーバインドの入れ替えが効いていなかったのも修正しました。
クラス LauncherModeEX のメソッド OnKeyDown を置き換えます。

コード

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

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


from clapi import *
from clconst import *


def _LauncherModeEXOnKeyDown(self, event):
    from clmode_lex import OPTION_EX_SWAP_CTRL_SPACE, OPTION_EX_ABBREV_ON_BS

    # フックの実行
    err = clmode_lex.RunHook(clmode_lex.lex_hook_on_key, event)
    if err: raise err
    if event.skip: return

    # Swap Ctrl+Space to Space
    if (GetOption(OPTION_EX_SWAP_CTRL_SPACE)
        and (event.vk == VK_SPACE)):
        if event.mod == 0:
            s = GetValue()
            pos = GetSelection()
            SetValue(s[:pos[0]] + ' ' + s[pos[1]:])
            SetSelection(*((pos[0]+1, ) * 2))
            event.Skip()
            return
        if event.mod == MODKEY_CTRL:
            import clcore
            import clwindow

            if clcore.List_IsShown():
                clwindow.list.SelNext(True)
            else:
                clwindow.edit.Abbrev(GetValue())
            event.Skip()
            return

    # 独自の実装のため、LauncherMode は呼ばない
    import clmode
    clmode.BaseMode.OnKeyDown(self, event)

    if (GetOption(OPTION_EX_ABBREV_ON_BS)
        and (event.vk == VK_BACK)
        and (event.mod == 0)):

        # カーソル位置と無関係に (min, max) の模様 @0.991
        (start, end) = GetSelection()
        if not start == end == 0:
            s = GetValue()
            if start == end:
                start -= 1
                s = s[:start] + s[end:]
                end -= 1
            else:
                s = s[:start] + s[end:]
                end = start
            SetValue(s)
            SetSelection(start, end)

        import clwindow
        clwindow.edit.Abbrev(None)
        #clwindow.edit.last_action = 1
        event.Skip()
clmode_lex.clLauncherEX.LauncherModeEX.OnKeyDown = _LauncherModeEXOnKeyDown