> Home > プログラム > 秀丸マクロなど > 行を折りたたむマクロ StringFolderの動作概説


※ご大層な名前が付いていますが、単なるサンプルのチュートリアルです。

さっそくサンプルをご覧下さい。
以下のようなファイルがあるとします。
 1 | #include <windows>
 2 | #include <stdio>
 3 | 
 4 | bool IsValidItemID(int);
 5 | bool IsDumpingValue(int,int);
 6 | bool IsTooExpensiveValue(int,int);
 7 | 
 8 | struct Item{
 9 |     int itemid;
10 |     const char* itemname;
11 |     int minval;
12 |     int maxval;
13 | } itemlist[] = {{0,"えんぴつ",10,100},{1,"消しゴム",50,200}};
14 | 
15 | int main()
16 | {
17 |     return true;
18 | }
19 | 
20 | bool IsLegalValueRange(int itemid , int val)
21 | {
22 |     if( !IsValidItemID( itemid ) ) return false;
23 |     
24 |     if( IsDumpingValue( itemid, val ) ){
25 |         return false;//ダンピングに引っかかります
26 |     }else if( IsTooExpensiveValue( itemid, val )){
27 |         return false;//不当利益を得ているかも
28 |     }
29 |     return true;
30 | }
22行~28行を範囲選択して「SF_Automatic.mac」を実行してみましょう。
 1 | #include <windows>
 2 | #include <stdio>
 3 | 
 4 | bool IsValidItemID(int);
 5 | bool IsDumpingValue(int,int);
 6 | bool IsTooExpensiveValue(int,int);
 7 | 
 8 | struct Item{
 9 |     int itemid;
10 |     const char* itemname;
11 |     int minval;
12 |     int maxval;
13 | } itemlist[] = {{0,"えんぴつ",10,100},{1,"消しゴム",50,200}};
14 | 
15 | int main()
16 | {
17 |     return true;
18 | }
19 | 
20 | bool IsLegalValueRange(int itemid , int val)
21 | {
22 | //ID<XXXXXXXXXXXXXXX>
23 |     return true;
24 | }
こうなります。
ただし、ID<XXXXXXXXXXXXXXX>のXの部分は毎回生成されますので同じではないはずです。
続きまして、折りたたまれたままではいけませんので、復元をやってみましょう。
22行目を選択してもう一度「SF_Automatic.mac」を実行します。
そうすると、
 1 | #include <windows>
 2 | #include <stdio>
 3 | 
 4 | bool IsValidItemID(int);
 5 | bool IsDumpingValue(int,int);
 6 | bool IsTooExpensiveValue(int,int);
 7 | 
 8 | struct Item{
 9 |     int itemid;
10 |     const char* itemname;
11 |     int minval;
12 |     int maxval;
13 | } itemlist[] = {{0,"えんぴつ",10,100},{1,"消しゴム",50,200}};
14 | 
15 | int main()
16 | {
17 |     return true;
18 | }
19 | 
20 | bool IsLegalValueRange(int itemid , int val)
21 | {
22 |     if( !IsValidItemID( itemid ) ) return false;
23 |     
24 |     if( IsDumpingValue( itemid, val ) ){
25 |         return false;//ダンピングに引っかかります
26 |     }else if( IsTooExpensiveValue( itemid, val )){
27 |         return false;//不当利益を得ているかも
28 |     }
29 |     return true;
30 | }
元に戻りましたね。
これが、一番基本の使い方である、「選択範囲を折りたたむ/復元する」機能です。
これは関数であるないに関わらず何行であってもかまいません。

つづいて、「SF_Automatic.mac」の醍醐味である動作の自動選択に移りましょう。
20行目の行頭「bool」の前にカーソルを動かして、何も選択せずに、実行してみてください。
 1 | #include <windows>
 2 | #include <stdio>
 3 | 
 4 | bool IsValidItemID(int);
 5 | bool IsDumpingValue(int,int);
 6 | bool IsTooExpensiveValue(int,int);
 7 | 
 8 | struct Item{
 9 |     int itemid;
10 |     const char* itemname;
11 |     int minval;
12 |     int maxval;
13 | } itemlist[] = {{0,"えんぴつ",10,100},{1,"消しゴム",50,200}};
14 | 
15 | int main()
16 | {
17 |     return true;
18 | }
19 | 
20 | bool IsLegalValueRange(int itemid , int val)
21 | {//ID<XXXXXXXXXXXXXXX>
22 | }
こうなります。※関数の始まり「{」があまり下の方にあると失敗します。
では、復元はどうでしょう。
さっきと同じ位置(20行目行頭)にカーソルを動かしてもう一度実行してみてください。
元に戻りましたね?

このマクロはカーソル位置などで動作が自動的に変わります。
そしてその判断基準の基本は、「カーソル位置がどのブロックに属するか」です。
どういう事か、実際にやってみましょう。
最初のファイルの25行目の行頭で実行してみてください。
 1 | #include <windows>
 2 | #include <stdio>
 3 | 
 4 | bool IsValidItemID(int);
 5 | bool IsDumpingValue(int,int);
 6 | bool IsTooExpensiveValue(int,int);
 7 | 
 8 | struct Item{
 9 |     int itemid;
10 |     const char* itemname;
11 |     int minval;
12 |     int maxval;
13 | } itemlist[] = {{0,"えんぴつ",10,100},{1,"消しゴム",50,200}};
14 | 
15 | int main()
16 | {
17 |     return true;
18 | }
19 | 
20 | bool IsLegalValueRange(int itemid , int val)
21 | {
22 |     if( !IsValidItemID( itemid ) ) return false;
23 |     
24 |     if( IsDumpingValue( itemid, val ) ){//ID<LR6ONWFMBGM44T4>
25 | }else if( IsTooExpensiveValue( itemid, val )){
26 |         return false;//不当利益を得ているかも
27 |     }
28 |     return true;
29 | }
ちょいと不格好ですが、カーソル位置が含まれる最小範囲のブロックを折りたたんでいます。