編集モードの自動選択
「編集モードの自動選択」または「書き換え禁止で開く」
「ファイルを開いたとき」専用のイベントマクロです。
ref. オンラインヘルプ: マクロ - カスタマイズ
拡張子で適切に判別できないファイルの「編集モード」を、ファイル名で自動割りふりします。
また、ふだんは再編集の必要がないファイルをファイル名で自動割りふりして「書き換え禁止」で開くようにします。
※「書き換え禁止」は Mery 上で編集禁止(仮ロック)にする機能で、 [編集]メニューの項目「書き換え禁止」で解除できます。ファイル属性を「読み取り専用」にするわけではありません。
c.f. 「属性変更」マクロ
「ファイルを読み直す・開きなおす」マクロ
コマンドラインオプション
マクロ上で Mery の コマンドラインオプション 指定に相当する記述法は以下のようになります。
※このページのソースコードに書き足す場合は「 document. 」の部分は省略可。
- document.ReadOnly = true;
- コマンドラインオプション Mery.exe /r
- 書き換え禁止に設定します。
- document.Mode = "ModeName";
- コマンドラインオプション Mery.exe /m "ModeName"
- 編集モードを指定します。
- document.Encoding = nnnn;
- コマンドラインオプション Mery.exe /cp Encoding
- エンコードをエンコード定数で定義されている数値で指定します。
ref. マクロリファレンス:エンコード定数
- document.selection.SetActivePoint( mePosLogical, x, y );
- カーソル位置を設定します。
- コマンドラインオプション Mery.exe /l LineNumber
- 行(論理座標)に移動します。 ※マクロ上では "y" に行番号(1~ )で指定
- コマンドラインオプション Mery.exe /cl ColumnNumber
- 桁(論理座標)に移動します。 ※マクロ上では "x" に桁番号(1~ )で指定
ソースコード
sukemaru 版1
ファイル名や編集モード名は サンプル ですので、ご利用の環境にあわせて適宜書き換えてください。
- ファイル名は、"ファイル名を小文字で列挙する" パターンと "正規表現で部分一致させる" パターンとを利用できます。
- ファイルパスの「\」記号はふたつ重ね「\\」で記述してください。
- ファイル名の日本語/全角文字の部分はそのまま記述します。
#title = "編集モードの自動選択"
// または
// "書き換え禁止で開く"
// 「ファイルを開いたとき」専用のイベントマクロ
// document.Mode = "HOGE"; => 「編集モード名」を指定する (表示メニューのアイテム)
// document.ReadOnly = true; => 「書き換え禁止」にする (編集メニューのアイテム)
// 【"ファイル名" を小文字で列挙するパターン】と【正規表現で「部分一致」させるパターン】にファイル名/フォルダ名を追加してご利用ください
with ( document ) {
// ■"ファイル名" を小文字で列挙するパターン
switch ( Name.toLowerCase() ) {
case "mery.txt": // ReadMe ファイルなど
case "hosts": // ふだんは書き換えの必要のないシステムファイルなど
ReadOnly = true;
break;
case "replacestr.txt": // Jane系2ちゃんブラウザの設定ファイル
case "imageviewurlreplace.dat":
case "urlexec.dat":
case "command.dat":
Mode = "JaneStyle (正規表現用)" // 構文ファイル「JaneStyle (正規表現用)」
break;
default:
break;
}
// ■正規表現でファイル名に「部分一致」させるパターン
// ※フラグ i を設定しているばあい、大文字と小文字が区別されない
if ( Name.match( /read ?me|eula|COPYING/i ) ) { // ReadMe ファイルなど
ReadOnly = true;
Quit();
}
if ( Name.match( /正規表現.*\.txt/ ) ) { // 正規表現のリファレンスなど
Mode = "Reg_Exp"; // 「JaneStyle (正規表現用)」から間引きした構文ファイル
ReadOnly = true;
Quit();
}
if ( Name.match( /Mery_小マクロ集/i ) ) { // 『Mery_小マクロ集』
Mode = "JavaScript";
ReadOnly = true;
Quit();
}
// ■正規表現でフルパスに「部分一致」させるパターン
// ※フラグ i を設定しているばあい、大文字と小文字が区別されない
if ( FullName.match( /Mery\\Macros/i ) ) { // Meryのマクロフォルダ内のファイル
Mode = "JavaScript";
Quit();
}
}
Bleat 版
設定部分を配列化して管理しやすくした簡易バージョンです。
sukemaru版で使えるオプション記述のうち、エンコード指定とカーソル位置の設定には対応していません。
#title = "編集モード自動判別"
#tooltip = "表示モード自動判別"
// -----------------------------------------------------------------------------
// ファイル名に含まれる特定ワードで表示モードを変更するマクロ
// イベント実行「ファイルを開いた時」または「アクティブな文書が変更された時」
// -----------------------------------------------------------------------------
const type = { n:document.Name , f:document.FullName };
//-----------------------------------設定------------------------------------
const n = type.f; // 検索対象の種類:type.n:ファイル名と拡張子 type.f:フルパス
const RO = "書禁"; // 書き換え禁止フラグ名(編集モード名と被る場合に変更してください)
const m = [
// [ /ファイル名(正規表現可)/検索フラグ(省略可), "編集モード名(省略可)" , "書禁フラグ(省略可)" ],
[ /(readme|README)\.txt$/ , "Markdown" ],
[ /"青空文庫" , /\/book\/ , "書禁" ],
[ /\\Mery\\Macros\\.+\.js$/i , "Mery_Macro_JS" ],
];
//-----------------------------------本体------------------------------------
for (let i = 0, imax = m.length; i < imax; i=(i+1)|0){
if (n.match(m[i][0])) {
if (m[i][1] != RO ){
editor.ActiveDocument.mode = m[i][1];
if ( m[i][2] === RO ) {
editor.ActiveDocument.ReadOnly = true;
}
} else {
editor.ActiveDocument.ReadOnly = true;
}
break;
}
}
sukemaru 版2
「ファイルを開いた時」のイベントだけでは、複数のファイルを(D&D などで)まとめて開いたときに "最後のタブ" にしか「編集モードの自動選択(書き換え禁止)」が適用されないようですので、複数ファイル対応版をつくりました。
- マクロのカスタマイズダイアログ内のイベント設定で「ファイルを開いた時」と「文書を閉じた時」のふたつにチェックを付けてください。
- このマクロでは「includeライブラリ」を使用します。あらかじめ Macros フォルダに「includeライブラリ」をインストール(ZIPを解凍)してください。
- "すでに開いていたファイルのリスト" をチェックして "新しく開いたファイル" に「編集モードの自動選択(書き換え禁止)」を適用します。
"すでに開いていたファイルのリスト" が必要なため、ファイルリストを外部ファイル(JSON)に保存します。
- 仕様上の制限
外部保存のファイルリスト(JSON)を読み書きをするため、すばやく連続で複数のドキュメントを閉じた場合の動作保障ができません。
また、Mery ベータ版 2.6.15 以降の「ワークスペース機能」でタブを復元したさいは、すべてのタブにたいして「編集モードの自動選択(書き換え禁止)」が適用されます。
動作確認したかぎりでは
- 複数のタブを開いていたエディタウインドウを閉じた場合
- ファイルメニューの「すべて閉じる」コマンドを使用した場合
- 3つのタブをすばやく連続で閉じた場合
などは問題ないようでしたが、
"ファイル(タブ)を開くマクロ" や "タブを閉じるマクロ" を使用したときには、このマクロにイベントが渡されないため「編集モードの自動選択(書き換え禁止)」が適用されず、ファイルリストも更新されませんでした。
※当方の環境では、エディタの動作が不安定になるような支障をきたすことはありませんでした。
- ダウンロード: 「ファイル:編集モードの自動選択(include版).zip」
#title = "編集モードの自動選択"
#include "include/IO.js"
#include "include/MeryInfo.js"
// または
// "書き換え禁止で開く"
/**
* ----------------------------------------
* 「編集モードの自動選択」の include版
* sukemaru (include版 2019/04/06)
* ----------------------------------------
* 「ファイルを開いたとき」+「文書を閉じたとき」専用のイベントマクロ。
*
* include ライブラリを利用して開いているファイルのリストを保存し、
* 最新の状態との差分を検出して「編集モードの自動選択」を適用する。
*
* ファイルリストの保存場所は
* Mery\Macros\MacroSettings\編集モードの自動選択.json
* または %AppData%\Mery\MacroSettings\編集モードの自動選択.json
*/
// ---------- ▼ 実行コード ▼ ---------- //
{
Main();
}
// ---------- ▲ 実行コード ▲ ---------- //
// ---------- ▼ 設定 ▼ ---------- //
/**
* 関数 ModeSetting( objDocument )
* 「編集モードの自動選択」マクロ
*
* ファイル名やファイルパス、正規表現でのマッチなどの条件付けを設定して
* 「編集モード」や「書き換え禁止」などを任意の組み合わせで適用する
*/
function ModeSetting( objDocument ) {
with ( objDocument ) {
// ■"ファイル名" を小文字で列挙するパターン
switch ( Name.toLowerCase() ) {
case "mery.txt": // ReadMe ファイルなど
ReadOnly = true;
break;
case "hosts": // ふだんは書き換えの必要のないシステムファイル
Mode = "INI";
ReadOnly = true;
break;
// 要:構文ファイル「JaneStyle (正規表現用)」
// case "replacestr.txt": // Jane系2ちゃんブラウザの設定ファイル
// case "imageviewurlreplace.dat":
// case "urlexec.dat":
// case "command.dat":
// Mode = "JaneStyle (正規表現用)"
// break;
default:
// ■編集モード名に「一致」させるパターン
// 要:構文ファイル「Mery_Macro_JS」
if ( Mode == "Mery_Macro_JS" ) { // 拡張子 .js と .js$
ReadOnly = true;
}
// ■正規表現でファイル名に「部分一致」させるパターン
// ※フラグ i を設定しているばあい、大文字と小文字が区別されない
// ReadMe ファイルなど
else if ( Name.match( /read ?me|eula|COPYING|^Re\.(?:ja|en)$|\.md$/i ) ) {
Mode = "Text";
ReadOnly = true;
}
// LOG ファイル
else if ( Name.match( /log(?:\.[^.]+)?$/i ) ) {
Mode = "Text";
ReadOnly = true;
}
// ■正規表現でフルパスに「部分一致」させるパターン
// ※フラグ i を設定しているばあい、大文字と小文字が区別されない
// \Mery\Macros フォルダの .JS ファイル
else if ( FullName.match( /\\Mery\\Macros\\.*\.js$/i ) ) ) {
Mode = "JavaScript";
ReadOnly = true;
}
break;
}
}
}
// ---------- ▲ 設定 ▲ ---------- //
/**
* 関数 Main()
* 開いているドキュメントのリストを保存し、
* あらたに開いたドキュメントに「編集モードの自動選択」を適用する
*
* ※ こちらのコードは編集禁止
*/
function Main() {
var json = "編集モードの自動選択";
var setting = {};
// 前回のファイルリストを JSON から読みこむ
setting = IO.Deserialize( setting, json ); // JSON 読み込み
var s = setting.fileList || [];
var sCount = s.length;
var files = []; // 最新の「開いているファイル」リスト
var filePath;
var eCount = Editors.Count;
var dCount;
// 最新の「開いているファイル」のリストを生成しつつ...
for ( var ee = 0; ee < eCount; ee ++ ) {
dCount = Editors.Item( ee ).Documents.Count;
for ( var dd = 0; dd < dCount; dd ++ ) {
filePath = Editors.Item( ee ).Documents.Item( dd ).FullName;
files.push( filePath ); // ファイルリストに追加
// 前回のファイルリストと照合する
for ( var i = 0, hit = 0; i < sCount; i ++ ) {
if ( s[i] && filePath == s[i] ) {
hit ++;
}
}
// あらたに開いたドキュメントに「編集モードの自動選択」を適用する
if ( ! hit ) {
ModeSetting( Editors.Item( ee ).Documents.Item( dd ) );
}
}
}
// 最新のファイルリストを JSON に保存する
setting.fileList = files;
IO.Serialize( setting, json );
}
/**
* Mer\\Macros\\MacroSettings\\編集モードの自動選択.json ファイルの初期状態
*
{"fileList":[]}
*
*/
おまけマクロ
書き換え禁止 ON/OFF
- [編集]カテゴリのメニュー項目:「書き換え禁止」
#title = "書き換え禁止 ON/OFF"
#tooltip = "書き換え禁止 ON/OFF"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",36
if ( document.ReadOnly )
document.ReadOnly = false;
else document.ReadOnly = true;
現在の編集モードのプロパティ
- [表示]カテゴリのメニュー項目:「編集モード」グループ >> 「編集モードの設定...」 → 現在の編集モードの 「プロパティ」
#title = "編集モードの設定..."
#tooltip = "現在の編集モードのプロパティ"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",157
// 5ちゃんねる「テキストエディタ Mery part4」 レス484-485 より
// ref. https://potato.5ch.net/test/read.cgi/software/1410842156/484-485
var shell = new ActiveXObject( "WScript.Shell" );
shell.SendKeys( '%P' );
editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 ); // 編集モードの設定ダイアログを開くだけなら、この一行のみでよい