このドキュメントではユーザー定義のソースとカインドを作成する方法を説明します。
以下ファイルをもとに改造するのが分かりやすいです。
候補の取得方法 | 定義ファイル(.ini) | マクロ処理(.mac) |
---|---|---|
文字列 | sources\emoji.ini | sources\emoji.mac |
関数 | sources\file_mru.ini | sources\file_mru.mac |
非同期ファイル | sources\file_recursive.ini | sources\file_recursive.mac |
候補の取得方法は用途に合わせて、以下3種類あります。
- 文字列(string)
- 関数(function)
- 非同期ファイル(async_file)
それぞれ以下の特徴があります
候補の取得方法 | 説明 | 容易さ | カスタマイズ | 非同期 |
---|---|---|---|---|
文字列 | 候補を文字列で設定します | ○ | × | × |
関数 | 候補を関数で設定します、候補を細かくカスタマイズできます | × | ○ | × |
非同期ファイル | 全候補を取得するのに時間がかかる場合に利用します。 | × | × | ○ |
候補を集める重要な箇所だけかいつまんで載せています、実際の記述はそれぞれのファイルを参照してください。
- 秀丸マクロは90年代に作られたマクロなので現代とは大分雰囲気が異なります。
- dllfuncw命令はDLLを呼び出す秀丸マクロの命令です、
emoji.ini
[property]
description=絵文字
default_kind=common
;候補を文字列で返す
candidate_type=string
emoji.mac
//候補をタブ(\t)区切りの文字列で返します
gather_candidates:
return @"😀 @description grinning face U+1F600
😃 @description grinning face with big eyes U+1F603
😄 @description grinning face with smiling eyes U+1F604
😁 @description beaming face with smiling eyes U+1F601
😆 @description grinning squinting face U+1F606
😅 @description grinning face with sweat U+1F605
🤣 @description rolling on the floor laughing U+1F923";
@descriptionはinternal.md -> 候補のフォーマットについてを参照してください。
file_mru.ini
[property]
description=ファイル履歴
default_kind=file_mru
;候補を関数で設定する
candidate_type=function
file_mru.mac
gather_candidates:
/*候補を関数で設定する
返値 "1" 成功
"0" 失敗
*/
//ファイル履歴の個数(filehistcount)だけループを回す
##i=0;
while(##i < filehistcount){
//候補の文字列を追加する
$$file_name=getfilehist(##i);
##success=dllfuncw(#g_dll_ohtorii_tools, "AppendCandidate", $$file_name,"");
if(! ##success){
return "0";
}
//候補のファイル名を設定する
##success=dllfuncw(#g_dll_ohtorii_tools, "SetCandidateActionFileName", $$file_name);
if(! ##success){
return "0";
}
//ファイル履歴の削除時に、ファイル履歴のインデックスが必要となるので、
//ファイル履歴のインデックス(##i)をユーザーデータで覚えておく。
##success = dllfuncw(#g_dll_ohtorii_tools,"SetCandidateUserDataNumeric","file_history_index",##i);
if(! ##success){
return "0";
}
##i = ##i + 1;
}
return "1";
file_recursive.ini
[property]
description=カレントディレクトリ以下のファイル一覧(再帰)
default_kind=file
;候補を非同期ファイルで返す
candidate_type=async_file
file_recursive.mac
gather_candidates:
$$root_dir=$$1;
if($$root_dir==""){
//カレントディレクトリを使用する
$$root_dir=".";
}
/*候補を非同期で追記する一時ファイル名を作る。
*/
execmacro $g_root_macro_directory+"\\internal\\create_temp_file.mac", "filerec", ".tsv";
$$temp_filename=getresultex(-1);
if($$temp_filename==""){
return "";
}
/*一時ファイルをUnityマクロ終了時に削除するため、一時ファイル名を登録する。
*/
##ret=dllfuncw(#g_dll_ohtorii_tools,"FileRegistAfterDeleteFile",$$temp_filename);
if(! ##ret){
return "";
}
/* memo
\で終端しているディレクトリ名をダブルクォーテーションで囲ってコマンドライン引数で渡すときの対策。
*/
call remove_terminate $$root_dir;
$$root_dir=$$return;
/* file_searcher.exe がファイルを探して、一時ファイルへ候補を追記します。
*/
$$exe=$g_root_macro_directory+R"(\internal\bin\file_searcher.exe)";
/* file_searcher.exeのコマンドライン引数を作ります
*/
$$args = sprintf(R"(--output "%s" --mode file --working_directory "%s" --path "%s" --delay %d)",$$temp_filename,$g_current_working_directory,$$root_dir,0);
/* file_searcher.exe を実行します。
*/
##handle=dllfuncw(#g_dll_hm_process,"SpawnWithRedirect",$$exe,$$args,true,true);
##ret=dllfuncw(#g_dll_hm_process,"SetCreateNoWindow",##handle,true);
##ret=dllfuncw(#g_dll_hm_process,"Start",##handle);
if(##ret==0){
return "";
}
/*候補が追記される、一時ファイル名を返します。
*/
return $$temp_filename;
以下ファイルをもとに改造するのが分かりやすいです。
echoアクションは、選択した候補の情報を全てダンプ出力します。 データへのアクセス方法の参考にしてください。
common.ini(echoアクション定義を抜粋)
[property]
description=共通アクション
default_action=insert
'継承するアクション(空白区切り)
base_kind=
[action.echo]
function=echo
is_multi_selectable=true
description=候補のデバッグ情報をアウトプット枠へ出力する
common.mac(echoアクションのソースコードを抜粋)
echo:
/* 候補の詳細をアウトプット枠へ表示する(debug用途)
*/
##output_dll=loaddll("HmOutputPane.dll");
if(!result){
return "0";
}
//アウトプット枠クリア
##h=dllfunc(##output_dll,"GetWindowHandle",hidemaruhandle(0));
##ret=sendmessage(##h,0x111/*WM_COMMAND*/,1009,0);//1009=クリア
$$format = R"([%d/%d] {"text":"%s", "source_name":"%s", "action_directory_name":"%s", "action_file_name":"%s", "action_command":"%s", "action_window_handle":%d, "action_line":%d, "action_column":%d, "description":"%s"})" + "\r\n";
//選択された候補数(##count)を取得する
##count=dllfuncw(#g_dll_ohtorii_tools,"GetSelectionCount");
##i =0;
while(##i < ##count){
//候補の情報を取得する
$$source_name =dllfuncstrw(#g_dll_ohtorii_tools, "GetSelectionSourceName" , ##i);
$$text =dllfuncstrw(#g_dll_ohtorii_tools, "GetSelectionText" , ##i);
$$action_directory_name =dllfuncstrw(#g_dll_ohtorii_tools, "GetSelectionActionDirectoryName", ##i);
$$action_file_name =dllfuncstrw(#g_dll_ohtorii_tools, "GetSelectionActionFileName" , ##i);
$$action_command =dllfuncstrw(#g_dll_ohtorii_tools, "GetSelectionActionCommand" , ##i);
##window_handle =dllfuncw( #g_dll_ohtorii_tools, "GetSelectionActionWindowHandle" , ##i);
##line =dllfuncw( #g_dll_ohtorii_tools, "GetSelectionActionLine" , ##i);
##column =dllfuncw( #g_dll_ohtorii_tools, "GetSelectionActionColumn" , ##i);
$$description =dllfuncstrw(#g_dll_ohtorii_tools, "GetSelectionDescription" , ##i);
//候補の情報を文字列($$info)にする
$$info=sprintf($$format
, ##i + 1
, ##count
, $$text
, $$source_name
, $$action_directory_name
, $$action_file_name
, $$action_command
, ##window_handle
, ##line
, ##column
, $$description);
//アウトプット枠へ$$infoを表示する
##ret=dllfunc(##output_dll,"Output",hidemaruhandle(0),$$info);
##i = ##i + 1;
}
freedll ##output_dll;
return "1";
カインドの継承は以下定義ファイルを参照してください。
file.ini
[property]
description=ファイルのアクション
default_action=open
; 継承するカインドを空白区切りで並べます
base_kind=file_base cdable common