見出し画像

テキストエディタ「Mery」マクロの小技と「Emeditor」との違い

私は、PCで文書などテキストを作成するときは、テキストエディタを使っている。
私が長年使用しているエディタは「EmEditor」。

EmEditorの前身であるEmTermに搭載されていた頃から…という話は置いといて、マクロなど機能性に優れているところが気に入っている。

職場のPCでもテキストを書くことが多いのでエディタを使いたいが、ライセンスの関係上、複数のPCでは使えない。じゃあもう1台分購入するか?
…と考えた結果、職場ではフリーのエディタ「Mery」を導入している。

MeryはEmEditor同様、強力なマクロ機能がある。しかも構文が似ているので、いくつかのものを移植して使用している。
しかもタイトル画像でMeryとEmeditorを並べてみたが、外観もよく似ている。おかげで、この記事を書くために両方を立ち上げたら、どっちがどっちか分からなくなることもあったが。

ということで、私が導入するに当たって、EmEditorでも使用していたマクロの中で、小技程度の小さなものを紹介。
それと共に、Emeditorとの構文の違いを書いてみたいと思う。


「閉じる」拡張版

Meryで「ファイルを閉じる」コマンドは、最後のタブを閉じてもまた新しいタブを作るので、アプリ自体は終了しない。そこで、最後のタブを閉じればアプリを終了する簡単なマクロを作った。

Mery版"Close.js"

// 「閉じる」拡張版
if (editor.Documents.Count <= 1)
    window.Close();			// タブが1つならアプリを閉じる
    else document.Close();	// 違う場合はタブだけ閉じる

私はこれを、キーボードショートカット「ESC」に割り当てて、ESCキーを押すだけで閉じるようにしている。

ちなみに、Emeditorはマクロを使わなくてもできる。私がEmeditorを最初に導入した理由の一つが「ESCキー1つだけで終了できる」ことだった。

全てコピー

文書全てをコピーするマクロ。
一番の用途はこのnoteで、エディタで文章を書いてから全てコピーしてnoteに貼り付けて作成している。

Mery版"AllCopy.js"

// 全てコピー
document.selection.SelectAll();	// 全て選択
document.selection.Copy();		// コピー
document.selection.Collapse();	// 選択解除

// document.selection.Collapse(meCollapseEnd);	// 選択解除(末尾に移動の場合)

単純に「全て選択~コピー」のコマンドを実行するだけ。
私はキーボードショートカット「Alt+C」に割り当てている。

Emeditor版・全てコピー

Emeditorでも、ほぼ同じ構文で可。

Emeditor版"AllCopy.jsee"

// 全てコピー
document.selection.SelectAll();			// 全選択
document.selection.Copy(eeCopyUnicode);	// コピー
document.selection.Collapse();			// 選択解除

Copyメソッドの"eeCopyUnicode"(Unicodeでコピー)コマンドはMeryで非搭載、というより不要("Copy()"だけで可)。

全てカット

文書全てをコピーしてから「変更を保存しますか?」のダイアログを出さず強制的に閉じるマクロ。
保存もしないので、作成中の文書で使用する場合は注意。でも全てコピーしてから閉じるのでまた貼り付ければいい。

私はよく、エディタで文字をメモ書きしてからコピーして別のソフトに貼り付けることが多く、その時にエディタが閉じるようにしたいので作った。

Mery版"AllCut.js"

// 全てカット(コピー後、強制的に閉じる)
document.selection.SelectAll();			// 全て選択
document.selection.Copy();				// コピー

var t = editor.Documents.Count			// タブ数を取得

for ( var i = 0; i < t; i ++ ) {
	var d = editor.Documents.Item( i )	// 編集中のタブを
	if (d == document) d.Saved = true;	// 保存済に設定(保存確認しない)
}

if (t <= 1) window.Close();				// タブが1つならアプリを閉じる
	else document.Close();				// 違う場合はタブだけ閉じる

私はキーボードショートカット「Alt+X」に割り当てている。

調べた限り、Meryは「タブの文書を保存済に設定」ができるが、「アクティブなタブに対して」の方法が見当たらない。
そのため「全てのタブからアクティブを見つけ出す~保存済に設定~閉じる~タブが1つならアプリも閉じる」という処理をしている。

(2024/12/15 追記)修正版

「アクティブなタブを保存済に設定」の方法は、"editor.ActiveDocument"という、極めて簡単な構文で可能だった。
そこで修正したもの。

// 全てカット(コピー後、強制的に閉じる)
document.selection.SelectAll();		// 全て選択
document.selection.Copy();			// コピー

// 文書破棄
editor.ActiveDocument.Saved = true;	// アクティブな文書を保存済に
if (editor.Documents.Count <= 1)
	window.Close();					// タブが1つならアプリを閉じる
	else document.Close();			// 違う場合はタブだけ閉じる

Emeditor版・全てカット

Emeditor版"AllCut.jsee"

// 全カット
document.selection.SelectAll();			// 全選択
document.selection.Copy(eeCopyUnicode);	// コピー
editor.ExecuteCommandByID(4120);		// ファイルを破棄

Emeditorは、コマンドを直接実行する"ExecuteCommandByID"メソッドで「保存の確認をせず破棄」ができる。
Meryにも該当するコマンドがあるかもしれないが確認できていない。

1行コピー

MeryもEmeditorも、範囲指定せずに「Ctrl+C」や「Ctrl+Ins」で1行全てコピーできるが、最後に改行が入った状態でコピーされる。
これを別のアプリに貼り付けるとき、改行があると面倒なことがあるため「改行が入らない1行コピー」が欲しくて作った。

Mery版"LineCopy.js"

document.selection.EndOfLine(false, mePosLogical);	//行末に移動
document.selection.StartOfLine(true, mePosLogical);	//行頭まで選択
document.selection.Copy();							// コピー
document.selection.Collapse();						// 選択解除

これは単純に「論理行末へ移動~論理行頭まで範囲指定~コピー」を実行するだけ。
私はキーボードショートカット「Ctrl+Shift+Ins」に割り当てている。

Emeditor版・1行コピー

Emeditorでも同じ処理だが、少々構文が異なる。

Emeditor版"LineCopy.jsee"

// 改行を省く1行コピー
document.selection.	EndOfLine(false,eeLineLogical);		// 行末に移動
document.selection.	StartOfLine(true,eeLineLogical);	// 行頭まで選択
document.selection.Copy(eeCopyUnicode);					// コピー
document.selection.Collapse();							// 選択解除

ペースト拡張版

先の1行コピーとは逆。
文字をMery上に貼り付けるとき「必ず末尾に改行を1つだけ入れる」。つまり末尾に改行がなくても、2つ以上でも1つだけ入れて貼り付けるマクロ。

Mery版"LinePaste.js"

// ペースト拡張・改行1つを入れて貼付
// (末尾が改行2つ以上でも1つに)
document.selection.Text=
    clipboardData.getData()			// クリップボードの文字から
    .replace(/(\r\n)*$/,"\r\n");	// 末尾の改行を1つだけにする

クリップボードの文字を取り出して、末尾をreplaceで変換するだけ。
私はキーボードショートカット「Alt+Ins」に割り当てている。

Emeditor版・ペースト拡張版

上記のマクロはEmeditorでもそのままの構文で起動可能だが、実際はうまくいかない。
どうも調べたところ、Emeditorは「起動直後にclipboardData.getData命令を使うと貼り付けできない」らしく、Emeditor上で一度コピー・ペーストをしてから実行すると正常に動作する。
そこで大幅に変更したもの。

Emeditor版"LinePaste.jsee"

d = document.selection
Y = d.GetActivePointY(eePosLogical);			// 論理行取得

d.SetActivePoint(eePosLogical , 1 , Y , false);	// 行の先頭に移動
d.Paste(eeCopyUnicode);							// 貼付
d.SetActivePoint(eePosLogical , 1 , Y , true);	// 行の先頭まで範囲指定
d.Text = d.Text.replace(/(\r\n?)*$/ , "\r\n");	// 最後を改行に変換

処理として「カーソル位置を取得~貼付~貼り付け前の位置まで範囲指定~範囲内を変換」という手の込んだことをやっている。
ちなみに、Emeditorは変数を代入するとき"var"の構文は省略可。

Meryを使ってみて

マクロを作ってみて感じたのは、MeryはEmeditorに匹敵する機能に驚いたこと。それでも機能的にはまだまだEmeditorの方が高いので、Meryに完全に移行とまではなさそう。
その両方を使っていると、違いを味わえて面白い。

いいなと思ったら応援しよう!

つかさん
サポートは大変ありがたいですが、Twitterを始めとするSNSなどで記事をご紹介いただければ、それも大変嬉しいサポートです。