第III部〜秀丸マクロのいろはにほへと
秀丸エディタウィンドウの管理(タブモード編)
●秀丸エディタウィンドウの管理(タブモード編)
秀丸エディタ Ver.4.10以降から、「タブモード」が追加されています。 タブを含むウィンドウを複数表示する事も可能です。(タブグループ)
「タブモード」に変更すると、
秀丸エディタのウィンドウ操作 → タブ操作
になります。
- 秀丸エディタウィンドウを開く→ タブでひらく
- 秀丸エディタウィンドウを閉じる → タブを閉じる
- 秀丸エディタウィンドウを切り替える → タブを切り替える
「開く」、「閉じる」、「切り替える」に関しては、秀丸エディタウィンドウ操作と同じコマンドを使います。
基本操作は秀丸エディタウィンドウと同じですが、タブ、タブグループに関するキーワード、コマンドが追加されています。 タブの操作に関しては、追加されたコマンドを使用する事になります。
タブ関連マクロ命令の使い方に関しては、マクロヘルプ- 秀丸エディタ管理(タブ編) に例があるので参考にしてください。
- 注意
- タブに関する各種コマンドを使う場合は、必ず「タブモード」になっている事を確認してから使用する事。 ウィンドウモードで、タブ関連のコマンドを使用しても期待する動作にならない場合があります。
【1】タブグループ
タブをまとめているタブグループに関する内容です。
タブグループを調べるには2つのキーワードがあります。
- tabgroup
- グループIDを表します。タブグループに与えられる固有の識別番号です。 通常、0 から順番に割り当てられていますが、タブグループを閉じたりすると飛び飛びの番号になったりもします。 自分自身は 0 とは限りません。
- tabgrouporder
- タブグループの表示されている順番を表します。(自分自身は 0 になります。) タブグループの順番が変わるとこの値も変化します。
状況にもよりますが、tabgrouporder(順番) は、操作すると変化してしまう場合もあるので、 tabgroup(グループID) を使ったほうがいいでしょう。
どちらのキーワードも角カッコで添え字を付けて、他の秀丸エディタからも値を得ることができます。 (ウィンドウハンドルさえわかれば、どちらも取得可能。)
#id = tabgroup[hidemaruhandle(1)];
#oder = tabgrouporder[hidemaruhandle(1)];
タブグループの数は、tabgrouptotal
キーワードで取得できます。
[1-1] 新しいタブグループを作る
新しいタブグループを作る方法は二つあります。
- 既存のタブグループから分離する
- ファイルを開く時に、新しいタブグループで開く
まず、既存のタブグループから分離するには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;
//タブグループが1つなら終了
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;
状態のチェックを行い、タブグループが一つだけなら終了します。
tabgrouporderは、自分は0なので、順次加算して(2番目から順番に)チェックしていきます。
getcurrenttab
は、タブグループ内の選択されているタブのウィンドウハンドルを調べる命令です。 第1引数で、第2引数の意味を切り替えています。今回は タブグループの順番tabgrouporder
を使用するので、第1引数:true 第2引数:調べるタブグループの順番
を指定します。
ウィンドウハンドルから表示状態をチェックし、最小化していなければ、
setactivehidemaru
でアクティブなウィンドウ(タブグループ)を切り替えます。 (タブグループの切り替えに、nexthidemaru
、prevhidemaru
を使わないのは、 「タブの切り替え」になってしまうからです。)
「前のタブグループ」へ移動するマクロ
//「前のタブグループ」
//タブモードでなければ、前の秀丸エディタへ
if(tabmode == 0){
prevhidemaru;
endmacro;
}
//タブグループの数
#max = tabgrouptotal;
//タブグループが1つなら終了
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)からチェックしていく事になります。
【2】タブ
タブの操作は、基本的にはウィンドウ操作と同じです。
タブを切り替えるには、次のタブ
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;