※ご大層な名前が付いていますが、単なるサンプルのチュートリアルです。
さっそくサンプルをご覧下さい。
以下のようなファイルがあるとします。
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 |
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 | {
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 ) ){
25 | }else if( IsTooExpensiveValue( itemid, val )){
26 | return false;
27 | }
28 | return true;
29 | }
ちょいと不格好ですが、カーソル位置が含まれる最小範囲のブロックを折りたたんでいます。