EmEditorみんなでまとめサイト

マクロ一覧のポップアップメニュー

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

マクロファイルを指定のフォルダから探し出してポップアップメニューを出し、選択されたマクロを実行します。 サブディレクトリの検索も行います。

ソースコード内の 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 )

文責: とらめ

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー