「
対応する括弧に移動
」を編集中
2019年12月1日 (日) 02:27時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(
→おまけ
)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
<div>__TOC__</div> = Kuro, kurama 版 (2009/08) = * 「shift」変数を「true」に書き換えると、選択しながら移動します。 <source lang="javascript"> // ----------------------------------------------------------------------------- // 対応する括弧に移動 // // Copyright (c) Kuro. All Rights Reserved. // www: http://www.haijin-boys.com/ // Special Thanks for Kurama さん, Take さん // ----------------------------------------------------------------------------- // シフトの状態(オンの場合は選択、オフの場合は移動) var shift = false; // 括弧として認識する文字 var lp = "(<[{「『【("; var rp = ")>]}」』】)"; // 描画停止 Redraw = false; // ステータスバーを消去 Status = ""; with (document.selection) { // カーソル位置を保存 var ax = GetActivePointX(mePosLogical); var ay = GetActivePointY(mePosLogical); // スクロール位置を保存 var sx = ScrollX; var sy = ScrollY; // カーソル位置を復元 SetActivePoint(mePosLogical, ax, ay, false); // 単語を選択 SelectWord(); // 現在位置の括弧を取得 var c1 = Text; // 選択範囲を解除 Collapse(); var l = lp.indexOf(c1); var r = rp.indexOf(c1); var st = 0; if (l > -1) { // 対応する括弧の種類を取得 var c2 = rp.charAt(l); EndOfDocument(true); var s = Text; // カーソル位置を復元 SetActivePoint(mePosLogical, ax, ay, false); // スクロール位置を復元 ScrollX = sx; ScrollY = sy; var x = ax; var y = ay; for (var i = 0; i < s.length; i++) { x++; if (s.charAt(i) == c1) st++; if (s.charAt(i) == c2) st--; if (st == 0) { y = GetActivePointY(mePosLogical); // カーソル位置を復元 SetActivePoint(mePosLogical, ax, ay, false); SetActivePoint(mePosLogical, x, y, shift); // 左に戻る CharLeft(shift, 1); break; } if (s.charAt(i) == "\n") { x = 1; y = GetActivePointY(mePosLogical) + 1; SetActivePoint(mePosLogical, x, y, false); StartOfLine(false, mePosLogical); x = GetActivePointX(mePosLogical); } } } else if (r > -1) { // 対応する括弧の種類を取得 var c2 = lp.charAt(r); CharRight(false, 1); StartOfDocument(true); var s = Text; // カーソル位置を復元 SetActivePoint(mePosLogical, ax, ay, false); // スクロール位置を復元 ScrollX = sx; ScrollY = sy; var x = ax; for (var i = s.length - 1; i >= 0; i--) { x--; if (s.charAt(i) == c1) st++; if (s.charAt(i) == c2) st--; if (st == 0) { y = GetActivePointY(mePosLogical); // カーソル位置を復元 SetActivePoint(mePosLogical, ax, ay, false); SetActivePoint(mePosLogical, x, y, shift); // 右に進む CharRight(shift, 1); break; } if (s.charAt(i) == "\n") { x = 1; y = GetActivePointY(mePosLogical) - 1; SetActivePoint(mePosLogical, x, y, false); EndOfLine(false, mePosLogical); x = GetActivePointX(mePosLogical); } } } else { // 括弧が無い場合は元の位置に戻す SetActivePoint(mePosLogical, ax, ay, false); Status = "カーソル位置に括弧が見つかりませんでした"; } if (st != 0) { SetActivePoint(mePosLogical, ax, ay, false); Status = "対応する括弧が見つかりませんでした"; } } // 描画開始 Redraw = true; </source> <br> = masme 版 = * ステータスバーに括弧間の文字数を表示するようにしました。 * Kuro, kurama 版の不安定な挙動を調整しました。 ** カーソル右側が改行か[EOF]の場合、左側の括弧に反応するのを修正。例外なく右側のみ反応するようにした。 ** 開き括弧の直前ではなく、直後に移動する場合<sup>※</sup>があるのを修正。直前に移動するよう統一した。<br>※カーソル右側が改行か[EOF]の場合。改行をまたぐ移動になる場合。対応する括弧が行頭にある場合。 == 更新履歴 == * 2019/04/12 ** Quit() → break ラベル文に変更。 * 2017/05/27 ** 処理方法を正規表現検索 → 文字列検索に変更し、高速化。 ** 対応する括弧が見つからなかった場合、選択解除する → しない仕様に変更。 * 2014/02/05 ** 初版公開。 == ソースコード == <source lang="javascript"> //■対応する括弧に移動 // 2014/02/05-2019/04/12 //■括弧の定義(0+2n:開き/1+2n:閉じ) var BRACKET = "()<>[]{}「」『』【】()"; //■範囲選択(true:する/false:しない) var SHIFT = false; quit: { var Sel = Document.Selection; var txt = Document.Text; var sPos = Sel.GetActivePos(), ePos = sPos; //カーソル始点, 探索位置&終点 var sBrc = txt.charAt(sPos); //カーソル右側の文字を取得 var iBrc = BRACKET.indexOf(sBrc); if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; } var nest = 1, s, e; if (iBrc % 2) { //◆閉じ括弧の場合、先頭方向へ探す var eBrc = BRACKET.charAt(iBrc-1); //対応する開き括弧を取得 while (nest) { s = txt.lastIndexOf(sBrc,ePos-1); e = txt.lastIndexOf(eBrc,ePos-1); if (e===-1 || ePos<=0) break; if (e<s) {nest++; ePos=s;} else {nest--; ePos=e;} } } else { //◆開き括弧の場合、末尾方向へ探す var eBrc = BRACKET.charAt(iBrc+1); //対応する閉じ括弧を取得 while (nest) { s = txt.indexOf(sBrc,ePos+1); e = txt.indexOf(eBrc,ePos+1); if (e===-1) break; if (s<e && s!==-1) {nest++; ePos=s;} else {nest--; ePos=e;} } } if (nest!==0) { Status = "対応する括弧が見つかりませんでした"; break quit; } Sel.SetActivePos(sPos); Sel.SetActivePos(ePos, SHIFT); Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字"; } </source> <br> = 範囲選択の拡張 = (sukemaru 2019/04/24)<br> [[GetKeyState.exe(キー状態取得実行ファイル)]] を利用して、'''カッコを含めた全体を範囲選択'''、または '''カッコの内側部分だけを範囲選択''' するための追加コードです。<br> [[#masme 版|masme 版]] (2019/04/12) のソースコードに追加コードを挿入してください('''2ヵ所''')。<br><br> <span style="color:#c00;">ツールバーアイコンやメニュー(マクロメニューや右クリックメニュー)からマクロを実行するさいに Ctrl または Shift キーを押しながら実行すると、拡張コードが適用されます。 </span><br> * <kbd>Ctrl</kbd> キーを押しながらマクロを実行した場合には、カッコを含めた全体を範囲選択します。 ::<span style="background:#bfdfff;">【 Ctrl ありでの選択範囲 】</span> → ※カーソルは 開きカッコの左 (選択範囲の先頭) * <kbd>Shift</kbd> キーを押しながらマクロを実行した場合には、カッコの内側部分だけを範囲選択します。 :: 【<span style="background:#bfdfff;"> Shift ありでの選択範囲 </span>】 → ※カーソルは 閉じカッコの左 (選択範囲の末尾) * <kbd>Ctrl</kbd><kbd>Shift</kbd> キー両方が押されている(または両方とも押されていない)場合には、masme 版の設定変数「SHIFT」の true / false で指定された動作をします。 ::<span style="background:#bfdfff;">【 SHIFT=true のばあい </span>】 ※「対応する括弧に移動」を連続で実行(トグル移動)できるよう、拡張機能で範囲選択したあともカーソルは開きカッコか閉じカッコいずれかの「カッコの左」にセットされます。 <br><br> ※ ショートカットキーでマクロを実行する場合、Ctrl キーを含むパターン、Shift キーを含むパターン、Ctrl と Shift 両方を含む(または両方を含まない)パターンのみっつのショートカットキーを登録する必要があります。 すでに masme 版「対応する括弧に移動」マクロにショートカットキーを割り当てて使用している場合、この追加コードを使用するにあたり、ショートカットの再割り当てをしてください。<br> e.g. Ctrl+F9 / Shift+F9 / Ctrl+Shift+F9(または Alt+F9 など) <span style="color:#c00;">※ 外部実行ファイル GetKeyState.exe を2回呼び出すため、拡張コードの処理にはタイムラグが生じます。選択範囲が確定するまで Ctrl または Shift キーを押しっぱなしにしてください。</span><br><br> ※ GetKeyState.exe のダウンロードや導入方法については、マクロライブラリ内の「[[GetKeyState.exe(キー状態取得実行ファイル)]] 」のページへ <br><br> ;追加コード➀<br> 15行目<br> <syntaxhighlight lang="javascript" inline>if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; }</syntaxhighlight><br> の下に'''追加'''する<br> ※「[[#カーソルの右側にカッコがないなら左側のカッコで|カーソルの右側にカッコがないなら左側のカッコで]]」の改造コードと併用する場合は、改造コードの下に挿入してください。 <source lang="javascript"> // ▼ GetKeyState を利用した機能拡張 ▼ // Ctrl / Shift キーの状態を取得 var $ctrl = 0, $shift = 0; var getKeyState = editor.FullName.replace(/mery\.exe$/i,"") + "Macros\\GetKeyState.exe"; var WshShell = new ActiveXObject("WScript.Shell"); $ctrl = WshShell.Run('"' + getKeyState + '" ctrl',0,true); $shift = WshShell.Run('"' + getKeyState + '" shift',0,true); // ▲ GetKeyState を利用した機能拡張 ▲ </source> <br> ;追加コード➁<br> 37行目<br> <syntaxhighlight lang="javascript" inline>Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字";</syntaxhighlight><br> の下に'''追加'''する <source lang="javascript"> // ▼ GetKeyState を利用した機能拡張 ▼ // ※SHIFT 変数による選択範囲を上書きする(SHIFT = false; でも拡張コードでの範囲選択は有効) if ($ctrl || $shift) { var tPos = Math.min(sPos,ePos); var bPos = Math.max(sPos,ePos); // Ctrl キーだけ押し下げ時にはカッコを含めた全体を範囲選択 if ($ctrl>0 && $shift==0) { Sel.SetActivePos(tPos); Sel.SetAnchorPos(bPos+1); } // Shift キーだけ押し下げ時にはカッコの内側だけを範囲選択 else if ($ctrl==0 && $shift>0) { Sel.SetActivePos(bPos); Sel.SetAnchorPos(tPos+1); } } // ▲ GetKeyState を利用した機能拡張 ▲ </source> * 2019/05/12 変数名間違いを修正 sel → Sel (sukemaru) <br><br> = カーソルの右側にカッコがないなら左側のカッコで = (sukemaru 2019/12/01)<br> <span style="color:#c00;">カーソルの右側にカッコがないとき</span> で、左側にカッコがあるなら、そのカッコに対応するカッコに移動します。<br> * <b style="color:#c00;">右側のカッコ優先</b> です。<br> : 移動後は対応する '''カッコの左側''' にカーソルがセットされます(連続で実行しても元のカッコの左側に)。 <br> [[#masme 版|masme 版]] (2019/04/12) のソースコードを以下のとおり書き換えてください。 '''変更箇所''': 15 行目<br> <syntaxhighlight lang="javascript" inline>if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; }</syntaxhighlight><br> をコメントアウトして <source lang="javascript"> // if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; } // ※ 1行 コメントアウト // ▼ カーソルの左側にカッコがある場合に対応 ▼ if (iBrc>-1 && sBrc) { /* empty */ ; } else if (BRACKET.indexOf(txt.charAt(sPos-1))>-1) { sPos = ePos = sPos-1; sBrc = txt.charAt(sPos); iBrc = BRACKET.indexOf(txt.charAt(sPos)); } else { Status = "カーソルの側に括弧がありません"; break quit; } // ▲ カーソルの左側にカッコがある場合に対応 ▲ </source> ※「[[#範囲選択の拡張|範囲選択の拡張]]」コードを併用する場合は、この変更箇所の下に「追加コード①」を挿入してください。 <br><br> == おまけ == [[#masme 版|masme 版]] (2019/04/12) のソースコードに '''カッコの種類を追加''' します。 :※ Mery 本体のオプション機能の「対応する括弧を強調する」には非対応です。 <br> 4 行目<br> <syntaxhighlight lang="javascript" inline>var BRACKET = "()<>[]{}「」『』【】()";</syntaxhighlight><br> の下に追加する <source lang="javascript"> BRACKET += "<>[]{}「」〖〗⦅⦆〈〉《》〚〛〔〕〘〙‹›«»≪≫〝〟‘’“”︵︶︿﹀︽︾︷︸﹁﹂﹃﹄︻︼︹︺"; </source> ※ 左右のカッコのかたち(文字)が異なるペアしか登録できないので、半角二重引用符 <syntaxhighlight lang="javascript" inline> "" </syntaxhighlight> や 半角一重引用符 <syntaxhighlight lang="javascript" inline> '' </syntaxhighlight> などは不可。
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
編集を中止
編集の仕方
(新しいウィンドウで開きます)
スポンサーリンク
案内メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク