単語補完とマクロの連携についてNo.11472
IKKI さん 06/12/01 09:09
 
IKKI です。おはようございます。

単語補完は言語に依存しない汎用的な機能として、とてもよく研究されて
作られたものと思います。
一方、「私の使っている○○言語のためにこんな機能を追加してほしい」
といった個別の要望はマクロで実現していくことになるでしょう。

正式版までに単語補完もマクロから実行できるようになると期待しています。
そこで、単にコマンドと同等の文を作るだけでなく、より自由度の高い方法を
提供していただけると、幅広い要望をユーザーの手で実現できる可能性が
開けるのではないかと思います。

いささか先走った話で恐縮ですが、いくつかの私案を示します。


(1) 単語補完コマンドと同等。設定に従って候補収集から補完まで行う
---------------------------------------
// 単語補完
complete;
---------------------------------------

(2) 候補提示 UI だけを呼び出す。前処理、設定、後処理はマクロで行う
---------------------------------------
// 前処理
if () {
  // カーソル位置によって辞書を切り替えるとか
  $dicfile = "hoge.txt";
} else {
  $dicfile = "fuga.txt";
}

// 候補提示
suggest $dicfile, #option_flags;

// 後処理
if (result == -1) {
  // キャンセルされた
} else if (result == 0) {
  // スルーされた
} else if (result == 1) {
  // 候補1番が選ばれた
} else ......
---------------------------------------

(3) 単語補完前後にマクロを自動起動する
---------------------------------------
// 自動起動マクロ
if (geteventparam() == 補完前) {
  // 前処理
  writeregnum "HKCU", ..., "AutocompConfig", ...;
  // どうやって補完候補を制御するか?
}
if (geteventparam() == 補完後) {
  // 後処理
}
---------------------------------------


以上、ご検討いただければ幸いです。

[ ]
RE:11472 単語補完とマクロの連携についてNo.11491
秀丸担当 さん 06/12/01 13:49
 

>(1) 単語補完コマンドと同等。設定に従って候補収集から補完まで行う
>(2) 候補提示 UI だけを呼び出す。前処理、設定、後処理はマクロで行う

現状でマクロ実行をすると補完候補を強制的に消すようにしているのですが、マ
クロで単語補完を出すと、マクロ実行で候補を消すという動作と矛盾するのでど
うしたものかと考えていました。
でもやっぱりできたほうがいいですね。

autocomplete;
autocomplete #flags1, #flags2, #flags3, $dicfile;
#flags1は表示方法
#flags2は検索対象など
#flags3は検索方法など
$dicfileは辞書ファイル
とか考えてました。
が作ってません。

単語補完は基本的に非同期の並行処理なので、
>// 候補提示
>suggest $dicfile, #option_flags;
>
>// 後処理
>if (result == -1) {

といった感じにできるかどうか、簡単なようですがこれが難しそうです。
単語補完の文を実行したらマクロは即終了といった単発呼び出し専用ならば比較
的簡単だとは思います。


>(3) 単語補完前後にマクロを自動起動する
>---------------------------------------
>// 自動起動マクロ
>if (geteventparam() == 補完前) {
>  // 前処理
>  writeregnum "HKCU", ..., "AutocompConfig", ...;
>  // どうやって補完候補を制御するか?
>}
>if (geteventparam() == 補完後) {
>  // 後処理
>}
>---------------------------------------

自動起動マクロの「カーソル移動後タイマー」から「キャッシュファイルを…」
の間の空間には、「リアルタイム検索」と「単語補完前」を想定して作っていた
のですが、V6.50ではやめました。

「リアルタイム検索」は検索ダイアログの検索ボックス編集中に適時呼ばれ、入
力した文字に対してsearchbufferを変化させるとか。
たとえば「ai」と入力すると、searchbufferを「[ai|あい|愛]」にフィルタ的に
変換してくれるマクロを想定とか。

「単語補完前」は、補完するために取り込む範囲をあらかじめ指定するか、単語
補完の代替となるマクロをすり替えるとか。
たとえば、

if( geteventparam(0) == 補完前 ) {
  execmacro "completex.mac";
  seteventnotify 1; //標準の単語補完の実行を中断
}

とか

if( geteventparam(0) == 補完前 ) {
  selectline;
  seteventnotify 2; //範囲選択を取り込んで補完
}

というのを実際作ってみたりしましたが、ボツにしました。

[ ]
RE:11491 単語補完とマクロの連携についてNo.11523
IKKI さん 06/12/04 02:12
 
IKKI です。こんにちは。

> 現状でマクロ実行をすると補完候補を強制的に消すようにしているのですが、マ
> クロで単語補完を出すと、マクロ実行で候補を消すという動作と矛盾するのでど
> うしたものかと考えていました。
> でもやっぱりできたほうがいいですね。

そうですね。よろしくお願いします。

> autocomplete #flags1, #flags2, #flags3, $dicfile;
> #flags1は表示方法
> #flags2は検索対象など
> #flags3は検索方法など
> $dicfileは辞書ファイル
> とか考えてました。

そんな感じでいいんじゃないでしょうか。

> 単語補完は基本的に非同期の並行処理なので、
>
> >// 候補提示
> >suggest $dicfile, #option_flags;
> >
> >// 後処理
> >if (result == -1) {
>
> といった感じにできるかどうか、簡単なようですがこれが難しそうです。

非同期であることを忘れてました。
非同期で後処理をしたいとなると、やはりコールバック(自動起動)で行くしかない
かな。

> 自動起動マクロの「カーソル移動後タイマー」から「キャッシュファイルを…」
> の間の空間には、「リアルタイム検索」と「単語補完前」を想定して作っていた
> のですが、V6.50ではやめました。

あれれ? うまくいきませんでしたか。
「リアルタイム検索」も「単語補完前後」も有用だと思うので、ぜひ実現してほしい
ところですが。

[ ]