定義へ移動

提供:MeryWiki
ナビゲーションに移動 検索に移動

概要[編集]

選択した変数の定義部分へ移動します。

機能[編集]

  • C 構文のソースで、変数を選択し実行することでその変数の定義部へジャンプします
  • javascript でも var を使用して宣言しておくことで、検出が可能です

履歴[編集]

  • 2013/10/29 初版

ソースコード[編集]

#title="定義へ移動"
// -----------------------------------------------------------------------------
// 変数定義へジャンプ
// C 構文のソースで、変数を定義している場所にジャンプします。
// javascript でも var で定義されている場合はジャンプできます。
//
// 正確な構文解析をしていないので、誤動作もしますし、次のようなパターンは検出できません。
// ・int a, b; <= これのbは検出不可。aは検出可。
// ・メンバ変数
// ・ブロックによるスコープの違い
// ・コメントやリテラルに含まれる文字列
//
// (C) ks
// http://merysmacro.seesaa.net/
// -----------------------------------------------------------------------------

var doc = Editor.ActiveDocument;
var sel = doc.Selection;
var v = sel.Text;
if (v.length <= 0) {
  // カーソル位置の単語を選択
  sel.SelectWord();
  v = sel.Text;
}
var reg = new RegExp("[a-zA-Z0-9_]+\\*?\\\^?>?\\*?\\^?\\s+\\*?" + v + "[\\[\\(\\s\\n,;=|(/\\*)]");
for (var i = sel.GetActivePointY(mePosLogical)-1; i >=1; i--) {
  var s = doc.GetLine(i, meGetLineWithNewLines);
  if (s.match(reg)) {
    var n = s.indexOf("//");
    if (n >= 0) {
      if (RegExp.index > n) {
        continue;
      }
    }
    if (s.indexOf("return") >= 0) {
      continue;
    }
    if (s.indexOf("delete") >= 0) {
      continue;
    }
    
    reg = new RegExp("\\s+" + v + "[\\[\\s\\n,;=|(/\\*)]");
    s = String(s.match(reg));
    n = s.indexOf(v) + 1 + RegExp.index;
    sel.SetActivePoint(mePosLogical, n, i);
    sel.SetAnchorPoint(mePosLogical, n + v.length, i);
    Status = "";
    Quit();
  }
}

Status = "宣言が見つかりません";
スポンサーリンク