「
編集モードの自動選択
」を編集中
2019年4月25日 (木) 00:19時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(
→
sukemaru 版2
:
「サブマクロ」を追加。ZIP を更新)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
「'''編集モードの自動選択'''」または「'''書き換え禁止で開く'''」 ;「ファイルを開いたとき」専用のイベントマクロです。 ''ref.'' オンラインヘルプ: マクロ - [[ヘルプ:マクロ#カスタマイズ|カスタマイズ]] 拡張子で適切に判別できないファイルの「[[ヘルプ:表示#編集モード|編集モード]]」を、ファイル名で自動割りふりします。<br> また、ふだんは再編集の必要がないファイルをファイル名で自動割りふりして「[[ヘルプ:編集#書き換え禁止|書き換え禁止]]」で開くようにします。 ※「'''書き換え禁止'''」は Mery 上で編集禁止(仮ロック)にする機能で、 [編集]メニューの項目「書き換え禁止」で解除できます。ファイル属性を「'''読み取り専用'''」にするわけではありません。 <br> ''c.f. '' 「[[マテリアルデザインっぽいアイコンと『小マクロ集』#属性変更|属性変更]]」マクロ <br> 「[[ファイルを読み直す・開きなおす]]」マクロ = コマンドラインオプション = マクロ上で Mery の [[ヘルプ:目次#コマンドラインオプション|コマンドラインオプション]] 指定に相当する記述法は以下のようになります。 ※このページのソースコードに書き足す場合は「 '''''document.''''' 」の部分は省略可。 <br> * document.'''[[マクロリファレンス:Document_インターフェイス#ReadOnly プロパティ|ReadOnly]] = true;''' :: コマンドラインオプション <u>Mery.exe '''/r''' </u> ::書き換え禁止に設定します。 <br> * document.'''[[マクロリファレンス:Document_インターフェイス#Mode_プロパティ|Mode]] = "ModeName";''' :: コマンドラインオプション <u>Mery.exe '''/m''' ''"ModeName"'' </u> ::編集モードを指定します。 <br> * document.'''[[マクロリファレンス:Document_インターフェイス#Encoding_プロパティ|Encoding]] = nnnn;''' :: コマンドラインオプション <u>Mery.exe '''/cp''' ''Encoding'' </u> ::エンコードをエンコード定数で定義されている数値で指定します。 <br> ''ref.'' [[マクロリファレンス:エンコード定数]] <br> * document.'''selection.[[マクロリファレンス:Selection_インターフェイス#SetActivePoint_メソッド|SetActivePoint]]( mePosLogical, x, y );''' :: カーソル位置を設定します。 :* コマンドラインオプション <u>Mery.exe '''/l''' ''LineNumber'' </u> ::行(論理座標)に移動します。 ※マクロ上では "y" に行番号(1~ )で指定 :* コマンドラインオプション <u>Mery.exe '''/cl''' ''ColumnNumber'' </u> ::桁(論理座標)に移動します。 ※マクロ上では "x" に桁番号(1~ )で指定 = sukemaru 版1 = ファイル名や編集モード名は <u>サンプル</u> ですので、ご利用の環境にあわせて適宜書き換えてください。 * ファイル名は、"ファイル名を小文字で列挙する" パターンと "正規表現で部分一致させる" パターンとを利用できます。 * ファイルパスの「\」記号はふたつ重ね「\\」で記述してください。 * ファイル名の日本語/全角文字の部分はそのまま記述します。 <source lang="javascript" style="height:60em; overflow:auto;"> #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(); } } </source> = Bleat 版 = 設定部分を配列化して管理しやすくした簡易バージョンです。<br> sukemaru版で使えるオプション記述のうち、エンコード指定とカーソル位置の設定には対応していません。 <source lang="javascript"> #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; } } </source> = sukemaru 版2(include版) = ;ダウンロード: 「[[ファイル:編集モードの自動選択(include版).zip]]」 *2019/04/22 更新: :「無題」ドキュメントにはマクロの処理を適用しないように変更。 : マクロを上書き更新する場合は「Main 関数」の部分だけを上書きしてください(「設定」部分のコードには変更なし)。 : おまけマクロを追加(編集モードのプロパティパネルを開く) *2019/04/24 更新: : サブマクロを追加(「ファイルを保存したとき」専用のイベントマクロ) <br> ;イベントマクロ 「ファイルを開いた時」のイベントだけでは、(D&D などで)複数のファイルをまとめて開いたときに "最後のタブ" にしか「編集モードの自動選択(書き換え禁止)」が適用されないようですので、複数ファイル対応版をつくりました。 *<span style="color:#0000c0;"> マクロのカスタマイズダイアログ内の'''イベント'''設定で「'''ファイルを開いた時'''」と「'''文書を閉じた時'''」のふたつにチェックを付けてください。</span> *"すでに開いていたファイルのリスト" をチェックして "新しく開いたファイル" に「編集モードの自動選択(書き換え禁止)」を適用します。そのためには新しいタブを開いたあとの最新のタブの状態ではなく "すでに開いていたタブの状態" が必要になるので、「[[includeライブラリ]]」を利用してファイルリストを外部ファイル(JSON)に保存します。 <br> <div id="注1" class="warningbox"> あらかじめ [[includeライブラリ]] を Macros フォルダに配置してください。 : 外部ファイルの保存場所は Mery\Macros\MacroSettings\編集モードの自動選択.json <br> または %AppData%\Mery\MacroSettings\編集モードの自動選択.json です。 </div> <br> ;仕様上の制限 <span style="color:#c00;"> 外部保存のファイルリスト(JSON)を読み書きをするため、すばやく連続で複数のドキュメントを閉じた場合の動作に不安があります </span> (※「ファイルを開いた時」「文書を閉じた時」に他のイベントマクロも割り当てている場合も動作に不安あり)。 また、Mery ベータ版 2.6.15 以降の「[https://www.haijin-boys.com/software/mery/mery-2-6-15 ワークスペース機能]」でタブを復元したさいは、すべてのタブにたいして「編集モードの自動選択(書き換え禁止)」が適用されます(※ 2.7.0 以降ではさいごのタブにだけは適用されないようです)。 動作確認したかぎりでは #複数のタブを開いていたエディタウインドウを閉じた場合 #ファイルメニューの「すべて閉じる」コマンドを使用した場合 #5つのタブをすばやく連続で閉じた場合 などは問題ないようでしたが、<br> "'''ファイル(タブ)を開くマクロ'''" や "'''タブを閉じるマクロ'''" を使用したときには、このマクロにイベントが渡されないため「編集モードの自動選択(書き換え禁止)」が適用されず、ファイルリストも更新されませんでした。 :また、当方の環境では「ファイルを開いた時」のイベントに「[[バイト数]]」マクロと「[[ファイルのフルパスをコピーして閉じる ]]」マクロも割り当てていますが、エディタの動作が不安定になるような支障をきたすことはないようです(Windows XP SP3, Mery ver 2.6.15 - 2.7.4 (32bit ポータブル))。 ※ 動作速度を優先するために、<span style="color:#c00;">このマクロではファイルの「読み取り専用属性」をチェックしません。</span>「読み取り専用」のファイルに ReadOnly = false; を割り当てないようにしてください。 :「読み取り専用」のファイルの「書き換え禁止」フラグを解除して編集し、上書き保存しようとすると、エラーになります。「[https://www.haijin-boys.com/software/mery/mery-2-6-9#3 バックアップ]」機能を使用している場合、「読み取り専用」のバックアップファイルが作られてしまうためバックアップファイルの上書きができなくなり、以後、元のファイルを再編集・上書き保存する必要があったときにもエラーが発生します。 <b style="color:#c00;"> ※ご利用の環境で Mery の動作が不安定になる場合は、使用を中止し、このマクロを削除してください。 </b> <br> <br> ;ソースコード: 「[[ファイル:編集モードの自動選択(include版).zip]]」(2019/04/24 更新) ---- == メインマクロ == ソースコード内の「ファイル名」や「編集モード名」などは サンプル ですので、ご利用の環境にあわせて適宜書き換えてください。 <source lang="javascript" style="height:80em; overflow:auto;"> #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":[]} */ </source> == サブマクロ == メインマクロだけでは、「無題」ドキュメントに名前を付けて保存したあとに別のタブを 開く/閉じる と、この新規作成・保存したドキュメントはメインマクロの処理対象になり「書き換え禁止」などが適用されることがあるので、それを防ぎます。<br> *<span style="color:#0000c0;"> マクロのカスタマイズダイアログ内の'''イベント'''設定で「'''ファイルを保存したとき'''」にチェックを付けてください。</span> このマクロ自体は「編集モード」や「書き換え禁止」などを変更しません。<br> 「編集モードの自動選択」マクロ(include版)のファイルのリストを更新し、新規保存されたドキュメントを書きくわえます。<br> <source lang="javascript"> #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 ); } </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' ); // Alt + P キーをエミュレート editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 ); // 編集モードの設定ダイアログを開くだけなら、この一行のみでよい </source> == 書き換え禁止 ON/OFF == * [編集]カテゴリのメニュー項目:「書き換え禁止」 ※「無題」ドキュメントを「書き換え禁止」にしないよう変更(2019/04/22 sukemaru) <source lang="javascript"> #title = "書き換え禁止 ON/OFF" #tooltip = "書き換え禁止 ON/OFF" // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",36 if ( document.FullName && ! document.ReadOnly ) document.ReadOnly = true; else document.ReadOnly = false; </source>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク