マクロファイルを指定のフォルダから探し出してポップアップメニューを出し、選択されたマクロを実行します。 サブディレクトリの検索も行います。
ソースコード内の 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 )
文責: とらめ
