編集モードの自動選択

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

編集モードの自動選択」または「書き換え禁止で開く

「ファイルを開いたとき」専用のイベントマクロです。

 ref. オンラインヘルプ: マクロ - カスタマイズ

拡張子で適切に判別できないファイルの「編集モード」を、ファイル名で自動割りふりします。
また、ふだんは再編集の必要がないファイルをファイル名で自動割りふりして「書き換え禁止」で開くようにします。

※「書き換え禁止」は Mery 上で編集禁止(仮ロック)にする機能で、 [編集]メニューの項目「書き換え禁止」で解除できます。ファイル属性を「読み取り専用」にするわけではありません。
 c.f. 属性変更」マクロ
   「ファイルを読み直す・開きなおす」マクロ


コマンドラインオプション[編集]

マクロ上で Mery の コマンドラインオプション 指定に相当する記述法は以下のようになります。

※このページのソースコードに書き足す場合は「 document. 」の部分は省略可。

コマンドラインオプション Mery.exe /r
書き換え禁止に設定します。


  • document.Mode = "ModeName";
コマンドラインオプション Mery.exe /m "ModeName"
編集モードを指定します。


コマンドラインオプション Mery.exe /cp Encoding
エンコードをエンコード定数で定義されている数値で指定します。
ref. マクロリファレンス:エンコード定数


カーソル位置を設定します。
  • コマンドラインオプション Mery.exe /l LineNumber
行(論理座標)に移動します。 ※マクロ上では "y" に行番号(1~ )で指定
  • コマンドラインオプション Mery.exe /cl ColumnNumber
桁(論理座標)に移動します。 ※マクロ上では "x" に桁番号(1~ )で指定


sukemaru 版1[編集]

ファイル名や編集モード名は サンプル ですので、ご利用の環境にあわせて適宜書き換えてください。

  • ファイル名は、"ファイル名を小文字で列挙する" パターンと "正規表現で部分一致させる" パターンとを利用できます。
  • ファイルパスの「\」記号はふたつ重ね「\\」で記述してください。
  • ファイル名の日本語/全角文字の部分はそのまま記述します。
#language = "JScript"
#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(include版)[編集]

ダウンロード: 「ファイル:編集モードの自動選択(include版).zip
  • 2019/04/22 更新:
「無題」ドキュメントにはマクロの処理を適用しないように変更。
マクロを上書き更新する場合は「Main 関数」の部分だけを上書きしてください(「設定」部分のコードには変更なし)。
おまけマクロを追加(編集モードのプロパティパネルを開く)
  • 2019/04/24 更新:
サブマクロを追加(「ファイルを保存したとき」専用のイベントマクロ)


イベントマクロ

「ファイルを開いた時」のイベントだけでは、(D&D などで)複数のファイルをまとめて開いたときに "最後のタブ" にしか「編集モードの自動選択(書き換え禁止)」が適用されないようですので、複数ファイル対応版をつくりました。

  • マクロのカスタマイズダイアログ内のイベント設定で「ファイルを開いた時」と「文書を閉じた時」のふたつにチェックを付けてください。
  • "すでに開いていたファイルのリスト" をチェックして "新しく開いたファイル" に「編集モードの自動選択(書き換え禁止)」を適用します。そのためには新しいタブを開いたあとの最新のタブの状態ではなく "すでに開いていたタブの状態" が必要になるので、「includeライブラリ」を利用してファイルリストを外部ファイル(JSON)に保存します。


あらかじめ includeライブラリ を Macros フォルダに配置してください。

外部ファイルの保存場所は Mery\Macros\MacroSettings\編集モードの自動選択.json
または %AppData%\Mery\MacroSettings\編集モードの自動選択.json です。


仕様上の制限

外部保存のファイルリスト(JSON)を読み書きをするため、すばやく連続で複数のドキュメントを閉じた場合の動作に不安があります (※「ファイルを開いた時」「文書を閉じた時」に他のイベントマクロも割り当てている場合も動作に不安あり)。

また、Mery ベータ版 2.6.15 以降の「ワークスペース機能」でタブを復元したさいは、すべてのタブにたいして「編集モードの自動選択(書き換え禁止)」が適用されます(※ 2.7.0 以降ではさいごのタブにだけは適用されないようです)。

動作確認したかぎりでは

  1. 複数のタブを開いていたエディタウインドウを閉じた場合
  2. ファイルメニューの「すべて閉じる」コマンドを使用した場合
  3. 5つのタブをすばやく連続で閉じた場合

などは問題ないようでしたが、
"ファイル(タブ)を開くマクロ" や "タブを閉じるマクロ" を使用したときには、このマクロにイベントが渡されないため「編集モードの自動選択(書き換え禁止)」が適用されず、ファイルリストも更新されませんでした。

また、当方の環境では「ファイルを開いた時」のイベントに「バイト数」マクロと「ファイルのフルパスをコピーして閉じる 」マクロも割り当てていますが、エディタの動作が不安定になるような支障をきたすことはないようです(Windows XP SP3, Mery ver 2.6.15 - 2.7.4 (32bit ポータブル))。

※ 動作速度を優先するために、このマクロではファイルの「読み取り専用属性」をチェックしません。「読み取り専用」のファイルに ReadOnly = false; を割り当てないようにしてください。

「読み取り専用」のファイルの「書き換え禁止」フラグを解除して編集し、上書き保存しようとすると、エラーになります。「バックアップ」機能を使用している場合、「読み取り専用」のバックアップファイルが作られてしまうためバックアップファイルの上書きができなくなり、以後、元のファイルを再編集・上書き保存する必要があったときにもエラーが発生します。

※ご利用の環境で Mery の動作が不安定になる場合は、使用を中止し、このマクロを削除してください。

ソースコード: 「ファイル:編集モードの自動選択(include版).zip」(2019/04/24 更新)

メインマクロ[編集]

ソースコード内の「ファイル名」や「編集モード名」などは サンプル ですので、ご利用の環境にあわせて適宜書き換えてください。

#title = "編集モードの自動選択"
#include "include/IO.js"
// または
// "書き換え禁止で開く"

/**
 * ----------------------------------------
 * 「編集モードの自動選択」の include版
 * sukemaru (include版 2019/04/22 更新)
 * ----------------------------------------
 * 「ファイルを開いたとき」+「文書を閉じたとき」専用のイベントマクロ。
 * 
 *   include ライブラリを利用して開いているファイルのリストを保存し、
 *   最新の状態との差分を検出して「編集モードの自動選択」を適用する。
 *
 *     ファイルリストの保存場所は
 *             Mery\Macros\MacroSettings\編集モードの自動選択.json 
 *     または  %AppData%\Mery\MacroSettings\編集モードの自動選択.json
 */

// ---------- ▼ 実行コード ▼ ---------- //
{
  Main();
}
// ---------- ▲ 実行コード ▲ ---------- //


// ---------- ▼ 設定 ▼ ---------- //
/**
 * 関数 ModeSetting( objDocument )
 * 「編集モードの自動選択」マクロ
 * 
 * ファイル名やファイルパス、正規表現でのマッチなど、条件付けを設定して
 * 「編集モード」や「書き換え禁止」などを任意の組み合わせで適用する
 * 
 * Mode = "HOGE";	=> 「編集モード」を指定 (コマンドライン  /m "ModeName")
 * ReadOnly = true;	=> 「書き換え禁止」 (コマンドライン  /r )
 * Encoding = nnnn;	=> 「エンコード定数」を指定 (コマンドライン  /cp nnnn)
 * selection.SetActivePoint( mePosLogical, x, y );
 * 		=> 「カーソル位置」を指定 (コマンドライン  /cl xx /l yy)
 */

function ModeSetting( objDocument ) {
  with ( objDocument ) {

//     // つねに先頭行にキャレットをセットするなら
//     selection.SetActivePoint( mePosLogical, 1, 1 ); ScrollY = 1;

    // ■ "ファイル名" を小文字で列挙するパターン

    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;


// ▼ この下に case "hoge": Mode = "PIYO"; break; を追加する  ▼

      // case "hoge.txt":		// 「ファイル名」は小文字で記述する
      // case "fuga.txt":		// おなじ編集モードに割り振るなら case : で列挙する
      //   Mode = "PIYO";		// 「編集モード名」を指定
      //   ReadOnly = true;		// 「書き換え禁止」にするなら true
      //   break;				// かならず break; をつけること

								// 「書き換え禁止」にしないなら ReadOnly の行は不要
      // case "foo.txt":		// 「ファイル名」は小文字で記述する
      //   Mode = "BAR";		// 「編集モード名」を指定
      //   break;				// かならず break; をつけること



      default:

        // ■ 編集モード名に「一致」させるパターン

        // 要:構文ファイル「Mery_Macro_JS」
        if ( Mode == "Mery_Macro_JS" ) {
          ReadOnly = true;
        }

// ▼ --- 以降、else if ( ... ) { ...; } で記述する --- ▼


        // ■ 正規表現でファイル名に「部分一致」させるパターン
        // ※フラグ 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;
        }

        // // ※ 特定のファイル名「あああ.txt」に完全一致させるなら
        // //   Name.match( /\\あああ\.txt$/i )
        // // (半角アルファベットの 大文字/小文字 は区別なし)
        // else if ( Name.match( /\\あああ\.txt$/i ) ) {
        //   Mode = "AAA";
        //   ReadOnly = true;
        // }

        // // ※ ファイル名に「いいい」を含むものにマッチさせるなら
        // //   Name.match( /\\[^\\]*いいい.*\.?[^.]*$/i )
        // else if ( Name.match( /\\[^\\]*いいい.*\.?[^.]*$/i ) ) {
        //   Mode = "III";
        //   ReadOnly = true;
        // }


        // ■ 正規表現でフルパスに「部分一致」させるパターン
        // ※フラグ i を設定しているばあい、大文字と小文字が区別されない

        // (例)\Mery\Macros フォルダの .JS ファイル
        //     「\」記号はふたつ重ね「\\」にする
        else if ( FullName.match( /\\Mery\\Macros\\.+\.js$/i ) ) {
          Mode = "JavaScript";
          ReadOnly = true;
        }

        // // ※ 特定のフォルダ名「ううう」に完全一致させるなら
        // //   FullName.match( /\\ううう\\/i )
        // else if ( FullName.match( /\\ううう\\/i ) ) {
        //   Mode = "UUU";
        //   ReadOnly = true;
        // }

        // // ※ フォルダ名に「えええ」を含むものにマッチさせるなら
        // //   FullName.match( /\\[^\\]*えええ[^\\]*\\/i )
        // else if ( FullName.match( /\\[^\\]*えええ[^\\]*\\/i ) ) {
        //   Mode = "EEE";
        //   ReadOnly = true;
        // }

        
        

// ▲ --- ココより上に追加する --- ▲
        else  { ; }
        break;
    }
  }
}
// ---------- ▲ 設定 ▲ ---------- //

// ---------- ▼ Main 関数 ▼ ---------- //
/**
 * 関数 Main()
 * 開いているドキュメントのリストを保存し、
 * あらたに開いたドキュメントに「編集モードの自動選択」を適用する
 * 
 * ※ こちらのコードは編集不可
 * ※ Mery ver 2.6.15 まではイベントマクロに
 *    ScriptName.replace( /\.js$/i, "" ) を使えないので
 *    JSON のファイル名を "編集モードの自動選択" に固定する
 * ※「無題」ドキュメントには適用しないように変更した
 */
function Main() {
  var jsonName = "編集モードの自動選択";
  var setting = {};

  // 前回のファイルリストを JSON から読みこむ
  setting = IO.Deserialize( setting, jsonName );
  var s = setting.fileList || [];
  var sCount = s.length;

  var files = [];	// 最新の「開いているファイル」リスト
  var file, 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 ++ ) {
      file = Editors.Item( ee ).Documents.Item( dd );
      filePath = file.FullName || "";
      files.push( filePath );		// ファイルリストに追加
      // 前回のファイルリストと照合する
      for ( var i = 0, hit = 0; i < sCount; i ++ ) {
        if ( s[i] && filePath == s[i] ) {
          hit ++;
        }
      }
      // あらたに開いたドキュメントに「編集モードの自動選択」を適用する
      if ( ! hit && filePath ) {
        ModeSetting( file );
      }
    }
  }
  // 最新のファイルリストを JSON に保存する
  if ( s.toString() != files.toString() ) {
    setting.fileList = files;
    IO.Serialize( setting, jsonName );
  }
}
// ---------- ▲ Main 関数 ▲ ---------- //

/**
 * Mer\\Macros\\MacroSettings\\編集モードの自動選択.json ファイルの初期状態

{"fileList":[]}

 */


サブマクロ[編集]

メインマクロだけでは、「無題」ドキュメントに名前を付けて保存したあとに別のタブを 開く/閉じる と、この新規作成・保存したドキュメントはメインマクロの処理対象になり「書き換え禁止」などが適用されることがあるので、それを防ぎます。

  • マクロのカスタマイズダイアログ内のイベント設定で「ファイルを保存したとき」にチェックを付けてください。

このマクロ自体は「編集モード」や「書き換え禁止」などを変更しません。
「編集モードの自動選択」マクロ(include版)のファイルのリストを更新し、新規保存されたドキュメントを書きくわえます。

#title = "編集モードの自動選択(保存)"
#include "include/IO.js"

/**
 * --------------------------------------------------
 * 「編集モードの自動選択」(include版)の機能補完
 * sukemaru (include版 2019/04/24)
 * --------------------------------------------------
 * 「ファイルを保存したとき」専用のイベントマクロ。
 */

var jsonName = "編集モードの自動選択";
var setting = {};
// 前回のファイルリストを JSON から読みこむ
setting = IO.Deserialize( setting, jsonName );
var s = setting.fileList || [];
// 最新の「開いているファイル」リスト
var files = [], file, filePath;
var eCount = Editors.Count, dCount; 

// 最新の「開いているファイル」のリストを生成する
for ( var ee = 0; ee < eCount; ee ++ ) {
  dCount = Editors.Item( ee ).Documents.Count;
  for ( var dd = 0; dd < dCount; dd ++ ) {
    file = Editors.Item( ee ).Documents.Item( dd );
    filePath = file.FullName || "";
    files.push( filePath );
  }
}
// 最新のファイルリストを JSON に保存する
if ( s.toString() != files.toString() ) {
  setting.fileList = files;
  IO.Serialize( setting, jsonName );
}

おまけマクロ[編集]

現在の編集モードのプロパティ[編集]

#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' );		// Alt + P キーをエミュレート
editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 );	// 編集モードの設定ダイアログを開くだけなら、この一行のみでよい

書き換え禁止 ON/OFF[編集]

  • [編集]カテゴリのメニュー項目:「書き換え禁止」
#title = "書き換え禁止 ON/OFF"
#tooltip = "書き換え禁止 ON/OFF"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",36

if ( document.FullName && ! document.ReadOnly )
  document.ReadOnly = true;
else
  document.ReadOnly = false;

※「無題」ドキュメントを「書き換え禁止」にしないよう変更した(2019/04/22 sukemaru)

スポンサーリンク