「
カッコで囲う
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
=== ソースコード === <syntaxhighlight lang="javascript" style="height:80em; overflow:auto;"> #title = "カッコで囲う2" #tooltip = "選択範囲の各行をカッコで囲う" #icon = "brackets(parenthesis)[3].ico" // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",256 /** * --------------------------------------------------------- * 「カッコで囲う2」マクロ * sukemaru, 2020-06-05 - 2020-06-23 * rev.1 (2020-06-05): クリップボード経由 ⇒ 2020-06-23 廃止 * rev.2 (2020-06-23): 選択範囲の復帰可 / MultiFunction() 関数 * --------------------------------------------------------- * Mery Ver 3.0.1 以降のマルチカーソル(複数選択範囲)に対応 * * 選択範囲内(複数選択可)の各行それぞれをカッコで囲います。 * ※ 選択範囲がないときはカーソル位置(マルチカーソル可)にカッコを挿入します。 * ※ 各選択範囲の末尾の改行は無視します。 */ // ---------- ▼ 設定項目 ▼ ---------- // // ■ カッコを追加した選択範囲を復帰する var restoreSel = true; // (true する / false しない) // ■ 「任意の文字列」で入力した文字列の一時記憶方法 var tagType = 2; // 0 : 一時記憶なし // 1 : タブ(文書)ごとに一時記憶する(Document.Tag) // 2 : ウインドウごとに一時記憶する(Editor.Tag) // 3 : すべてのタブとウインドウ共通で一時記憶する(window.Tag) // ■ カッコ(タグ・記号等の文字列)の種類の定義 // ※ 定義ではカッコの間にドット×3 "..." をはさんでおくこと // ※ "★..." なら前だけ、"...★" なら後ろだけに文字列をつけられる // ※ "" でポップアップメニュー内のセパレータ(横罫線)になる // ( "..." を含まなければセパレータ) var pp = [ "", "(...)", "[...]", "[[...]]", "(\"...\")", "", "\"...\"", " \"...\" ", "'...'", "", "「...」", "『...』", "【...】", "(...)", "", ">> ...", "> ...", "\/\/ ...", "...\t\/\/ ", "\/\* ... \*\/", "", "※...", "・...", "■...", "◆...◆", "", "''...''", "'''...'''", "<code>...</code>", "" ]; // ---------- ▲ 設定項目 ▲ ---------- // var tagKey = "AddBrackets2"; var separator = "..."; var spaceChar = "\u2006_\u2006"; // \u2423 ␣ var d = editor.ActiveDocument; var s = d.selection; var ac = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var flag = d.ReadOnly ? meMenuGrayed : 0; var p, p1, p2; var Split = function( str, sep ) { sep = sep.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ); return RegExp( "([\\s\\S]*?)" + sep + "([\\s\\S]*)", "" ).exec( str ); } var Conv = function( str ) { return str.replace( /[ ]/g, spaceChar ) .replace( /\t/g, "\\t" ) .replace( /\n/g, "\\n" ); }; // ポップアップメニュー var menu = CreatePopupMenu(); menu.Add( "任意の文字列 (&@) ...", 100000, flag ); // 配列内の要素を追加 for ( var i = j = 0, len = pp.length, label; i < len; i ++ ) { // "..." を含まないものはセパレータ if ( ! pp[i] || pp[i] === separator || String( pp[i] ).indexOf( separator ) === -1 ) { menu.Add( "----", 0, meMenuSeparator ); continue; } p = Split( pp[i], separator ); p1 = p[1]; p2 = p[2]; label = ( ! p1 ) ? Conv( p2 ) + " を 後ろ に付加" : ( ! p2 ) ? Conv( p1 ) + " を 先頭 に挿入" : Conv( p1 ) + " ・・・ " + Conv( p2 ) + " で 前後 を囲う"; if ( ! ac[j] ) { j = 0; } label += " (&" + ac[ j ++ ] + ")"; menu.Add( label, i, flag ); } menu.Add( "キャンセル & ", 0 ); if ( flag ) { Status = " ドキュメントは書き換え禁止です。"; } var r = menu.Track( mePosMouse ); Main2: if ( r ) { if ( r === 100000 ) { // 「任意の文字列」 p = Brackets2Prompt( tagType, tagKey ); p1 = p.p1; p2 = p.p2; if ( ! p1 && ! p2 ) { break Main2; } } else { p = Split( pp[r], separator ); p1 = p[1]; p2 = p[2]; } var sx = ScrollX, sy = ScrollY; // マルチカーソル/複数選択に対応 var arg = [ p1, p2, restoreSel ]; // 選択範囲が1つで矩形選択ではないとき if ( ! s.Mode || s.Mode === meModeStream ) { AddBrackets2_Main( arg ); } // 矩形選択または複数選択のとき else { BeginUndoGroup(); AddUndo(); MultiFunction( AddBrackets2_Main, arg ); EndUndoGroup(); } ScrollX = sx; ScrollY = sy; } // Main2: if ( r ) /** * 関数 AddBrackets2_Main( [ p1, p2, restoreSel ] ) * 選択範囲をカッコ p1, p2 で囲う * restoreSel は実行後の選択範囲の復帰を指定する真偽値(設定項目) */ function AddBrackets2_Main( arg ) { var p1 = arg[0]; var p2 = arg[1]; var restoreSel = arg[2]; var d = editor.ActiveDocument; var s = d.selection; var tp = Math.min( s.GetActivePos(), s.GetAnchorPos() ); var ty = s.GetTopPointY( mePosLogical ); var by = s.GetBottomPointY( mePosLogical ); var bx = s.GetBottomPointX( mePosLogical ); var nl = 0; if ( by > ty && bx === 1 ) { by --; nl = 1; s.SetActivePoint( mePosLogical, d.GetLine( by, 0 ).length + 1, by ); s.SetAnchorPos( tp ); } var st = s.Text; // カッコを付加した文字列 var tmp = st.replace( /^.*$/gm, p1 + "$&" + p2 ); if ( st !== tmp ) { // ブックマークを保存 var bmArray = GetBookmark( ty, by ); // カッコを付加した文字列を適用 s.Text = tmp; // ブックマークを復元 RestoreBookmark( ty, by, bmArray ); } s.SetActivePos( tp + tmp.length + nl ); if ( restoreSel ) { s.SetAnchorPos( tp ); } } /** * 関数 GetTag( tagType, tagKey, property ) * 指定された Tag の値を返す */ function GetTag( tagType, tagKey, property ) { try { var obj = ( typeof tagType === "object" ) ? tagType : ( tagType === 1 ) ? editor.ActiveDocument : ( tagType === 2 ) ? editor : ( tagType === 3 ) ? window : window; return ( obj.Tag.Exists( tagKey ) && ( property ? property in obj.Tag( tagKey ) : true ) ) ? property ? obj.Tag( tagKey )[ property ] : obj.Tag( tagKey ) : null; } catch( e ) { Status = e; return null; } } /** * 関数 SetTag( value, tagType, tagKey, property ) * 指定された値を Tag に書き込む */ function SetTag( value, tagType, tagKey, property ) { try { var obj = ( typeof tagType === "object" ) ? tagType : ( tagType === 1 ) ? editor.ActiveDocument : ( tagType === 2 ) ? editor : ( tagType === 3 ) ? window : window; if ( property ) { if ( obj.Tag.Exists( tagKey ) ) { obj.Tag( tagKey )[ property ] = value; } else { obj.Tag( tagKey ) = { property: value }; } } else { obj.Tag( tagKey ) = value; } } catch( e ) { Status = e; } finally { return; } } /** * 関数 Brackets2Prompt( tagType, tagKey ) * 「任意の文字列」コマンド * 開きカッコと閉じカッコ * 入力ダイアログで指定された文字列を返す */ function Brackets2Prompt( tagType, tagKey ) { // 前回使用した文字列があればダイアログの初期値に再利用 var str1 = str2 = ""; if ( tagType && ( t = GetTag( tagType, tagKey, "addStr" ) ) ) { str1 = t.str1; str2 = t.str2; } // 入力ダイアログ var msg = "につける文字列:\t" + "改行 = \\\\\\n ; タブ = \\\\\\t (注:¥記号3つ)"; p1 = Prompt( "前" + msg, str1 ).replace( /\\\\\\t/g, "\t" ) .replace( /\\\\\\n/g, "\n" ); p2 = Prompt( "後ろ" + msg, str2 ).replace( /\\\\\\t/g, "\t" ) .replace( /\\\\\\n/g, "\n" ); if ( ! p1 && ! p2 ) { return { p1: "", p2: "" }; } if ( tagType ) { var value = { str1: p1.replace( /\t/g, "\\\\\\t" ).replace( /\n/g, "\\\\\\n" ), str2: p2.replace( /\t/g, "\\\\\\t" ).replace( /\n/g, "\\\\\\n" ) } SetTag( value, tagType, tagKey, "addStr" ); } return { p1: p1, p2: p2 }; } /** * 関数 GetBookmark( ty, by ) * 指定された範囲のブックマークを収集 */ function GetBookmark( ty, by ) { var bmArray = [], bmY; var s = editor.ActiveDocument.selection; if ( ty < by ) { var anc = s.GetAnchorPos(), act = s.GetActivePos(); if ( ty === 1 ) { s.SetActivePoint( mePosLogical, 1, 2 ); if ( s.PreviousBookmark() ) { bmY = s.GetActivePointY( mePosLogical ); if ( bmY >= ty && bmY <= by ) { bmArray.push( bmY ); } } s.SetActivePos( 0 ); } else { s.SetActivePoint( mePosLogical, 1, ty - 1 ); } while ( s.NextBookmark() ) { bmY = s.GetActivePointY( mePosLogical ); if ( bmY >= ty && bmY <= by ) { bmArray.push( bmY ); } else if ( bmY > by ) { break; } } s.SetActivePos( act ); s.SetAnchorPos( anc ); } return bmArray; } /** * 関数 RestoreBookmark( ty, by, bmArray ) * 指定された範囲のブックマークを復元 */ function RestoreBookmark( ty, by, bmArray, sel ) { var bmCount = bmArray.length; if ( bmCount ) { var s = editor.ActiveDocument.selection; var anc = s.GetAnchorPos(), act = s.GetActivePos(); s.SetActivePoint( mePosLogical, 1, ty ); s.ClearBookmark(); for ( var i = 0; i < bmCount, bmArray[i] <= by; i ++ ) { if ( bmArray[i] < ty ) { continue; } s.SetActivePoint( mePosLogical, 1, bmArray[i], false ); s.SetBookmark(); } if ( sel ) { s.SetActivePos( act ); s.SetAnchorPos( anc ); } } } /** * 関数 MultiFunction( Fn, arg1 ) * マルチカーソル(複数選択範囲)に対応させる * 第1引数: Function; 選択範囲ごとに適用する処理の関数 * 第2引数以降: Function に渡す引数をまとめた配列 */ function MultiFunction( Fn, arg ) { var d = editor.ActiveDocument; var s = d.selection; // 矩形選択範囲は行に分ける s.Mode = meModeMulti; // 選択範囲の座標を取得 var sCount = s.Count; var Sel = []; for ( var i = 0; i < sCount; i ++ ) { Sel[i] = { act: s.GetActivePos( i ), anc: s.GetAnchorPos( i ) }; } // 各選択範囲を処理; for ( var i = 0, diff = 0, dl; i < sCount; i ++ ) { dl = d.TextLength; s.SetActivePos( Sel[i].act + diff ); s.SetAnchorPos( Sel[i].anc + diff ); Fn( arg ); // AddBrackets2_Main() 関数でカッコを追加 // Fn() の残した選択範囲(またはキャレット位置)を回収 Sel[i].act = s.GetActivePos(); Sel[i].anc = s.GetAnchorPos(); diff += d.TextLength - dl; // 文字数の増減量(累積) } // マルチカーソル(複数選択範囲)を復帰 for ( var i = 0; i < sCount; i ++ ) { s.AddPos( Sel[i].anc, Sel[i].act ); } } </syntaxhighlight> <!-- 記 *「引用符を追加/削除」の項目を追加 (2018-10-18 sukemaru) * 終了後の動作コードを変更し、不自然な位置にキャレットが移動する不具合を修正した (2018-10-26 sukemaru) * 選択範囲の外側の引用符の削除に対応。終了時のカーソルの位置、範囲選択の動作を修正 (2019-03-28 sukemaru) *「カッコで囲う2」の項目を追加 (2020-06-23 sukemaru) -->
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク