「編集モードの自動選択」の版間の差分

Sukemaru (トーク | 投稿記録)
sukemaru 版2(include版)を追加
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
 
(2人の利用者による、間の16版が非表示)
1行目: 1行目:
「'''編集モードの自動選択'''」または「'''書き換え禁止で開く'''」
== 概要 ==
拡張子で適切に判別できないファイルの「編集モード」を、ファイル名で自動割り振りします。


<u>「'''ファイルを開いたとき'''」専用のイベントマクロです。</u><br>
また、普段は再編集の必要がないファイルをファイル名で自動割り振りして「書き換え禁止」で開くようにします。
 ''ref.''  オンラインヘルプ: マクロ - [[ヘルプ:マクロ#カスタマイズ|カスタマイズ]]


拡張子で適切に判別できないファイルの「[[ヘルプ:表示#編集モード|編集モード]]」を、ファイル名で自動割りふりします。<br>
※「書き換え禁止」はMery上で編集禁止(仮ロック)にする機能で、[編集] メニューの項目「書き換え禁止」で解除できます。ファイル属性を「読み取り専用」にするわけではありません。
また、ふだんは再編集の必要がないファイルをファイル名で自動割りふりして「[[ヘルプ:編集#書き換え禁止|書き換え禁止]]」で開くようにします。


※「'''書き換え禁止'''」は Mery 上で編集禁止(仮ロック)にする機能で、 [編集]メニューの項目「書き換え禁止」で解除できます。ファイル属性を「読み取り専用」するわけではありません。
== 注意事項 ==
<br> ''c.f. '' 「[[マテリアルデザインっぽいアイコンと『小マクロ集』#属性変更|属性変更]]」マクロ
「ファイルを開いた時」専用のイベントマクロです([[ヘルプ:マクロ#カスタマイズ|カスタマイズ]]を参照)。


= コマンドラインオプション =
== コマンドラインオプション ==
マクロ上で Mery の [[ヘルプ:目次#コマンドラインオプション|コマンドラインオプション]] 指定に相当する記述法は以下のようになります。
マクロ上でMeryの[[ヘルプ:目次#コマンドラインオプション|コマンドラインオプション]]指定に相当する記述法は以下の通りになります。


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


* document.'''[[マクロリファレンス:Document_インターフェイス#ReadOnly プロパティ|ReadOnly]] = true;'''
* document.[[マクロリファレンス:Document_インターフェイス#ReadOnly プロパティ|ReadOnly]] '''= true;'''
:: コマンドラインオプション <u> '''/r''' </u>  
** コマンドラインオプション (<u>Mery.exe'''/r'''</u>)
::書き換え禁止に設定します。 <br> 
** 書き換え禁止に設定します
 
* document.[[マクロリファレンス:Document_インターフェイス#Mode_プロパティ|Mode]] '''= "ModeName";'''
* document.'''[[マクロリファレンス:Document_インターフェイス#Mode_プロパティ|Mode]] = "ModeName";'''
** コマンドラインオプション (<u>Mery.exe'''/m''' ''"ModeName"''</u>)
:: コマンドラインオプション <u> '''/m''' ''"ModeName"'' </u>  
** 編集モードを指定します
::編集モードを指定します。 <br> 
* document.[[マクロリファレンス:Document_インターフェイス#Encoding_プロパティ|Encoding]] '''= nnnn;'''
 
** コマンドラインオプション (<u>Mery.exe'''/cp''' ''Encoding''</u>)
* document.'''[[マクロリファレンス:Document_インターフェイス#Encoding_プロパティ|Encoding]] = nnnn;'''
** エンコードをエンコード定数で定義されている数値で指定します([[マクロリファレンス:エンコード定数|エンコード定数]]を参照)
:: コマンドラインオプション <u> '''/cp''' ''Encoding'' </u>  
* document.'''selection.'''[[マクロリファレンス:Selection_インターフェイス#SetActivePoint_メソッド|SetActivePoint]]'''(mePosLogical, x, y);'''
::エンコードをエンコード定数で定義されている数値で指定します。 <br> ''ref.''  [[マクロリファレンス:エンコード定数]] <br> 
** カーソル位置を設定します
 
*** コマンドラインオプション (<u>Mery.exe'''/l''' ''LineNumber''</u>)
* document.'''selection.[[マクロリファレンス:Selection_インターフェイス#SetActivePoint_メソッド|SetActivePoint]]( mePosLogical, x, y );'''
**** 行(論理座標)に移動します ※マクロ上では "y" に行番号(1~)で指定
:: カーソル位置を設定します。
*** コマンドラインオプション (<u>Mery.exe'''/cl''' ''ColumnNumber''</u>)
:* コマンドラインオプション <u> '''/l''' ''LineNumber'' </u>  
**** 桁(論理座標)に移動します ※マクロ上では "x" に桁番号(1~)で指定
::行(論理座標)に移動します。 ※マクロ上では "y" に行番号(1~ )で指定
:* コマンドラインオプション <u> '''/cl''' ''ColumnNumber'' </u>  
::桁(論理座標)に移動します。 ※マクロ上では "x" に桁番号(1~ )で指定


== ソースコード ==
設定部分を配列化して管理しやすくした簡易バージョンです。


= ソースコード =
コマンドラインで使えるオプション記述のうち、エンコード指定とカーソル位置の設定には対応していません。
== sukemaru 版1 ==


ファイル名や編集モード名は <u>サンプル</u> ですので、ご利用の環境にあわせて適宜書き換えてください。
<syntaxhighlight lang="javascript" copy>
*ファイル名は、"ファイル名を小文字で列挙する" パターンと "正規表現で部分一致させる" パターンとを利用できます。
* ファイル名の日本語/全角文字の部分はそのまま記述します。
<source lang="javascript">
#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();
  }
 
}
</source>
 
 
== Bleat 版 ==
 
設定部分を配列化して管理しやすくした簡易バージョンです。<br>
sukemaru版で使えるオプション記述のうち、エンコード指定とカーソル位置の設定には対応していません。
 
<source lang="javascript">
#title = "編集モード自動判別"
#title = "編集モード自動判別"
#tooltip = "表示モード自動判別"
#tooltip = "表示モード自動判別"
146行目: 69行目:
}
}
}
}
</source>
</syntaxhighlight>
 
 
== sukemaru 版2 ==
 
「ファイルを開いた時」のイベントだけでは、複数のファイルを(D&D などで)まとめて開いたときに "最後のタブ" にしか「編集モードの自動選択(書き換え禁止)」が適用されないようですので、複数ファイル対応版をつくりました。
*マクロのカスタマイズダイアログ内のイベント設定で「'''ファイルを開いた時'''」と「'''文書を閉じた時'''」のふたつにチェックを付けてください。
*'''このマクロでは「[[includeライブラリ]]」を使用します。'''あらかじめ Macros フォルダに「includeライブラリ」をインストール(ZIPを解凍)してください。
*"すでに開いていたファイルのリスト" をチェックして "新しく開いたファイル" に「編集モードの自動選択(書き換え禁止)」を適用します。<br> "すでに開いていたファイルのリスト" が必要なため、ファイルリストを外部ファイル(JSON)に保存します。
<br>
;仕様上の制限
<span style="color:#c00;">外部保存のファイルリスト(JSON)を読み書きをするため、すばやく連続で複数のドキュメントを閉じた場合の動作保障ができません。 </span>
 
また、Mery ベータ版 2.6.15 以降の「[https://www.haijin-boys.com/software/mery/mery-2-6-15 ワークスペース機能]」でタブを復元したさいは、すべてのタブにたいして「編集モードの自動選択(書き換え禁止)」が適用されます。
 
動作確認したかぎりでは
#複数のタブを開いていたエディタウインドウを閉じた場合
#ファイルメニューの「すべて閉じる」コマンドを使用した場合
#3つのタブをすばやく連続で閉じた場合
などは問題ないようでしたが、<br>
"'''ファイル(タブ)を開くマクロ'''" や "'''タブを閉じるマクロ'''" を使用したときには、このマクロにイベントが渡されないため「編集モードの自動選択(書き換え禁止)」が適用されず、ファイルリストが更新されませんでした。
<br><br>
 
----
;ダウンロード: 「[[ファイル:編集モードの自動選択(include版).zip]]」
 
<source lang="javascript" style="height:80em; overflow:auto;">
#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 )
* 「編集モードの自動選択」マクロ
*
* ファイル名やファイルパス、正規表現でのマッチなどの条件付けを設定して
* 「編集モード」や「書き換え禁止」などを任意の組み合わせで適用する
*
* 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 ) {
 
    // ■"ファイル名" を小文字で列挙するパターン
 
    switch ( Name.toLowerCase() ) {
 
      case "mery.txt": // ReadMe ファイルなど
        ReadOnly = true;
        break;
 
      case "hosts": // ふだんは書き換えの必要のないシステムファイル
        Mode = "INI";
        ReadOnly = true;
        break;
 
//      case "replacestr.txt": // Jane系2ちゃんブラウザの設定ファイル
//      case "imageviewurlreplace.dat":
//      case "urlexec.dat":
//      case "command.dat":
//        Mode = "JaneStyle (正規表現用)" // 要:構文ファイル「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":[]}
 
*
*/
</source>
 
 
= おまけマクロ =
== 書き換え禁止 ON/OFF ==
* [編集]カテゴリのメニュー項目:「書き換え禁止」
<source lang="javascript">
#title = "書き換え禁止 ON/OFF"
#tooltip = "書き換え禁止 ON/OFF"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",36
if ( document.ReadOnly )
  document.ReadOnly = false;
else  document.ReadOnly = true;
</source>
 
== 現在の編集モードのプロパティ ==
* [表示]カテゴリのメニュー項目:「編集モード」グループ >> 「[[ヘルプ:表示#編集モードの設定|編集モードの設定...]]」 →  現在の編集モードの 「プロパティ」
<source lang="javascript">
#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 ); // 編集モードの設定ダイアログを開くだけなら、この一行のみでよい
</source>
スポンサーリンク