[要望]カーソルの括弧間移動

  1. カーソルの括弧[], (), {}等の移動がショートカットキーで出来ればうれしかなと思っております

    是非、前向きな検討宜しくお願いします。

     |  take  |  返信
  2. 対応するカッコに移動する機能ですね。私は1度も使ったことがなかったので搭載してませんが、
    マクロでも実現できそうですね。

    標準で搭載するかどうかは検討するとして、ひとまずマクロでも組んでみようかと思います。

     |  Kuro  |  返信
  3. ども、初めまして。
    マクロで、作ってみました。
    こんな感じでどうでしょうか?

    //----------------------------------------------ここからファイル
    // -----------------------------------------------------------------------------
    // 対応する括弧に移動.js
    //
    // Written By KURAMA at 2009/08/03
    // -----------------------------------------------------------------------------

    //
    // 処理の流れ
    //
    // 1, 選択文字列が2文字以上の場合処理を行わない
    // 2, カーソルの前後に、括弧があるかどうか判定する(前優先)
    // 3, 対応する括弧に移動する
    // 4, 対応する括弧がない場合には元の位置にカーソルを戻す
    //

    var CaseArcArray = new Array(
    new Array("{", "}")
    ,new Array("(", ")")
    ,new Array("[", "]")
    //,new Array("「", "」")
    );

    var OPEN_CASEARC = 1;
    var CLOSE_CASEARC = 2;

    function moveToCaseArc(){
    //現在の位置を取得する
    var pos0_x = Document.Selection.GetActivePointX(mePosLogical );
    var pos0_y = Document.Selection.GetActivePointY(mePosLogical );

    //CaseArc0[0] : 現在の場所にある括弧
    //CaseArc0[1] : 対応する括弧
    //OpenOrClose : 現在の場所にある括弧が開き括弧か閉じ括弧か
    var CaseArc0 = new Array();
    var OpenOrClose;

    //カーソルの前後に、括弧があるかどうかを判定する
    //カーソルの前を優先させる
    var count;
    for(count = 0; count < 2 ; count++){
    Document.Selection.CharLeft(true , 1);
    var frontChar = Document.Selection.Text;

    for( var i = 0; i < CaseArcArray.length; i++){
    if( frontChar == CaseArcArray[i][0]){
    //開き括弧があった場合
    CaseArc0.push(CaseArcArray[i][0]);
    CaseArc0.push(CaseArcArray[i][1]);
    OpenOrClose = OPEN_CASEARC;
    break;
    }else if(frontChar == CaseArcArray[i][1]){
    //閉じ括弧があった場合
    CaseArc0.push(CaseArcArray[i][1]);
    CaseArc0.push(CaseArcArray[i][0]);
    OpenOrClose = CLOSE_CASEARC;
    break;
    }
    }
    //2回目の処理は、右側の文字取得するためにいったん
    //2回右に移動してから、次の処理を行う
    Document.Selection.CharRight(false , 2);
    }

    //前後に括弧がなかった場合には処理をしないで終了する
    if(CaseArc0.length == 0 ){
    return 1;
    }

    var findSuccess = false;
    var findFlag;
    var findCaseArc;
    var counter = 0;
    var serchRegString = "[\\" + CaseArc0[0] + "\\" + CaseArc0[1] + "]";

    if(OpenOrClose == OPEN_CASEARC){
    findFlag = meFindNext | meFindReplaceRegExp;
    }else if(OpenOrClose == CLOSE_CASEARC){
    findFlag = meFindPrevious | meFindReplaceRegExp;
    }

    while(Document.Selection.Find(serchRegString, findFlag )){
    if(Document.Selection.Text == CaseArc0[1]){
    if(counter == 0){
    Document.Selection.Collapse();
    findSuccess = true;
    break;
    }else{
    counter -= 1;
    }
    }else{
    counter += 1;
    }
    }

    if(findSuccess == false){
    Document.Selection.SetActivePoint(mePosLogical , pos0_x, pos0_y, false);
    return 2;
    }

    return 0;
    }

    //メインの処理はここから
    //選択文字列が1文字以下の場合のみ処理を行います
    if(Document.Selection.Text.length <= 1){
    moveToCaseArc();
    }
    //----------------------------------------------ここまでファイル

     |  kurama  |  返信
  4. はじめまして。

    うおっ、、、マクロができてる、、、すごいです!
    これは大作ですね、、、ちゃんと動作しました。

    あと、バージョン1.0.5 からですが、
    マクロの最初に「window.Redraw = false;」と、マクロの最後に「window.Redraw = true;」を
    入れとけば描画を抑制できますのでマクロ実行中の微妙なカーソル移動を隠すことができます。

    Mery's Factory の方にもぜひ載せたいです!

     |  Kuro  |  返信
  5. 本要望をさせて頂きました take です。

    kuramaさん、マクロ作成ありがとうございます。
    作って頂いて言うのも何なんですが、
    括弧が入れ子で複数ある場合、どうも上手く動かないような・・・

    じつは、こんな使い方がしたくて・・・
    1.入れ子になっている括弧の対側の括弧に移動(逆も可)
    2.また、これをショートカットキーに登録して(出来る?)、
     シフト+ショートカットキーで括弧間の選択

    2項が出来れば、例えば長いソースのある括弧間だけ
    コピペが簡単に出来て、重宝するのですが。

    以上。宜しくお願いします。m(__)m

     |  take  |  返信
  6. 度々 take です。

    「どうも上手く動かないような・・・」と書きましたが
    少し語弊がありました。済みません。

    作って頂いたマクロはよく出来ていますが、
    私のイメージしたのと少し違うということでした。

    作って頂いたマクロを続けて実行すると、入れ子が複数の場合、
    カーソルの前方向の括弧を優先して検索していき、
    (続けて実行すると)入れ子の外方向へカーソルが移動していくのですね。

    私のイメージはマクロを実行すると、
    まず括弧の対側へ移動し、続けて実行すると、
    元の括弧に戻るものをイメージしていました。

     |  take  |  返信
  7. ども、こんばんわ!

    kuramaさんのマクロを元にカスタマイズしてみました。
    takeさんの想定する動作を再現したつもりですが、、、お試しあれ。
    Mery's Factoryのマクロライブラリに登録してます。
    シフトキーとのあわせワザまわりでご不明な点があれば書き込みくださいまし。

     |  Kuro  |  返信
  8. なんか、立派なマクロになりましたね。
    画面の描画が抑制できるのは、すてきですね。

     |  kurama  |  返信
  9. takeです。

    kuramaさんが仰るように、本当に立派で素敵なマクロですね。

    私は shift = true; で使わせて頂きます。

    Kuroさん、kuramaさん、大変ありがとうございました。m(_ _)m

     |  take  |  返信
  10. ども、こんばんは!

    > 私は shift = true; で使わせて頂きます。

    shift = true; のバージョンと、もうひとつマクロをコピーして、shift = false; のモノを作成して、CTRL + [ の場合と、CTRL + SHIFT + [ などに
    割り当てておけば、両方に対応できるかと思います。

    実際のところ、対応するカッコに移動する機能って多くのテキストエディタに搭載されてますので、標準機能で搭載しても良いかなと思っていたのですが、
    マクロでもできそうだったので作ってみました。そのうち、標準機能になっちゃうかもしれませんが・・・w

    今後の課題といたします。大変参考になるご要望ありがとうございました!

     |  Kuro  |  返信
  11. ども、ども。take です。

    > shift = true; のバージョンと、
    > もうひとつマクロをコピーして、shift = false; のモノを作成して、
    > CTRL + [ の場合と、CTRL + SHIFT + [ などに割り当てておけば、
    > 両方に対応できるかと思います。

    あれ???複数のマクロに対して、別々のショートカットキーを
    割り当てることが出来るんですか?
    (私はMeryでは共通的にマクロ->実行に対して、
    F2とは別にキーを割り当てることが出来るのは
    理解しておりましたが・・・)

     |  take  |  返信
  12. > あれ???複数のマクロに対して、別々のショートカットキーを
    > 割り当てることが出来るんですか?
    マクロ個別にショートカットキーを設定可能ですよ。
    ツール>オプション>キーボード から任意のキーボードショートカットを割り当てることができますが、
    ここで 分類 のプルダウンから マイマクロ を選択してみてください。
    コマンド部分に、Meryに登録してあるマクロが出てくると思います。

     |  noon  |  返信
  13. noon さん、ご対応ありがとうございます!
    帰省中の身なもので、なかなかパソコンを触る機会がなくて、、、とても助かります。

    明日から盆で田舎(パソコンすら存在しない山奥)に行きますので、完全に音信不通になってしまします。
    ごめんなさい。。。

     |  Kuro  |  返信
スポンサーリンク