■
シロさんがフォルダの監視でお悩みのようなので,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つだけ問題が.
それは,削除とリネームもとのファイルが,ショートファイルネームでしか取得できない(少なくとも俺の力量では)ということ.つまり,長いファイルはいったいどのファイルが削除されたのかがわからない.ショートネームから,ロングネームに変換しようとしても元のファイルがないから出来ない.方法としては,削除されたディレクトリの親ディレクトリはわかるので,そのディレクトリから削除されたディレクトリを調べるというのがある.これでがんばれば何とかなるんだけど,めんどいので途中でほったらかしたまま.
■
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