対応する括弧に移動

提供:MeryWiki
2012年6月22日 (金) 17:42時点におけるAdmin (トーク | 投稿記録)による版 (ページの作成:「対応する括弧に移動します。「shift」変数を「true」に設定した場合は選択しながら移動します。 <source lang="javascript"> // -------...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

対応する括弧に移動します。「shift」変数を「true」に設定した場合は選択しながら移動します。

// -----------------------------------------------------------------------------
// 対応する括弧に移動
//
// Copyright (c) Kuro. All Rights Reserved.
// e-mail: kuro@haijin-boys.com
// 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;


ダウンロード

ファイル:対応する括弧に移動.zip

スポンサーリンク