「対応する括弧に移動」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし |
|||
187行目: | 187行目: | ||
<span style="color:#c00;">ツールバーアイコンやメニュー(マクロメニューや右クリックメニュー)からマクロを実行するさいに Ctrl または Shift キーを押しながら実行すると、拡張コードが適用されます。 </span><br> | <span style="color:#c00;">ツールバーアイコンやメニュー(マクロメニューや右クリックメニュー)からマクロを実行するさいに Ctrl または Shift キーを押しながら実行すると、拡張コードが適用されます。 </span><br> | ||
* Ctrl キーを押しながらマクロを実行した場合には、カッコを含めた全体を範囲選択します。 | * <kbd>Ctrl</kbd> キーを押しながらマクロを実行した場合には、カッコを含めた全体を範囲選択します。 | ||
: → <span style="background:#bfdfff;">【 Ctrl ありでの選択範囲 】</span> | : → <span style="background:#bfdfff;">【 Ctrl ありでの選択範囲 】</span> | ||
* Shift キーを押しながらマクロを実行した場合には、カッコの内側部分だけを範囲選択します。 | * <kbd>Shift</kbd> キーを押しながらマクロを実行した場合には、カッコの内側部分だけを範囲選択します。 | ||
: → 【<span style="background:#bfdfff;"> Shift ありでの選択範囲 </span>】 | : → 【<span style="background:#bfdfff;"> Shift ありでの選択範囲 </span>】 | ||
* Ctrl | * <kbd>Ctrl</kbd><kbd>Shift</kbd> キー両方が押されている(または両方とも押されていない)場合には、masme 版の設定変数「SHIFT」の true / false で指定された動作をします。 | ||
: → <span style="background:#bfdfff;">【 SHIFT=true のばあい </span>】 | : → <span style="background:#bfdfff;">【 SHIFT=true のばあい </span>】 | ||
※「対応する括弧に移動」を連続で実行(トグル移動)できるよう、拡張機能で範囲選択したあともカーソルは開きカッコか閉じカッコいずれかの「カッコの左」にセットされます。 | ※「対応する括弧に移動」を連続で実行(トグル移動)できるよう、拡張機能で範囲選択したあともカーソルは開きカッコか閉じカッコいずれかの「カッコの左」にセットされます。 | ||
203行目: | 203行目: | ||
; | ;追加コード➀<br> | ||
15行目 | |||
if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; } | if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; } | ||
の下に追加する | |||
<source lang="javascript"> | <source lang="javascript"> | ||
// ▼ GetKeyState を利用した機能拡張 ▼ | // ▼ GetKeyState を利用した機能拡張 ▼ | ||
217行目: | 218行目: | ||
</source> | </source> | ||
; | ;追加コード➁<br> | ||
37行目 | |||
Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字"; | Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字"; | ||
の下に追加する | |||
<source lang="javascript"> | <source lang="javascript"> | ||
// ▼ GetKeyState を利用した機能拡張 ▼ | // ▼ GetKeyState を利用した機能拡張 ▼ |
2019年11月16日 (土) 16:23時点における版
Kuro, kurama 版 (2009/08)
- 「shift」変数を「true」に書き換えると、選択しながら移動します。
// -----------------------------------------------------------------------------
// 対応する括弧に移動
//
// 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;
masme 版
- ステータスバーに括弧間の文字数を表示するようにしました。
- Kuro, kurama 版の不安定な挙動を調整しました。
- カーソル右側が改行か[EOF]の場合、左側の括弧に反応するのを修正。例外なく右側のみ反応するようにした。
- 開き括弧の直前ではなく、直後に移動する場合※があるのを修正。直前に移動するよう統一した。
※カーソル右側が改行か[EOF]の場合。改行をまたぐ移動になる場合。対応する括弧が行頭にある場合。
更新履歴
- 2019/04/12
- Quit() → break ラベル文に変更。
- 2017/05/27
- 処理方法を正規表現検索 → 文字列検索に変更し、高速化。
- 対応する括弧が見つからなかった場合、選択解除する → しない仕様に変更。
- 2014/02/05
- 初版公開。
ソースコード
//■対応する括弧に移動
// 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)+"文字";
}
範囲選択の拡張
(sukemaru 2019/04/24)
GetKeyState.exe(キー状態取得実行ファイル) を利用して、カッコを含めた全体を範囲選択、またはカッコの内側部分だけを範囲選択するための追加コードです。
masme 版 (2019/04/12) のソースコードに追加コードを挿入してください(2ヵ所)。
ツールバーアイコンやメニュー(マクロメニューや右クリックメニュー)からマクロを実行するさいに Ctrl または Shift キーを押しながら実行すると、拡張コードが適用されます。
- Ctrl キーを押しながらマクロを実行した場合には、カッコを含めた全体を範囲選択します。
- → 【 Ctrl ありでの選択範囲 】
- Shift キーを押しながらマクロを実行した場合には、カッコの内側部分だけを範囲選択します。
- → 【 Shift ありでの選択範囲 】
- CtrlShift キー両方が押されている(または両方とも押されていない)場合には、masme 版の設定変数「SHIFT」の true / false で指定された動作をします。
- → 【 SHIFT=true のばあい 】
※「対応する括弧に移動」を連続で実行(トグル移動)できるよう、拡張機能で範囲選択したあともカーソルは開きカッコか閉じカッコいずれかの「カッコの左」にセットされます。
- Ctrl → 開きカッコの左 (選択範囲の先頭)
- Shift → 閉じカッコの左 (選択範囲の末尾)
※ ショートカットキーでマクロを実行する場合、Ctrl キーを含むパターン、Shift キーを含むパターン、Ctrl と Shift 両方を含む(または両方を含まない)パターンのみっつのショートカットキーを登録する必要があります。すでに masme 版「対応する括弧に移動」にショートカットキーを割り当てて使用している場合、この追加コードを使用するにあたり、ショートカットの再割り当てをしてください。
e.g. Ctrl+F9 / Shift+F9 / Ctrl+Shift+F9(または Alt+F9 など)
※ 外部実行ファイル GetKeyState.exe を2回呼び出すため、拡張コードの処理にはタイムラグが生じます。選択範囲が確定するまで Ctrl または Shift キーを押しっぱなしにしてください。
※ GetKeyState.exe のダウンロードや導入方法については、マクロライブラリ内の「GetKeyState.exe(キー状態取得実行ファイル) 」のページへ
- 追加コード➀
15行目
if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; }
の下に追加する
// ▼ 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 を利用した機能拡張 ▲
- 追加コード➁
37行目
Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字";
の下に追加する
// ▼ 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 を利用した機能拡張 ▲
- 2019/05/12 変数名間違いを修正 sel → Sel (sukemaru)
スポンサーリンク