「対応する括弧に移動」の版間の差分

提供:MeryWiki
ナビゲーションに移動 検索に移動
(→‎Kuro, Kurama 版: 省略された波括弧の追加)
 
(4人の利用者による、間の20版が非表示)
1行目: 1行目:
<div>__TOC__</div>
== Kuro, Kurama ==
 
= Kuro, kurama (2009/08) =
* 「shift」変数を「true」に書き換えると、選択しながら移動します。
* 「shift」変数を「true」に書き換えると、選択しながら移動します。


<source lang="javascript">
<syntaxhighlight lang="javascript">
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// 対応する括弧に移動
// 対応する括弧に移動
//
//
// Copyright (c) Kuro. All Rights Reserved.
// Copyright (c) Kuro. All Rights Reserved.
// www:    http://www.haijin-boys.com/
// www:    https://www.haijin-boys.com/
// Special Thanks for Kurama さん, Take さん
// Special Thanks for Kurama さん, Take さん
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
54行目: 52行目:
     for (var i = 0; i < s.length; i++) {
     for (var i = 0; i < s.length; i++) {
       x++;
       x++;
       if (s.charAt(i) == c1)
       if (s.charAt(i) == c1) {
         st++;
         st++;
       if (s.charAt(i) == c2)
      }
       if (s.charAt(i) == c2) {
         st--;
         st--;
      }
       if (st == 0) {
       if (st == 0) {
         y = GetActivePointY(mePosLogical);
         y = GetActivePointY(mePosLogical);
89行目: 89行目:
     for (var i = s.length - 1; i >= 0; i--) {
     for (var i = s.length - 1; i >= 0; i--) {
       x--;
       x--;
       if (s.charAt(i) == c1)
       if (s.charAt(i) == c1) {
         st++;
         st++;
       if (s.charAt(i) == c2)
      }
       if (s.charAt(i) == c2) {
         st--;
         st--;
      }
       if (st == 0) {
       if (st == 0) {
         y = GetActivePointY(mePosLogical);
         y = GetActivePointY(mePosLogical);
122行目: 124行目:
// 描画開始
// 描画開始
Redraw = true;
Redraw = true;
</source>
</syntaxhighlight>


= masme 版 =
== Masme ==
* ステータスバーに括弧間の文字数を表示するようにしました。
* ステータスバーに括弧間の文字数を表示するようにしました。
* Kuro, kurama 版の不安定な挙動を調整しました。
* Kuro, kurama 版の不安定な挙動を調整しました。
130行目: 132行目:
** 開き括弧の直前ではなく、直後に移動する場合<sup>※</sup>があるのを修正。直前に移動するよう統一した。<br>※カーソル右側が改行か[EOF]の場合。改行をまたぐ移動になる場合。対応する括弧が行頭にある場合。
** 開き括弧の直前ではなく、直後に移動する場合<sup>※</sup>があるのを修正。直前に移動するよう統一した。<br>※カーソル右側が改行か[EOF]の場合。改行をまたぐ移動になる場合。対応する括弧が行頭にある場合。


== 更新履歴 ==
=== 更新履歴 ===
* 2019/04/12
; 2019/04/12
** Quit() → break ラベル文に変更。
* Quit() → break ラベル文に変更。
* 2017/05/27
; 2017/05/27
** 処理方法を正規表現検索 → 文字列検索に変更し、高速化。
* 処理方法を正規表現検索 → 文字列検索に変更し、高速化。
** 対応する括弧が見つからなかった場合、選択解除する → しない仕様に変更。
* 対応する括弧が見つからなかった場合、選択解除する → しない仕様に変更。
* 2014/02/05
; 2014/02/05
** 初版公開。
* 初版公開。


== ソースコード ==
=== ソースコード ===
<source lang="javascript">
<syntaxhighlight lang="javascript">
//■対応する括弧に移動
//■対応する括弧に移動
// 2014/02/05-2019/04/12
// 2014/02/05-2019/04/12
179行目: 181行目:
Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字";
Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字";
}
}
</source>
</syntaxhighlight>
 
= 範囲選択の拡張 =
(sukemaru 2019/04/24)<br>
[[GetKeyState.exe(キー状態取得実行ファイル)]] を利用して、'''カッコを含めた全体を範囲選択'''、または'''カッコの内側部分だけを範囲選択'''するための追加コードです。
 
[[#masme 版|masme 版]] (2019/04/12) のソースコードに追加コードを挿入してください('''2ヵ所''')。
 
* Ctrl キーを押しながらマクロを実行した場合には、カッコを含めた全体を範囲選択します。
* Shift キーを押しながらマクロを実行した場合には、カッコの内側部分だけを範囲選択します。
* Ctrl, Shift キー両方が押されている(または両方とも押されていない)場合には、masme 版の設定変数「SHIFT」の true / false で指定された動作をします。
: ※「対応する括弧に移動」を連続で実行(トグル移動)できるよう、拡張機能で範囲選択したあともカーソルは開きカッコか閉じカッコいずれかの「カッコの左」にセットされます。
 
※ツールバーアイコンやメニュー(マクロメニューや右クリックメニュー)からマクロを実行するさいに Ctrl または Shift キーを押しながら実行すると、拡張コードが適用されます。<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>
※GetKeyState.exe のダウンロードや導入方法については、マクロライブラリ内の「[[GetKeyState.exe(キー状態取得実行ファイル)]] 」のページへ
 
 
;追加コード①
if (iBrc===-1 || sBrc==="") { Status = "カーソル右側に括弧がありません"; break quit; }
の行の下に追加する
<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>
 
;追加コード②
Status = "対応する括弧の距離: "+(Math.abs(ePos - sPos)-1)+"文字";
の行の下に追加する
<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>

2023年10月20日 (金) 13:54時点における最新版

Kuro, Kurama 版[編集]

  • 「shift」変数を「true」に書き換えると、選択しながら移動します。
// -----------------------------------------------------------------------------
// 対応する括弧に移動
//
// Copyright (c) Kuro. All Rights Reserved.
// www:    https://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)+"文字";
}
スポンサーリンク