テーマの自動変更

提供: MeryWiki
ナビゲーションに移動 検索に移動

概要[編集]

Windowsのテーマ設定に合わせて、Meryのエディタ部のテーマを自動変更します。

Meryのオプションで、「アプリのテーマ」を「システム設定を使用する」とすると、Windowsに合わせてMeryのテーマが変更されるようになりますが、エディタ部のテーマはこれとは別に設定変更する必要があります。

Microsoft PowerToysの Light Switch や、Auto Dark Modeなどを使用すると、Windowsのテーマを時間で自動変更するなどができますが、Mery本体はこれに追随するのに、エディタ部のテーマだけ置き去りになって、なんか悲しかったので作りました。

  • Meryのオプション->「基本」->「アプリのテーマ」で、「システム設定を使用する」としている場合のみ動作するようにしてあります。
  • ライトモード/ダークモード用のテーマを用意しておき、マクロ先頭でテーマ名を指定します
(Mery標準のテーマは使えません、「名前を付けて保存」したテーマを使用します)
  • マクロのカスタマイズ画面のリストに登録したら、イベントを有効にします
イベントはお好みで...(「フォーカスを受け取った時」「フォーカスを失った時」くらいが妥当だと思います)

テーマを書き換えるアイディアは、ucky様の「テーマのトグル」マクロからいただきました。 すてきなアイディアありがとうございます。

変更履歴[編集]

  • 2025-12-10
    • 新規作成

ソースコード[編集]

#title = "テーマの自動変更"

// ライトモード/ダークモード用のテーマを用意しておき、ここでテーマ名を指定します
// (Mery標準のテーマは使えません、「名前を付けて保存」したテーマを使用します)
var lightModeTheme = "#Custom-Light";
var darkModeTheme = "#Custom-Dark";

// マクロのカスタマイズ画面のリストに登録したら、イベントを有効にします
//    イベントはお好みで...(「フォーカスを受け取った時」「フォーカスを失った時」くらいが妥当だと思います)
// Meryのオプション->「基本」->「アプリのテーマ」で、
//    「システム設定を使用する」としている場合のみ動作するようにしてあります

if ("ReadSettings" in editor) {
	if(editor.ReadSettingInteger("General", "DarkMode", -1) == 2){
		// Meryの現在のテーマ
		var currentTheme = editor.ReadSettingString("Themes", "ThemeName", "");
		// Windowsのテーマ状態
		var regKey = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\AppsUseLightTheme";
		var isLight = (new ActiveXObject("WScript.Shell")).RegRead(regKey);
		var newTheme;
		if(isLight == 0){
			newTheme = darkModeTheme;
		}else{
			newTheme = lightModeTheme;
		}
		if(currentTheme != newTheme){
			// 表示設定項目一覧取得
			var iniKeys = enumKeysInSection("Theme\\" + newTheme);
			if(iniKeys.length > 0){
				editor.WriteSettings();

				// テーマを「名前を付けて保存」したときに設定ファイルに追加される
				// [Theme\テーマ名] セクションを読んで [Display] セクションの該当する項目を書き換える
				for(var i = 0; i < iniKeys.length; i++){
					editor.WriteSettingString("Display", iniKeys[i],
						editor.ReadSettingString("Theme\\" + newTheme, iniKeys[i], "")
					);
				}
				editor.WriteSettingString("Themes", "ThemeName", newTheme);

				editor.ReadSettings();
			}else{
				window.OutputBar.Visible = true;
				window.OutputBar.Writeln("指定されたテーマが見つかりません: " + newTheme);
			}
		}
	}
}else{
	window.OutputBar.Visible = true;
	window.OutputBar.Writeln("動作対象外のMeryです: Ver." + editor.Version);
}

// Mery.iniから指定セクションのキー名一覧を取得する
function enumKeysInSection(sectionName){
	var keys = [];

	// Mery.ini を探す
	var iniPath = editor.FullName.replace(/\.exe$/i, ".ini");
	if(! (new ActiveXObject("Scripting.FileSystemObject")).FileExists(iniPath)){
		var iniName = /\\([^\\]+)\.exe$/.exec(editor.FullName)[1];
		iniPath = (new ActiveXObject("WScript.Shell")).SpecialFolders("APPDATA") + "\\Mery\\" + iniName + ".ini";
	}
	// Mery.ini を読みこむ
	var adodb = new ActiveXObject("adodb.Stream");
	var adTypeText = 2, adReadAll = -1;
	adodb.Type = adTypeText, adodb.Charset = "UTF-8";
	adodb.Open();
	adodb.LoadFromFile(iniPath);
	var iniText = adodb.ReadText(adReadAll);
	adodb.Close();

	var start = iniText.search(new RegExp("^\\[" + sectionName.replace(/\W/g, "\\$&") + "\\]$", "m"));
	if(start >= 0){
		start = start + sectionName.length + 4;
		var end = iniText.indexOf("\r\n[", start);
		if(end < 0) end = iniText.length;

		var rows = iniText.slice(start, end).split("\r\n");
		for(var i = 0; i < rows.length; i++){
			var keyEnd = rows[i].indexOf("=");
			if(keyEnd > 0){
				keys.push(rows[i].slice(0, keyEnd));
			}
		}
	}
	return keys;
}
スポンサーリンク