autocomplete の返り値についてNo.11749
IKKI さん 06/12/13 01:46
 
IKKI です。こんにちは。

autocomplete 文を使ってみました。
これを使って入力補助系マクロを作ろうとすると、次の情報が欲しくなります。

 (1) 補完された文字列
 (2) 最後に入力した文字/キー

これらの情報を何らかの形で取得できるようご検討いただければと思います。

▼補足

(1)について
autocomplete 文は何番目の候補が選ばれたかを result で返してくれます。
turukame.3:11472 で私が示した例がそうなっていたからかもしれませんが、
位置だけでなく文字列自体がわからないと嬉しくなかったです。(^^;

(2)について
たとえば「auto」という候補を選んだ状態で Enter を押すと「auto」が、
「;」を押すと「auto;」が補完されます。両者を区別するために、
ユーザーが最後に何を入力して補完を終えたかを知りたいです。

最後に入力したキーは keypressed で取得できますが、日本語キーボードと
英語キーボードでは文字が違うので、最後に入力された文字によって
処理を分岐したりしようとすると難しいことになりそうです。※

▼私案

●案1 autocomplete 文を関数にする

 $compstr = autocomplete(#flags1, #flags2, #flags3, $dicfile);
 #lastchar = result;  // 最後に入力した文字コード

  …関数が result を書き換えるのは変?

●案2 補完された文字列を保持するキーワードを追加

 autocomplete #flags1, #flags2, #flags3, $dicfile;
 #lastchar = result;  // 最後に入力した文字コード
 $compstr = lastcompletion;  // 補完された文字列

●案3 補完された文字列の長さを result で返す

 autocomplete #flags1, #flags2, #flags3, $dicfile;
 $compstr = gettext2(column - result, lineno, column, lineno);

  …最後に入力した文字はどうする?

---------------------------------------------------------------------
※ 以下のようにすれば可能かもしれませんが、未検証です。

if (最後のキーが(Shift+)文字キー && IMEがOFF) {
 $lastchar = rightstr(補完された文字列, 1);
} else {
 $lastchar = ""
}

[ ]
RE:11749 autocomplete の返り値についてNo.11771
秀丸担当 さん 06/12/13 17:07
 

>(1)について
>autocomplete 文は何番目の候補が選ばれたかを result で返してくれます。
>turukame.3:11472 で私が示した例がそうなっていたからかもしれませんが、
>位置だけでなく文字列自体がわからないと嬉しくなかったです。(^^;

resultでリストで選択された位置を返していますが、それを返されても使い道が
無いですね。
turukame.3:11535 あたりで書きましたが、もし自動起動マクロで単語補完後が
あるとしたら、geteventparam()で補完した位置を取得できるようにするかもし
れません。未定ですが。
でも autocomplete -1; で同期で実行した場合は、自動起動マクロではないので、
geteventparam()で取得するのは変です。
やっぱりresultでできたらいいと思いますが、取得できるのが1つの数値しかな
いのが問題です。

>●案3 補完された文字列の長さを result で返す
>
> autocomplete #flags1, #flags2, #flags3, $dicfile;
> $compstr = gettext2(column - result, lineno, column, lineno);

これに似た感じで、resultの上位ワードと下位ワードで2つの長さを返すという
のはどうでしょうか。
シフト演算子が無いので割り算になりますが。
autocomplete -1;
#c1 = result & 0x0000ffff;
#c2 = (result & 0xffff0000) / 0x10000;
$compstr = gettext2(column - #c1, lineno, column - #c2, lineno);

[ ]
RE:11771 autocompleteの返り値についてNo.11841
IKKI さん 06/12/18 02:55
 
IKKI です。こんにちは。

対応していただいてありがとうございます。
使ってみて気づいた点を報告します。

> autocomplete -1;
> #c1 = result & 0x0000ffff;
> #c2 = (result & 0xffff0000) / 0x10000;
> $compstr = gettext2(column - #c1, lineno, column - #c2, lineno);

(1) キャンセルしたとき #c1, #c2 に入る値の意味がわかりませんでした。
キャンセル時は
 #c1 == 0
 #c2 == 通常時と同じ(補完対象文字列の先頭)
でよいのではないでしょうか。

(2) ヘルプに
> このとき、resultには補完した文字列の位置を返します。0の場合はキャンセルです。
という記述が残っています。

[ ]
RE:11841 autocompleteの返り値についてNo.11856
秀丸担当 さん 06/12/18 11:36
 

>(1) キャンセルしたとき #c1, #c2 に入る値の意味がわかりませんでした。
>キャンセル時は
> #c1 == 0
> #c2 == 通常時と同じ(補完対象文字列の先頭)
>でよいのではないでしょうか。

キャンセルしたときは 0 になるつもりでしたが、不定な値になってしまってい
ました。すみません。
0 を返すようにしたいと思います。
#c1が補完対象文字列の先頭です。(カーソル位置からの相対位置)
#c2は補完対象文字列の最後です。
#c2は通常の候補の決定では0で、文字入力により決定した場合は1になります。
なので、
> #c2 == 通常時と同じ(補完対象文字列の先頭)
という返し方はできないです。
キャンセル時もどうしても必要ということであればまた仕様変更の案を考えない
といけないですが。

>(2) ヘルプに
>> このとき、resultには補完した文字列の位置を返します。0の場合はキャンセルで
>> す。
>という記述が残っています。

リストの位置ではなく文字列の位置という意味だったのですが、少々意味の分か
りづらい文になってるようなので改めます。

[ ]
RE:11856 autocompleteの返り値についてNo.11875
IKKI さん 06/12/18 21:48
 
IKKI です。こんばんは。

> > autocomplete -1;
> > #c1 = result & 0x0000ffff;
> > #c2 = (result & 0xffff0000) / 0x10000;
> > $compstr = gettext2(column - #c1, lineno, column - #c2, lineno);
>
> #c1が補完対象文字列の先頭です。(カーソル位置からの相対位置)
> #c2は補完対象文字列の最後です。

ん?
#c2 が上位ワード、 #c1 が下位ワードですよね?
β9で実験した限りでは上位ワードが先頭、下位ワードが末尾のようですが。

> #c2は通常の候補の決定では0で、文字入力により決定した場合は1になります。
> なので、
> > #c2 == 通常時と同じ(補完対象文字列の先頭)
> という返し方はできないです。
> キャンセル時もどうしても必要ということであればまた仕様変更の案を考えない
> といけないですが。

提案の意図は、次の2つを同一視して同じコードで処理したいということです。

 ・リストボックスから「abc」という候補を選んだ
 ・キーボードから「abc」と打った

ですが、同一視してしまうとまずいケースがあるかもしれません。
これについては β10 のリリースを待って改めて考えたいと思います。

[ ]
RE:11875 autocompleteの返り値についてNo.11882
秀丸担当 さん 06/12/19 09:11
 

>ん?
>#c2 が上位ワード、 #c1 が下位ワードですよね?
>β9で実験した限りでは上位ワードが先頭、下位ワードが末尾のようですが。

その通りでした。すみません。

>提案の意図は、次の2つを同一視して同じコードで処理したいということです。
>
> ・リストボックスから「abc」という候補を選んだ
> ・キーボードから「abc」と打った
>
>ですが、同一視してしまうとまずいケースがあるかもしれません。
>これについては β10 のリリースを待って改めて考えたいと思います。

うーむ、とりあえずβ10でresultは0にしてみようと思います。

[ ]