ベースフォルダにある CompleteWord.mac を実行するか、何も設定してない状態で CompleteX.mac を実行すると名前補完モードになります。名前補完モードでは現在編集中のファイル内にある単語が候補に挙がります*1。やってみましょう。
補完対象となるのはカーソルの直前にある一続きのアルファベット等*2です。あらかじめ範囲選択しておくとその部分だけが補完対象となります。
リストボックスの使い方は直感的にわかるでしょう。詳しくは リストボックスの操作 を参照してください。
辞書ファイルがある状態で CompleteX.mac を実行すると辞書補完モードになります。辞書ファイルは拡張子ごとに用意し、 拡張子.dic という名前でベースフォルダに置きます。ベースフォルダにある sample.dic を使って試してみましょう。このサンプル辞書は PHP5 の関数名を集めたものです。
ほかの拡張子に対しても同様に辞書ファイルを用意すれば使えます。たとえば拡張子 php のファイルで同じ辞書を使うには、辞書ファイルを php.dic という名前にします。
辞書ファイルは候補を書き並べるだけで簡単に作れます。〈→辞書の作り方〉
名前補完モードの候補と辞書補完モードの候補を混ぜることができます。設定ファイル config.txt に次の2行を書き加えます。
[default] source=mix
この設定は拡張子別に行うこともできます。詳しくは設定ファイルの書き方を参照してください。
ベースフォルダにある CompletePath.mac を実行します。詳しくは CompletePath.mac を参照してください。
ベースフォルダにある CompleteFont.mac を実行します。詳しくは CompleteFont.mac を参照してください。
任意の名前の辞書ファイルを使うには、設定ファイルに記述を加えます。方法は設定ファイルの書き方を参照してください。辞書ファイルを指定するキーは dic= です。
例: 拡張子 mac に対して辞書ファイル hidemac.dic を指定する場合
[.mac] dic=hidemac.dic
辞書ファイルは次の順序で検索され、最初に見つかったものが使用されます。
プラグインを使うには、入手したプラグイン (.mac ファイル) をベースフォルダに置き、設定ファイルに記述を加えます。方法は設定ファイルの書き方を参照してください。プラグインを指定するキーは plugin= です。
例: 拡張子 htm に対してプラグイン htmltag.mac を指定する場合
[.htm] plugin=htmltag.mac
プラグインは次の順序で検索され、最初に見つかったものが使用されます。プラグインの指定は辞書ファイルの指定より優先されます。
プラグインは秀丸マクロの知識があれば作れます。〈→プラグインの作り方〉 また、有志の方が作ったプラグインがアップローダにあるかもしれません。
デフォルトのキー割り当ては次のとおりです。
キー | 動作 |
---|---|
文字キー | 文字として入力 |
Ctrl+文字キー | 何もしない |
Space | 文字として入力 |
Enter | 確定1 |
Shift+Enter | 確定2 |
Ctrl+Enter | 確定3 |
Backspace | 1文字消去 |
Esc | キャンセル |
Tab | 補完 |
↑ | 前候補 |
↓ | 次候補 |
← | 前ページ |
→ | 次ページ |
確定1, 確定2, 確定3 はどれも同じですが、プラグインによっては確定後の動作が変わる場合があります。
キャンセル は補完開始前の状態に戻ります。ただし 設定 で Appear=listbox としているときはリストボックスが消えるだけです。
以下の場合は現在選択中の候補が自動的に確定されます。
CompleteX-Main.mac の冒頭部分を書き換えることで任意のキー割り当てに変更できます。詳しくは試行錯誤してください。
//------ キー割り当て ---------------------------------------------------------- // #F[キー] = 機能コード; #F[0x020] = 0; // [Space] ┌── 機能コード ──┐ #F[0x00D] = 1; // [Enter] │ 0: 文字として入力 │ #F[0x008] = 37; // [Backspace] │ -1: キャンセル1 │ #F[0x01B] = -1; // [Esc] │ -2: キャンセル2 │ #F[0x009] = 32; // [Tab] │ -3: キャンセル3 │ #F[0x01D] = 33; // [↑] │ -4: キャンセル4 │ #F[0x01F] = 34; // [↓] │ 1: 確定1 │ #F[0x01C] = 35; // [←] │ 2: 確定2 │ #F[0x01E] = 36; // [→] │ 3: 確定3 │ // #F[0x120] = ; // Shift+[Space] │ 4: 確定4 │ #F[0x10D] = 2; // Shift+[Enter] │ 32: 補完 │ // #F[0x108] = ; // Shift+[Backspace] │ 33: 前候補 │ // #F[0x11B] = ; // Shift+[Esc] │ 34: 次候補 │ // #F[0x109] = ; // Shift+[Tab] │ 35: 前ページ │ // #F[0x11D] = ; // Shift+[↑] │ 36: 次ページ │ // #F[0x11F] = ; // Shift+[↓] │ 37: 1文字消去 │ #F[0x11C] = 37; // Shift+[←] │ 38: 1文字確定 │ #F[0x11E] = 38; // Shift+[→] │ 99: 何もしない │ // #F[0x220] = ; // Ctrl+[Space] └──────────┘ #F[0x20A] = 3; // Ctrl+[Enter] // #F[0x27F] = ; // Ctrl+[Backspace] #F[0x21D] = 35; // Ctrl+[↑] #F[0x21F] = 36; // Ctrl+[↓] // #F[0x21C] = ; // Ctrl+[←] // #F[0x21E] = ; // Ctrl+[→] // #F[0x31D] = ; // Shift+Ctrl+[↑] // #F[0x31F] = ; // Shift+Ctrl+[↓] // #F[0x31C] = ; // Shift+Ctrl+[←] // #F[0x31E] = ; // Shift+Ctrl+[→] // #F[0x1C0 + 'A'] = ; // Ctrl+[ A ] // : // : // #F[0x1C0 + 'Z'] = ; // Ctrl+[ Z ] // #F[0x2C0 + 'A'] = ; // Shift+Ctrl+[ A ] // : // : // #F[0x2C0 + 'Z'] = ; // Shift+Ctrl+[ Z ]
設定ファイルはベースフォルダにある config.txt という名前のテキストファイルです。サンプルとして sample-config.txt が同梱されています。
設定ファイルはいくつかのセクションからなり、それぞれのセクションに キー=値
の形で設定内容を書きます。
[セクション] キー=値 …
設定は
の順に検索され、最初に見つかったものが適用されます。見つからない場合は何も設定されていないものと見なされます。
特定の拡張子に対する設定はピリオドで始まる拡張子のセクションに書きます。
例: 拡張子 mac に対して辞書ファイル hidemac.dic を指定する場合
[.mac] dic=hidemac.dic
値にファイル名を指定するときは、フルパスまたはベースフォルダからの相対パスで書きます。〈→ファイル名の指定方法〉
複数の拡張子に対する設定を1か所にまとめて書くことができます。
@=ファイルタイプ
と書きます。例: 拡張子 htm, html のファイルタイプを htmlfile とし、辞書ファイル html401.dic を指定する場合
[htmlfile] dic=html401.dic [.htm] @=htmlfile [.html] @=htmlfile
@= は「値が設定されてなかったら他のセクションを参照せよ」という意味です。 @= があるからといって、そのセクションの他のキーが無効になるわけではありません。〈→参照記法〉
以上で定義されていない拡張子に対するデフォルトの設定は default セクションに書きます。
例: 未定義の拡張子に対して辞書ファイル common.dic を指定する場合
[default] dic=common.dic
デフォルトの設定で辞書ファイルを指定すると、ベースフォルダに 拡張子.dic を置いても使用されなくなります。
辞書ファイルやプラグインなどのファイル名を指定する場合、値にファイル名だけを書くとそのファイルはベースフォルダにあるものと見なされます。ベースフォルダ以外にあるファイルは、ベースフォルダからの相対パス、フルパス、 UNC パスのいずれかで指定します。
例: ベースフォルダ\hoge\fuga.dic を指定する方法
dic=hoge\fuga.dic … 相対パス dic=C:\Program Files\Hidemaru\Macro\CompleteX\hoge\fuga.dic … フルパス dic=\\Computer\C\Program Files\Hidemaru\Macro\CompleteX\hoge\fuga.dic … UNC パス
以下のセクション名は予約されています。他の目的には使えません。
[default] … デフォルトの設定 [turukame] … 秀丸メールに対する設定 [new] … 新規文書に対する設定 [grep] … grep 結果ウィンドウに対する設定 [exeresult] … 実行結果ウィンドウに対する設定 [webbrowse] … Web ブラウズモードに対する設定 [plugin] … プラグインから起動されたときの設定
設定ファイルに記述できる項目は以下のとおりです。設定ファイルの記述方法は設定ファイルの書き方を参照してください。
source=mix … 混合補完モードになります。 source=dic … 辞書補完モードになります。 source=self … 名前補完モードになります。 source=path … ファイル名補完モードになります。 source=font … フォント名補完モードになります。 source=auto … 辞書ファイルの有無によって辞書補完モードと名前補完モードが自動的に切り替わります。 source=builtin … 辞書ファイルがないとき、名前補完モードの代わりに秀丸内蔵の単語補完機能が呼び出されます。mix, builtin 以外はユーザーが明示的に指定する必要はないと思います。
dic=filename
hint=filename
plugin=filename
autofix=111 … 最初、途中、最後に自動補完を行います。 autofix=101 … 最初と最後に自動補完を行います。 autofix=100 … 最初に自動補完を行います。 autofix=001 … 最後に自動補完を行います。 autofix=000 … 自動補完を行いません。
autosave=yes
overwrite=yes
casesense=yes候補の絞り込み表示を行わない場合は効果がありません (大文字小文字は区別されないように見えます)。ファイル名補完モードでは大文字小文字は区別されません。
unsorted=yes … 内部でソートします。 unsorted=overlap … 内部でソートし、重複候補を取り除きます (正規化)。unsorted はプラグインが作るテンポラリ辞書のための機能です。ユーザーが作る辞書ファイルは後述の方法で正規化してください。〈→辞書の作り方〉
wordhas=@#$%&...この設定は補完対象文字列の取得と不一致による自動確定の動作に影響します。
appear=listbox … 候補がリストボックスにのみ表示されます。 (Visual Studio 風) appear=both … 候補がカーソル位置とリストボックスの両方に表示されます。 appear=inline … 候補がカーソル位置にのみ表示されます。 (インライン補完風)
appear=listbox | appear=both | appear=inline |
---|---|---|
filter=no
rows=10
width=300
[htmlfile] source=mix dic=html401.dic [.html] @=htmlfile dic=html401_with_ssi.dic
この例だと拡張子 .html に対し source=mix
dic=html401_with_ssi.dic
が設定されます。参照できるのは同じ設定ファイル内にあるセクションだけです。設定を誤ると無限ループします。
CompleteX の辞書ファイルとヒントファイルは行指向のテキストファイルです。アーカイブに入っている sample.dic と sample.hint を参考にしてください。
辞書ファイルは正規化されていなければなりません。正規化とはファイル内容を行ごとにソートし重複行を除去することです。辞書ファイルの正規化は次の方法で行います。
Windows の sort コマンドとは結果が異なります。必ず上記の方法を使ってください。
\n
と書くと表示時に改行されます。他の秀丸マクロから CompleteX の補完機能を利用することができます。また、そのマクロを CompleteX から起動することもできます。このようなマクロをプラグインと呼びます。アーカイブに入っている sample-plugin.mac を参考にしてください。
CompleteX は複数のマクロが連係して動作するように設計されています。ファイル構成を思い出してください。
■マクロフォルダ\ │□CompleteX.mac … 起動マクロ │ └■CompleteX\ … ベースフォルダ │□CompleteX-Main.mac … 本体マクロ │□config.txt … 設定ファイル │□プラグイン │ └■system □listbox.mac … リストボックス □listbox.param … パラメータファイル
これらのマクロ群は次の順序で実行されていきます。
プラグインは内部でリストボックス listbox.mac を呼び出します。機能分担を階層的に描くと下図のようになります。 listbox.mac はパラメータファイル listbox.param を介して上位層との間で情報をやりとりします。ここでは listbox.mac のインターフェイスを規定します。
下は単純なプラグインの例です。
$CfgFile = currentmacrodirectory + "\\config.txt"; // 引数の設定 $$prmfile = currentmacrodirectory + "\\system\\listbox.param"; writeinistr $$prmfile, "Parameter", "cfgfile", $CfgFile; // (1) writeinistr $$prmfile, "Parameter", "source", "list"; // (2) writeinistr $$prmfile, "Parameter", "list", "hoge,fuga,piyo"; writeinistr $$prmfile, "Parameter", "hints", "ほげ,ふが,ぴよ"; writeinistr $$prmfile, "Parameter", "unsorted", "overlap"; // (3) // リストボックス起動 execmacro currentmacrodirectory + "\\system\\listbox.mac"; // (4) // 結果の取得 #result = getininum($$prmfile, "Return", "result"); // (5) $instr = getinistr($$prmfile, "Return", "instr"); // (6) $basestr = getinistr($$prmfile, "Return", "basestr"); // (7) // 後始末 if (#result == 9 || #result == 13 || #result >= 32) { insert char(#result); // (8) }
リストボックスに渡す引数はパラメータファイル listbox.param の Parameter セクションに書き込みます。
writeinistr $$prmfile, "Parameter", "source", "dic"; writeinistr $$prmfile, "Parameter", "dic", $dicfile; // 辞書ファイル名 writeinistr $$prmfile, "Parameter", "hint", $hintfile; // ヒントファイル名プラグイン側で辞書ファイルを作る場合、 ~tmp.dic というファイル名は避けてください。本体が利用するテンポラリ辞書ファイル名と衝突するためです。
writeinistr $$prmfile, "Parameter", "source", "list"; writeinistr $$prmfile, "Parameter", "list", "hoge,fuga,piyo"; // 候補リスト writeinistr $$prmfile, "Parameter", "hints", "ほげ,ふが,ぴよ"; // ヒントリストリストはカンマ区切り文字列です。ヒントリストはヒントファイルと同様、リストボックスの下に表示される内容をカンマ区切り文字列で指定します。
必要に応じてその他の設定を追加します(3)。書ける内容は設定ファイルと同じです。〈→設定項目〉 設定ファイルに書かれた設定よりもパラメータファイルに書かれた設定の方が優先されます。
特に指定しない限り、補完対象となるのはカーソルの直前にある一続きのアルファベット等です。補完対象を特に指定したい場合は次のようにします。
moveto #x1, #y1; beginsel; moveto #x2, #y2; endsel; // 削除する範囲を選択 writeinistr $$prmfile, "Parameter", "instr", "xyz"; // 初期文字列この例だとリストボックス起動時に (#x1, #y1) - (#x2, #y2) の範囲が削除され、 (#x1, #y1) にカーソルが置かれ、 xyz が入力された状態になります。
listbox.mac を起動します(4)。確定文字列が insert された状態で返ってきます。不一致による自動確定で最後に入力された文字は insert されていません。
結果はパラメータファイル listbox.param の Return セクションに書き込まれています。
result=-1 … キャンセル (Esc) result=0 … 一致による自動確定 result=1 … 確定1 (Enter) result=2 … 確定2 (Shift+Enter) result=3 … 確定3 (Ctrl+Enter) result=35 … 不一致による自動確定 値は最後に入力された文字コード (9, 13, 32〜126)
不一致による自動確定で最後に入力された文字を書き込みます(8)。
プラグイン内で DLL をロードした場合、そのプラグインが責任をもって解放してください。逆に、プラグインが起動された時点ですでに DLL がロードされていた場合、その DLL を勝手に解放してはいけません。
プラグインから他のプラグインを呼び出すこともできます。これを「プラグインの連鎖」と呼ぶことにします。たとえば2つのプラグインを連鎖させると全体の構造は下図のようになります。親プラグインと子プラグインの間では設定ファイル config.txt を介して情報をやりとりします (listbox.param ではありません)。ここではプラグイン同士のインターフェイスを規定します。
前節で説明した単純なプラグインとの違いは次の2点です。
下は親プラグインの例です。親として他のプラグインを呼び出すと同時に、自分が子となって他のプラグインから呼び出されることも考慮しています。 (1), (2), (7), (8) が子プラグインとして必要な対上位インターフェイス、 (3) 〜 (6) が親プラグインとして必要な対下位インターフェイスです。
$CfgFile = currentmacrodirectory + "\\config.txt"; // ファイルタイプ決定 if (getinistr($CfgFile, "plugin", "type") == "plugin") { $Type = "plugin"; // (1) 対上位 } else { $Type = filetype; // (2) } // 引数の設定 writeinistr $CfgFile, "plugin", "type", "plugin"; // (3) 対下位 writeinistr $CfgFile, "plugin", "@", filetype; // (4) 対下位 // 子プラグイン起動 if ($Type != "plugin") begingroupundo; execmacro currentmacrodirectory + "\\子プラグイン.mac"; // (5) 対下位 if ($Type != "plugin") endgroupundo; // 結果の取得 #result = getininum($CfgFile, "plugin", "result"); // (6) 対下位 $instr = getinistr($CfgFile, "plugin", "instr"); $basestr = getinistr($CfgFile, "plugin", "basestr"); // 後始末 if ($Type == "plugin") { writeinistr $CfgFile, "plugin", 0, 0; // (7) 対上位 writeinistr $CfgFile, "plugin", "basestr", "\"" + $basestr + "\""; writeinistr $CfgFile, "plugin", "instr", "\"" + $instr + "\""; writeininum $CfgFile, "plugin", "result", #result; } else if (#result == 9 || #result == 13 || #result >= 32) { insert char(#result); // (8) } else if (#result <= -1 && $instr == $basestr) { undo; // (9) }
最下位の (自分で listbox.mac を呼び出す) 子プラグインを作るときは、対下位インターフェイスを listbox.mac のもの〈→前節〉に差し替えればいいです。具体例はアーカイブに入っている sample-plugin.mac を見てください。
実際にプラグインを作るときは、最上位のプラグインを作っているつもりでも対上位インターフェイスを持たせておいたほうがいいです。他のプラグインからその機能を使いたいと思ったとき子プラグインとして呼び出すことができ、車輪の再発明を避けられます。
最初に設定ファイル config.txt の plugin セクションの type キーの値を見てください。この値が plugin
だった場合、自分は他のプラグインから呼び出されたので、ファイルタイプは "plugin"
とします(1)。それ以外の場合、自分は最上位のプラグインなので、ファイルタイプは filetype
キーワードの値とします(2)。*1
[plugin] type=plugin … 連鎖している → ファイルタイプは "plugin" type= … 連鎖してない → ファイルタイプは filetype
親プラグインは config.txt の plugin セクションの type キーに plugin
という値を書き込みます(3)。
必要に応じてその他の設定を plugin セクションに追加します(4)。内容はユーザーが設定ファイルに書くものと同じです。〈→設定項目〉
設定が済んだら子プラグインを起動します(5)。確定文字列が insert された状態で返ってきます。不一致による自動確定で最後に入力された文字は insert されていません。
親プラグインは config.txt の plugin セクションから子プラグインの実行結果を取得します(6)。内容は listbox.mac の返り値と同じです。
自分が他のプラグインから呼び出されていた場合、呼び出し元に結果を返します(7)。最後に入力された文字を書き込むのは最上位のプラグインの役目なので、自分が書き込んではいけません。
自分が最上位のプラグインだった場合、不一致による自動確定で最後に入力された文字を書き込みます(8)。キャンセルされた場合はアンドゥすることもできます(9)。
プラグイン内で DLL をロードした場合、そのプラグインが責任をもって解放してください。逆に、プラグインが起動された時点ですでに DLL がロードされていた場合、その DLL を勝手に解放してはいけません。
"turukame"
とします。判定方法は CompleteX-Main.mac の GetType サブルーチンを参考にしてください。設定ファイルに書ける特殊なセクションとして次のものがあります。これらのセクションに設定を記述してください。
[turukame] … 秀丸メールに対する設定 [new] … 新規文書に対する設定 [grep] … grep 結果ウィンドウに対する設定 [exeresult] … 実行結果ウィンドウに対する設定 [webbrowse] … Web ブラウズモードに対する設定
ベースフォルダに turukame.dic, new.dic, grep.dic, exeresult.dic, webbrowse.dic を置いて使うこともできます。
config.txt を排他的に開いたまま実行していませんか。 config.txt を閉じるか、ファイルの排他制御を無効にしてください。
一部のアンチウィルスソフトを使っている環境で、拡張子が .ini のファイルへの書き込みが極端に遅くなるという噂を聞いたからです。ほんまかいな。
談話室へお越しください。