＞秀丸マクロのいろはにほへと

# 第III部〜秀丸マクロのいろはにほへと
秀丸エディタウィンドウの管理(タブモード編)

## 秀丸エディタウィンドウの管理(タブモード編)

秀丸エディタ Ver.4.10以降から、「タブモード」が追加されています。タブを含むウィンドウを複数表示できます。(タブグループ)

「タブモード」に変更すると、

    秀丸エディタのウィンドウ操作　→　タブ操作

になります。

- 秀丸エディタウィンドウを開く→ タブでひらく
- 秀丸エディタウィンドウを閉じる → タブを閉じる
- 秀丸エディタウィンドウを切り替える → タブを切り替える

「開く」「閉じる」「切り替える」に関しては、秀丸エディタウィンドウ操作と同じコマンドを使います。

基本操作は秀丸エディタウィンドウと同じですが、タブ/タブグループに関するキーワード コマンド が追加されています。タブの操作に関しては、追加されたコマンドを使用する事になります。

タブ関連マクロ命令の使い方に関しては、マクロヘルプ- 秀丸エディタ管理(タブ編) に例があるので参考にしてください。

注意
  タブに関する各種コマンドを使う場合は、必ず「タブモード」になっている事を確認してから使用する事。ウィンドウモードで、タブ関連のコマンドを使用しても期待する動作にならない場合があります。

- 【１】タブグループ
- 【２】タブ

### 【１】タブグループ

タブをまとめているタブグループに関する内容です。

タブグループを調べるには2つのキーワードがあります。

tabgroup
  グループIDを表します。タブグループに与えられる固有の識別番号です。通常、0 から順番に割り当てられていますが、タブグループを閉じたりすると飛び飛びの番号になったりもします。自分自身は 0 とは限りません。
tabgrouporder
  タブグループの表示されている順番を表します。(自分自身は 0 になる) タブグループの順番が変わると、この値も変化します。

状況にもよりますが、tabgrouporder(順番) は操作すると変化してしまう場合もあるので、 tabgroup(グループID) を使ったほうがいいでしょう。

どちらのキーワードも角カッコで添え字を付けて、他の秀丸エディタからも値を得ることができます。 (ウィンドウハンドルさえわかれば、どちらも取得可能)

    #id   = tabgroup[hidemaruhandle(1)];
    #oder = tabgrouporder[hidemaruhandle(1)];

タブグループの数は、`tabgrouptotal` キーワードで取得できます。

#### [1-1] 新しいタブグループを作る

新しいタブグループを作る方法は2つあります。

- 既存のタブグループから分離する
- ファイルを開く時に、新しいタブグループで開く

まず、既存のタブグループから分離するには`settabgroup`コマンドを使用します。

コマンドの引数には、以下を指定します。

- 移動対象の秀丸エディタを示す、ウィンドウ番号またはウィンドウハンドル
- 分離先のグループID

例えば、編集中の秀丸エディタを、グループID 1 のタブへ分離する場合は以下のようになります。

    // 編集中の秀丸エディタを、グループID 1 のタブへ分離する
    //タブモードでなければ終了
    if(tabmode == false) endmacro;
    settabgroup hidemaruhandle(0), 1;

グループID 1 など既存のタブグループではなく新しいタブグループを作りたい場合は、グループIDに -1 を指定します。

    // 編集中の秀丸エディタを、新しいタブグループに分離する。
    //タブモードでなければ終了
    if(tabmode == false) endmacro;
    settabgroup hidemaruhandle(0), -1;

次に ファイルを開く時に、新しいタブグループで開く には、起動オプション `/i` を指定します。

    // 新しいタブグループでファイルを開く
    openfile "/i \"C:\\My Documents\\memo.txt\"";

新しいタブグループが作成され、ファイルを開きます。

#### [1-2] タブグループ間の移動

残念ながら、タブグループ間を移動する命令は無いためマクロで対応します。 (設定により、タブの移動(次のタブ/前のタブ)でタブグループ間を含む移動は可能になりますが、単純にタブグループだけの移動という命令はない)

例として「次のタブグループ」「次のタブグループ」に移動するマクロを作成します。条件として、最小化しているタブグループには移動しません。

##### 「次のタブグループ」へ移動するマクロ

    //「次のタブグループ」
    //タブモードでなければ、次の秀丸エディタへ
    if(tabmode == 0){
        prevhidemaru;
        endmacro;
    }
    //タブグループの数
    #max = tabgrouptotal;
    //タブグループが１つなら終了
    if(#max == 1)endmacro;

    //tabgrouporderは、自分は0なので、1からチェック開始する。
    #next = 1;

    //タブグループをチェックする
    //切り替えれば終了する
    while(#next < #max){
        //次のオーダーの、アクティブなタブのハンドルを取得
        #nexttabgroup = getcurrenttab( 1, #next);
        //ウィンドウ(タブ)の表示状態を取得
        #state = windowstate[#nexttabgroup];
        //ウィンドウの状態を確認、非表示か最小化以外なら切り替える
        if(#state != 2){
            //タブグループを切り替え。自分自身は一番下に移動
            setactivehidemaru #nexttabgroup, -1;
            //チェックループを抜ける
            break;
        }
        //チェック対象を更新
        #next = #next + 1;
    }
    endmacro;

- 状態のチェックを行い、タブグループが1つだけなら終了します。

- tabgrouporderは、自分は0なので、順次加算して(2番目から順番に)チェックしていきます。

- `getcurrenttab`は、タブグループ内の選択されているタブのウィンドウハンドルを調べる命令です。第1引数で、第2引数の意味を切り替えています。今回は タブグループの順番`tabgrouporder` を使用するので、

      第1引数：true
      第2引数：調べるタブグループの順番

  を指定します。

- ウィンドウハンドルから表示状態をチェックし、最小化していなければ `setactivehidemaru` でアクティブなウィンドウ(タブグループ)を切り替えます。 (タブグループの切り替えに `nexthidemaru` `prevhidemaru` を使わないのは、「タブの切り替え」になってしまうから)

##### 「前のタブグループ」へ移動するマクロ

    //「前のタブグループ」
    //タブモードでなければ、前の秀丸エディタへ
    if(tabmode == 0){
        prevhidemaru;
        endmacro;
    }
    //タブグループの数
    #max = tabgrouptotal;
    //タブグループが１つなら終了
    if(#max == 1)endmacro;

    //tabgrouporderは、自分は0なので、後からチェック開始する。
    #prev = #max - 1;

    //タブグループをチェックする
    //切り替えれば終了する
    while(#prev > 0){
        //下のオーダーの、アクティブなタブのハンドルを取得
        #prevtabgroup = getcurrenttab( 1, #prev);
        //ウィンドウ(タブ)の表示状態を取得
        #state = windowstate[#prevtabgroup];
        //ウィンドウの状態を確認、非表示か最小化以外なら切り替える
        if(#state != 2){
            //タブグループを切り替え。
            setactivehidemaru #prevtabgroup;
            //チェックループを抜ける
            break;
        }
        //チェック対象を更新
        #prev = #prev - 1;
    }
    endmacro;

- 「次のタブグループ」とほぼ同じですが、タブグループのチェック方法が異なります。自分は「0」なので、最後(tabgrouptotal - 1)からチェックしていく事になります。

### 【２】タブ

タブの操作は、基本的にはウィンドウ操作と同じです。

- タブを切り替えるには 「次のタブ( `nexttab`) 」 「前のタブ(`prevtab`)」を使いますが、切り替えの範囲はタブグループ内のみです。

  - 設定により、タブの移動(次のタブ/前のタブ)でタブグループ間を含む移動も可能。
  - タブの移動に `nexthidemaru` `prevhidemaru` も使えますが、切り替えの順番は秀丸エディタ本体の設定に左右されます。
  - 分割したウィンドウの移動に「次のタブ( `nexttab`) 」「前のタブ(`prevtab`)」 は使用できません。

- タブグループ内のタブの数は、`tabtotal` キーワードで取得可能です。

- 自分がタブグループ内の何番目のタブなのかは、`taborder` キーワードで取得可能です。

- タブの位置からウィンドウハンドルを取得するには、`gettabhandle` を使います。

      //自分自身のハンドル
      //本来は、hidemaruhandle(0) でいいが、gettabhandleの例として
      #handle = gettabhandle(1, tabgrouporder, taborder);
      //同じタブグループの右隣のタブのハンドル
      #next = gettabhandle(1, tabgrouporder, taborder + 1);

- タブグループの任意のタブ位置に移動するには、`settaborder`文を使います。自分自身を移動するのではなく、他のファイルを移動する場合は、`gettabhandle` でウィンドウハンドルを取得する事。

      //同じタブグループの右隣のタブを先頭に移動
      #next = gettabhandle(1, tabgrouporder, taborder + 1);
      settaborder #next, 0;

ページトップ 目次に戻る