-
Notifications
You must be signed in to change notification settings - Fork 1
/
ya_hidemaru_snippet.mac
273 lines (230 loc) · 6.85 KB
/
ya_hidemaru_snippet.mac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/* Yet another snippet for hidemaru editor.
(導入方法)
キーアサインして下さい。
(メモ)
・スニペットのコマンド数は16個まで。($0-$15)
設定を変更したらExpandSnippetFile関数中のexecmacroを修正すること。
*/
debuginfo 0;
//
//動作環境を固定化する。
//
setcompatiblemode
0x00000002 | /* 折りたたみを無視してなるべく維持 */
0x00000008 | /* 部分編集を無視してなるべく維持 */
0x00000030 | /* 同じファイルを2つ開くことを禁止する(ジャンプする) */
0x00000200 | /*検索での表示 → 範囲選択*/
0x00002000 | /*貼り付け後のカーソル位置 → 最後に移動 */
0x00020000 ; /*マクロ終了後に検索条件をマクロ実行前と同じに戻します。(V8.20以降) */
disableinvert;
disablebreak;
disablehistory;
////////////////////////////////////////////////////////////////////////////
// グローバル変数
////////////////////////////////////////////////////////////////////////////
$g_internal_sub_dir = "internal";
$g_internal_abs_dir = currentmacrodirectory + "\\" + $g_internal_sub_dir;
execmacro $g_internal_abs_dir + "\\ya_util_get_snippet_dir.mac";
$g_snippets_abs_dir = getresultex(-1);
//long-file-nameのままだと、dengakuのENUMFILE関数で失敗するためshort-path-nameで回避している。
call GetShortPath $g_snippets_abs_dir;
$g_snippets_abs_dir = $$return + "\\";
execmacro $g_internal_abs_dir + "\\ya_util_get_ini_filename.mac";
$g_ini_abs_filename = getresultex(-1);
/*コマンドの引数情報
*/
$g_args[0] = "";
#g_args_num = 0;
$g_args_line="";
$g_snippet_abs_filename="";
disablehistory 0xff;
call CheckEnvironment;
if(##return){
call Main;
call ClearGlovalValue;
}
endmacro;
Main:
call SetGlovalValue;
if(! ##return){
message("setstaticvariableで失敗");
return false;
}
begingroupundo;
call ParseLine;
if(##return){
//ya_match_snippet.mac のディフォルト設定に任せる
$g_snippet_abs_filename = "";
}else{
//パースした結果、空白行の場合
//補完候補をGUIから選択する
call Candidate;
if(! ##return){
return false;
}
//(memo)$g_snippet_abs_filename変数はCandidateラベル中で設定される
}
//ここでdisabledraw処理を行うこと。
//(メモ)main関数前でdisabledraw処理を行うとウインドウが再描画されなくなり、
// Candidate処理でメニューを表示したときにウインドウが黒一色になり見た目が悪い。
disabledraw;
execmacro currentmacrodirectory+"\\"+$g_internal_sub_dir+"\\ya_match_snippet.mac",
$g_args[0],
str(#g_args_num),
$g_snippet_abs_filename;
$$abs_snippet_filename = getresultex(-1);
if("" == $$abs_snippet_filename){
return false;
}
$$run_snippet_mac = $g_internal_abs_dir + "\\ya_expand_snippet.mac";
execmacro $$run_snippet_mac,
$$abs_snippet_filename,
$g_args_line,
str(#g_args_num),
$g_args[0],
$g_args[1],
$g_args[2],
$g_args[3],
$g_args[4],
$g_args[5],
$g_args[6],
$g_args[7],
$g_args[8],
$g_args[9],
$g_args[10],
$g_args[11],
$g_args[12],
$g_args[13],
$g_args[14],
$g_args[15];
##exec_result=##return;
endgroupundo;
if(! ##exec_result){
message("execmacro に失敗しました。\nマクロ名:"+$$run_snippet_mac);
return false;
}
return val(getresultex(-1));
CheckEnvironment:
if(! existfile($g_ini_abs_filename)){
message("(.ini)ファイルが見つかりません。\nファイル名:"+$g_ini_abs_filename);
return false;
}
return true;
/*1行を空白文字列(半角空白)で分割して取り出す。
パース結果は下記グローバル変数へ格納される。
$g_args[];
#g_args_num;
$g_args_line;
2011/11/05 追加:コマンドを除いた一行を$g_args_lineへ格納するようにした。
*/
ParseLine:
//一行の文字列を取得
if(selecting){
$$linetext = gettext2(seltopcolumn,seltoplineno,selendcolumn,selendlineno,1);
}else{
$$linetext = gettext2(0,lineno,linelen2,lineno,1);
}
call TokenizeArg $$linetext;
return ##return;
/*スニペット候補
*/
Candidate:
execmacro currentmacrodirectory+"\\"+$g_internal_sub_dir+"\\ya_input_command_line.mac";
$$result_string=getresultex(-1);
##tab_index=strstr($$result_string,"\t");
if(##tab_index <= 0){
return false;
}
$g_snippet_abs_filename=midstr($$result_string,0,##tab_index);
call GetDirectoryName $g_snippet_abs_filename;
$g_snippet_abs_filename=$$return;
call TokenizeArg midstr($$result_string,##tab_index);
return ##return;
TokenizeArg:
$$linetext = $$1;
call TrimL $$linetext;
$$linetext=$$return;
$$linetext_lt = $$linetext;
call TrimR $$linetext;
$$linetext=$$return;
if($$linetext==""){
return false;
}
call CreateArgs, $$linetext;
//
//$g_args_line 変数の作成
//
$g_args_line = rightstr($$linetext_lt, strlen($$linetext_lt)-strlen($g_args[0]));
call TrimL $g_args_line;
$g_args_line=$$return;
//call DumpArgs;
return true;
/*引数の変数を作る
「#g_args_num, $g_args」のグローバル変数を作る。
*/
CreateArgs:
##num=split($$args,$$1," ");
if(##num==0){
return false;
}
#g_args_num=0;
while(##i < ##num){
if($$args[##i]!=""){
$g_args[#g_args_num] = $$args[##i];
#g_args_num = #g_args_num + 1;
}
##i = ##i + 1;
}
return ;
GetDirectoryName:
/*ディレクトリ名を取得する
"c:\hoge\foo.txt" -> "c:\hoge"
"c:\hoge/foo.bar.txt" -> "c:\hoge"
"foo.txt2 -> ""
*/
##index_yen=strrstr($$1,"\\");
##index_slash=strrstr($$1,"/");
if((##index_yen==-1) && (##index_slash==-1)){
//ディレクトリ区切り無し
return "";
}
if(##index_slash < ##index_yen){
return midstr($$1,0,##index_yen);
}
return midstr($$1,0,##index_slash);
GetShortPath:
$$path=$$1;
##obj=createobject("Scripting.FileSystemObject");
##f = callmethod_returnobj( ##obj, "GetFolder", $$path);
$$ret = getpropstr(##f,"ShortPath");
releaseobject ##f;
releaseobject ##obj;
return $$ret;
SetGlovalValue:
setstaticvariable "yas_root_dir",currentmacrodirectory,1;
setstaticvariable "ini_abs_filename",$g_ini_abs_filename,1;
return result;
ClearGlovalValue:
setstaticvariable "yas_root_dir","",1;
setstaticvariable "ini_abs_filename","",1;
return ;
Trim:
call TrimL, $$1;
call TrimR, $$return;
return $$return;
TrimL: // ホワイトスペース除去
while (unicode(leftstr($$1, 1)) <= ' ' && unicode(leftstr($$1, 1)) > 0) $$1 = rightstr($$1, strlen($$1) - 1);
return $$1;
TrimR:
while (unicode(rightstr($$1, 1)) <= ' ' && unicode(rightstr($$1, 1)) > 0) $$1 = leftstr($$1, strlen($$1) - 1);
return $$1;
DumpArgs:
debuginfo "==== $g_args[] ====";
debuginfo sprintf("#g_args_num=%d",#g_args_num);
##i=0;
while(##i<#g_args_num){
debuginfo sprintf("$g_args[%d]=%s",##i,$g_args[##i]);
##i = ##i + 1;
}
debuginfo sprintf("$g_args_line=%s",$g_args_line);
return ;