Macro/投稿/171

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F171


Top > Macro > 投稿 > 171

#ifや#ifdefに対応する#elseや#endifへジャンプ

  • ページ: Macro/投稿
  • 作者: 671@FC8?
  • カテゴリー: js
  • 投稿日: 2007-05-02 (水) 18:20:42

メッセージ

670 :名無しさん@お腹いっぱい。:2007/04/30(月) 09:28:01 ID:Cvxml3k/0

みんな、やさしいな。 ついでに、「#if」「#ifdef」に対応する 「#else」「#elif」[#endif]にジャンプするマクロ作ってくれ。

671 :名無しさん@お腹いっぱい。:2007/04/30(月) 11:35:28 ID:HASqHr1/0

>>670 キー割り当てし易いように、下方向と上方向の2つに分けた。
下方向にジャンプ
下記を、拡張子 .js で保存

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
main();
function main() {
    var target = false, nest = 1, y = parseInt(ExpandParameter("$y"));
    if(/^\s*#(?:if|ifdef|else|elif)/.test(GetLineStr(0))) target = true;
    GoLineEnd();
    do {
        SearchNext("^\\s*#(?:if|ifdef|else|elif|endif)",2+4+16);
        if(parseInt(ExpandParameter("$y"))==y || target==false) break;
        y = parseInt(ExpandParameter("$y"));
        if(/^\s*#(?:if|ifdef)/.test(GetLineStr(0))) nest++;
        else if(nest==1) nest--;
        else nest -= /^\s*#endif/.test(GetLineStr(0)) ? 1 : 0
    } while(nest > 0);
    CancelMode();
    SearchClearMark();
    CurLineCenter();
}

上方向にジャンプ
下記を、拡張子 .js で保存

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
main();
function main() {
    var target = false, nest = 1, y = parseInt(ExpandParameter("$y"));
    if(/^\s*#(?:else|elif|endif)/.test(GetLineStr(0))) target = true;
    GoLineTop(1);
    do {
        SearchPrev("^\\s*#(?:if|ifdef|else|elif|endif)",2+4+16);
        if(parseInt(ExpandParameter("$y"))==y || target==false) break;
        y = parseInt(ExpandParameter("$y"));
        if(/^\s*#endif/.test(GetLineStr(0))) nest++;
        else if(nest==1) nest--;
        else nest -= /^\s*#(?:if|ifdef)/.test(GetLineStr(0)) ? 1 : 0
    } while(nest > 0);
    CancelMode();
    SearchClearMark();
    CurLineCenter();
}

683 :670:2007/04/30(月) 20:35:42 ID:Cvxml3k/0

さんきゅー。本当に作ってくれるとは。 でも少しバグが。。

#ifdef A
#ifdef B
#endif
#else
#endif

「#ifdef B」の行で下方向検索したら、 そのまま「#else」にいっちゃったわ。

684 :名無しさん@お腹いっぱい。:2007/04/30(月) 21:41:33 ID:HASqHr1/0

>>683 こちらでは、ちょっとバグの再現ができないです。正常動作。

仕様として、#endifの行で下検索すると、現在のステートメントの終わりなのが明らかなので 下方向に一番近い次の要素にジャンプさせてます。 同様に、#if #ifdef の行で上検索した場合も同じです。

なので、#ifdef B の行から、2回実行すると #else へ行くはずだけど・・・それとは別ですか?

687 :670:2007/04/30(月) 22:28:23 ID:Cvxml3k/0

>684 そうそう。その現象。 ごめん。そういう仕様で作ったんだね。

同じネストは循環する仕様が良かったんよ。 ややこしそうだが解析して改造してみるわ。

692 :名無しさん@お腹いっぱい。:2007/05/01(火) 19:14:32 ID:S3Dt/FtQ0

度々すんません。

>>687 下方向。(改良版) ネスト内でのみ動作します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
var target = false, nest = 1, y = ExpandParameter("$y"), yy = parseInt(y);
if(/^\s*#endif/.test(GetLineStr(0))) {
    GoLineTop(1);
    do {
        SearchPrev("^\\s*#(?:if|ifdef|else|elif|endif)",2+4+16);
        if(ExpandParameter("$y")==y) break;
        y = ExpandParameter("$y");
        if(/^\s*#endif/.test(GetLineStr(0))) nest++;
        else if(/^\s*#(?:if|ifdef)/.test(GetLineStr(0))) nest--;
    } while(nest > 0);
}
else {
    GoLineEnd();
    do {
        SearchNext("^\\s*#(?:if|ifdef|else|elif|endif)",2+4+16);
        if(ExpandParameter("$y")==y) break;
        y = ExpandParameter("$y");
        if(/^\s*#(?:if|ifdef)/.test(GetLineStr(0))) nest++;
        else if(nest==1 || /^\s*#endif/.test(GetLineStr(0))) nest--;
    } while(nest > 0);
}
if(nest > 0) Jump(yy,1);
CancelMode();
SearchClearMark();
CurLineCenter();

上方向。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
var target = false, nest = 1, y = ExpandParameter("$y"), yy = parseInt(y);
if(/^\s*#(?:if|ifdef)/.test(GetLineStr(0))) {
    GoLineEnd();
    do {
        SearchNext("^\\s*#(?:if|ifdef|else|elif|endif)",2+4+16);
        if(ExpandParameter("$y")==y) break;
        y = ExpandParameter("$y");
        if(/^\s*#(?:if|ifdef)/.test(GetLineStr(0))) nest++;
        else if(/^\s*#endif/.test(GetLineStr(0))) nest--;
    } while(nest > 0);
}
else {
    GoLineTop(1);
    do {
        SearchPrev("^\\s*#(?:if|ifdef|else|elif|endif)",2+4+16);
        if(ExpandParameter("$y")==y) break;
        y = ExpandParameter("$y");
        if(/^\s*#endif/.test(GetLineStr(0))) nest++;
        else if(nest==1 || /^\s*#(?:if|ifdef)/.test(GetLineStr(0))) nest--;
    } while(nest > 0);
}
if(nest > 0) Jump(yy,1);
CancelMode();
SearchClearMark();
CurLineCenter();


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2007-05-02 (水) 18:20:42 (4187d)