シロさんがフォルダの監視でお悩みのようなので,CraftLaunchExのoutputにディレクトリの変更を表示する方法を具体的に.ちょっと長いけどこんな感じ.これをconfig.pyに貼り付ければいけるはず.

import Queue
import threading
import win32file
import win32api
import win32con
import os

def watch(path):
    hDir = win32file.CreateFile (
        path,  0x0001, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE, 
        None, win32con.OPEN_EXISTING, win32con.FILE_FLAG_BACKUP_SEMANTICS, None)
    while 1:
        result = win32file.ReadDirectoryChangesW(hDir, 1024, True, 
          win32con.FILE_NOTIFY_CHANGE_DIR_NAME, None, None )
        yield (path, result)

class Watcher (threading.Thread):

    def __init__ (self, path, result, **keyword):
        threading.Thread.__init__ (self, **keyword)
        self.setDaemon (1)
        self.path = path
        self.result = result
        self.start ()

    def run (self):
        for results in watch(self.path):
            self.result.put(results)
    

def watch_dir():
    try:
        path_base, results = files_changed.get_nowait ()
        n = len(results)
        if n == 1:
            action, path = results[0]
            path = os.path.join(path_base, path)
            if action == 1:
                print "add:", path
            elif action == 2:
                print "remove:", path
        elif n == 2:
            action1, path1 = results[0]
            action2, path2 = results[1]
            path1 = os.path.join(path_base, path1)
            path2 = os.path.join(path_base, path2)
            if action1 == 4 and action2 == 5:
                print 'rename:from %s to %s' %(path1, path2)
    except Queue.Empty:
        pass

files_changed = Queue.Queue ()  
watch_path = ['c:/', 'd:/', 'g:/']
for path in watch_path:
    Watcher (path, files_changed)
AddTimerHandler(1000, watch_dir)

これをちょこっと応用すれば,clmode_goで使えるんだけど,1つだけ問題が.
それは,削除とリネームもとのファイルが,ショートファイルネームでしか取得できない(少なくとも俺の力量では)ということ.つまり,長いファイルはいったいどのファイルが削除されたのかがわからない.ショートネームから,ロングネームに変換しようとしても元のファイルがないから出来ない.方法としては,削除されたディレクトリの親ディレクトリはわかるので,そのディレクトリから削除されたディレクトリを調べるというのがある.これでがんばれば何とかなるんだけど,めんどいので途中でほったらかしたまま.

MenuModeを更新しました.
MenuMode
ショートメニューにkeywordを搭載した.keywordにマッチしたコマンドをメニューアイテムに追加する.
keywordのマッチにアンド「&」とオア「|」を使えるようにした.
メニューの再読み込み関数clmenu.ReloadMenu()を追加。
メニュー設定ファイルの中でマクロのMenu_fileは'Menu_file'ではなくMenu_fileで指定するように変更.これはメニューファイルの書き換えが必要です。使用している場合はお手数ですが変更お願いします。

Pythonを使ってディレクトリを監視する.

import win32file
import win32con
FILE_LIST_DIRECTORY = 0x0001
path = "d:/temp"  # 監視するパス
hDir = win32file.CreateFile (
        path,                     #監視するパス
        FILE_LIST_DIRECTORY,
        win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
        None,
        win32con.OPEN_EXISTING, 
        win32con.FILE_FLAG_BACKUP_SEMANTICS,
        None)
result = win32file.ReadDirectoryChangesW(
        hDir,                  #監視するディレクトリの識別ファイルハンドル。
        1024,                  
        True,                  #サブディレクトリも監視するか監視するならTrue
        win32con.FILE_NOTIFY_CHANGE_DIR_NAME, #フィルター
        None,
        None)
print result

返ってくる結果は,変更などがされたディレクトリのパスとアクションのタプルのリスト.アクションは, 1 作成, 2 削除, 3 更新, 4 このパスがリネーム, 5 このパスにリネームになっている.フィルターの部分を変えるとファイルも監視できる.
うちではこれを使ってpiroriさんのclmode_goを改造してディレクトリを監視して変更を登録保存している.

下のプログラムはMSNメッセンジャーのインスタントメッセージを呼び出すものなんだが,
コマンドラインやidleから実行したらうまく動くのに,CraftLaunchExから呼び出すと,エラーになる...なんでだ.

import win32com.client
msngr = win32com.client.Dispatch( 'Messenger.UIAutomation.1' )
msngr.InstantMessage(msngr.MyContacts[0].SignInName)

MenuModeを更新。メニューの仕様をちょっと変更して機能追加とバグを修正。
MenuMode
だんだんいい感じになってきた。piroriさんのclmode_goからフォルダメニューを呼び出して使うとかなり高速でファイルにアクセスできる。ちなみにフォルダメニューはフォルダだったらそのフォルダにあるファイルとフォルダをメニューとして出すというもの。フォルダをクリックしたら再びフォルダメニューでファイルをクリックしたらファイルメニューが表示される。メニューモードのおまけとして上のファイルに入れておいた。

historyについて

履歴から補完できるのはとてもありがたいのだがいまいち使い勝手がよくないと思う。
コマンドは履歴から補完出来てもありがたみがない。ありがたみがあるとすれば、ファイルなんだがこれもいまいちだ。というのは、大体はファイルは履歴にcommand;fileという形で保存されていて、前方一致では直接ファイルを補完できない。たとえファイルだけで履歴に保存されていたとしてもディレクトリから選択しないといけないからちょっと不便。やっぱファイル名で補完できなきゃ駄目だと思う。Deecayさんとこのclbubunを使えばいいんだけどそれだとディレクトリにもヒットするのでマッチしすぎるのが欠点。そこで、ヒストリーの補完をこんな感じにすると便利。

def ListupAbbrevCandidate(str):
    from clcmd import command_list
    from clhistory import history
    import os.path
    return [his for his in history.history_list
               if os.path.basename(his).lower().find(str.lower()) >= 0 ]

Excuteコマンドでclmode.Top().OnExecute(event)が呼び出されるのはいただけないのはシロさんに同意します。せめてTopじゃなく最初にPushされているLauncherModeにして欲しい。TopのせいでOnExecuteの中からExecuteを呼んだら無限ループに陥りそうになっじゃないか。

追記

部分一致にするには,config.pyに
clcmd.ListupAbbrevCandidate= clcmd_ex.ListupAbbrevCandidateの代わりに以下を追加してください.

def ListupAbbrevCandidate(str):
    import clcmd
    result = []
    for cmd in clcmd.command_list:
        if len(str)==0 or cmd.kana.upper().find(str.upper()) >=0:
            result.append( cmd.name )
    return result
clcmd.ListupAbbrevCandidate= ListupAbbrevCandidate