マクロファイルを指定のフォルダから探し出してポップアップメニューを出し、選択されたマクロを実行します。 サブディレクトリの検索も行います。
ソースコード内の MACRO_ROOT (マクロファイルが入ってるフォルダ。末尾に "\" を つけない で下さい) と FILEMASK (マクロファイルを探し出すときの正規表現パターン) を環境に応じて書き換えてから使ってください。
選択されたマクロがEmEditorのマクロに登録されていなかったら、レジストリを直接いじってマクロを登録、マクロ実行後、登録を削除という処理をしています。
動作の安全性の保障はしかねるので、信用ならないという方は使用しない方が吉です。
"Macro Customize..." メニューが動作しないかもしれませんが、EmEditor側のバグのような気がします(Version 6.00現在)。違ったらごめんなさい。
#language = "Python" # Popup Macro Files # for EmEditor Professional 6.00 or higher import os import _winreg import re import string from stat import * MACRO_ROOT = r"C:\Program Files\EmEditor\Macro" FILEMASK = re.compile(r"\.(js|vb|py|rb|pl|php)(ee)?$", re.IGNORECASE) g_path = ["padding"] # from plugin.h EEID_MACRO1 = 9216 EEID_CUSTOMIZE_MACRO = 4350 eeMenuSeparator = 2048 def mycmp(a, b): return cmp(a.lower(), b.lower()) # recursive def maketree(menu, dirname): dirs = [] files = [] filecnt = 0 list = os.listdir(dirname) list.sort(mycmp) for f in list: mode = os.stat('%s/%s' % (dirname, f))[ST_MODE] if S_ISDIR(mode): dirs.append(f) elif S_ISREG(mode): files.append(f) for dir in dirs: submenu = Window.CreatePopupMenu() n = maketree(submenu, '%s/%s' % (dirname, dir)) if n > 0: menu.AddPopup("%s/\t(%d)" % (dir, n), submenu) filecnt += n if len(dirs) > 0: menu.Add("", 0, eeMenuSeparator) for fname in files: if FILEMASK.search(fname): path = '%s/%s' % (dirname, fname) menu.Add(fname+"\t"+info(path), len(g_path)) g_path.append( path ) filecnt += 1 return filecnt # get info about macro file def info(path): f = file(path) s = "" while True: s = f.readline() if s == "": # EOF break s = s.rstrip() if not re.match(r"^#l|^#!|^/\*\*\*|^\s*$", s): break f.close return s # return > 0 if macro is registered def RegisterPos(macro_name): key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\EmSoft\EmEditor v3\Macros") n = _winreg.QueryInfoKey(key)[1] bFound = False for i in range(n): name, val, t = _winreg.EnumValue(key, i) if string.replace(val, "\\", "/").upper() == macro.upper(): bFound = True break if bFound: return i + 1 else: return 0 # write into registry. return macro_id def Register(macro_name): key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\EmSoft\EmEditor v3\Macros", 0, _winreg.KEY_ALL_ACCESS) n = _winreg.QueryInfoKey(key)[1] _winreg.SetValueEx(key, "Macro%d" % n, 0, _winreg.REG_SZ, string.replace(macro_name, "/", "\\")) return n + 1 def RemoveRegister(n): key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\EmSoft\EmEditor v3\Macros", 0, _winreg.KEY_ALL_ACCESS) _winreg.DeleteValue(key, "Macro%d" % (n - 1)) # execute n-th macro def ExecMacro(n): Window.editor.ExecuteCommandByID(EEID_MACRO1 + n - 1) menu = Window.CreatePopupMenu() maketree(menu, MACRO_ROOT) menu.Add("", 0, eeMenuSeparator) menu.Add("Macro Custumize...", -1) id = menu.Track( 0 ) if id > 0: macro = string.replace(g_path[id], "\\", "/") bRegister = False n = RegisterPos(macro) if n == 0: bRegister = True n = Register(macro) ExecMacro(n) if bRegister: RemoveRegister(n) elif id == -1: Window.editor.ExecuteCommandByID( EEID_CUSTOMIZE_MACRO )
文責: とらめ