単語補完と編集後タイマとiskeydown()No.04530
IKKI さん 09/11/22 03:56
 
こんにちは。IKKI です。

Eclipse のコードエディタっぽい動きをさせようとしてハマりました。
編集後タイマの使い方の勘所がわかっておりませんで…よろしければご教示ください。

●目的
開き括弧の後に閉じ括弧を自動的に挿入したい

●手順
1. 自動起動マクロの編集後タイマに下記のテストマクロを設定し、遅延時間を 0ms
にする
2. 単語補完の設定で [リアルタイム入力] を OFF にする
3. 単語補完を実行し、例えば「hoge」という候補を選んだ状態で「[」キーを押す

●テストマクロ
--------
// 1.mac
if (iskeydown(0xDB)) insert "]";
--------
// 2.mac
if (autocompstate & 0x01) endmacro;
if (iskeydown(0xDB)) insert "]";
--------
// 3.mac
if (geteventparam(2)) endmacro;
if (iskeydown(0xDB)) insert "]";
--------
// 4.mac
if (autocompstate & 0x01) endmacro;
if (geteventparam(2)) endmacro;
if (iskeydown(0xDB)) insert "]";
--------

●期待する結果
hoge[]

●実際の結果
]hoge ← 1.mac
]hoge ← 2.mac
hoge] ← 3.mac
hoge  ← 4.mac

●質問
入力された文字に応じて入力内容に手を加えるマクロを作る場合、どのような作りに
するのが常道でしょうか。
なんだか iskeydown() を使うのは邪道な気がしてきました。遅延時間が 0ms 以外だ
と使えないし。
かといって、いちいち left; して code を見るのもいかがなものかと… (再描画が
煩わしいし、left; が失敗する場合を考慮しなきゃだし、遅延時間が 0ms 以外だと
入力されたのが 1 文字だけとは限らないし、etc...)。
皆さんはどのようにしていらっしゃいますか。

●提案
ほんの思いつきですが…
次のような機能があるとこの手のマクロが作りやすくなる気がします。

案1. 編集後タイマで、前回実行以降に入力された文字列を geteventparam() で取得
できるようにする。

案2. 自動起動マクロに「編集直前」を追加する。これから行おうとしている編集内
容を geteventparam() で取得できるようにする。


以上、ご教示のほどよろしくお願いいたします。

秀丸エディタ v8.00β26

[ ]
RE:04530 単語補完と編集後タイマとiskeydNo.04548
秀丸担当 さん 09/11/24 12:22
 

>●質問
>入力された文字に応じて入力内容に手を加えるマクロを作る場合、どのような作りに
>するのが常道でしょうか。

言われている通りの手順でしてみたところ、確かに単語補完候補を選んでいると
きはうまくいきませんでした。
iskeydownを使うべきかはとりあえず置いておいて、まず、候補を選んでいるとき
に入力したキーがマクロ実行によって無かったことになってしまうのが調子よく
ないようです。
こういう場合でもうまくいくようにβ27で修正してみようと思います。
それで、3.mac の方法でうまくいくかもしれません。

>
>案1. 編集後タイマで、前回実行以降に入力された文字列を geteventparam() で取得
>できるようにする。
>
>案2. 自動起動マクロに「編集直前」を追加する。これから行おうとしている編集内
>容を geteventparam() で取得できるようにする。

編集直前ができたら便利だと思いますが、これをすると収拾がつかなくなってし
まいそうです。
iskeydownを使わずにどういう入力がされたかを知る方法はあったらいいかもしれ
ないです。
貼り付けたテキストがまるごと取得できるようなものは難しいかもしれないので、
キー入力された一文字が取得できるといいかもしれません。
あと、本題とは関係ないかもしれませんが、遅延時間が設定されているかどうか
も取得できるようにして、遅延時間の有無の想定によってエラーを出すマクロを
作れるようにしたほうがいいかもしれないです。
そういう方向で検討したいと思います。

[ ]
RE:04548 単語補完と編集後タイマとiskeydNo.04571
IKKI さん 09/11/25 14:38
 
こんにちは。IKKI です。

>こういう場合でもうまくいくようにβ27で修正してみようと思います。
>それで、3.mac の方法でうまくいくかもしれません。

了解です。よろしくお願いします。

>>案1. 編集後タイマで、前回実行以降に入力された文字列を geteventparam() で取得
>>できるようにする。
>iskeydownを使わずにどういう入力がされたかを知る方法はあったらいいかもしれ
>ないです。
>貼り付けたテキストがまるごと取得できるようなものは難しいかもしれないので、
>キー入力された一文字が取得できるといいかもしれません。

パラメータをキーと結びつけるのはうまくないと思います。
例えば IME 経由の場合は 1 回のキー入力で複数の文字がまとめて入力されますし、
マウス操作で文字列が入力されることもありえます。
なので、あくまで「今の操作で入力された文字列」を取得したいところです。

---- 以下は独り言です ----

そして、遅延時間がある場合には「今の操作」は「前回以降の操作」になるべき?
でも遅延時間内にカーソル移動したらうまくいかないか。

クリップボードから巨大な文字列を貼り付けた場合は?
まだクリップボードに文字列が残っていて getclipboard で取り出せるから
「貼り付けた」ということを geteventparam で判別できれば十分か。

改行した場合は改行前の行頭〜カーソル位置の間にあったテキストを知りたい。

文字入力以外のイベントの場合は?
文字入力とそれ以外の編集操作を別のイベントとした方がいいかもしれない。

うーん、いろいろ考えると面倒ですね。

[ ]
RE:04571 単語補完と編集後タイマとiskeydNo.04575
秀丸担当 さん 09/11/25 17:16
 

>パラメータをキーと結びつけるのはうまくないと思います。
>例えば IME 経由の場合は 1 回のキー入力で複数の文字がまとめて入力されますし、
>マウス操作で文字列が入力されることもありえます。
>なので、あくまで「今の操作で入力された文字列」を取得したいところです。

そういうことができたら理想ではありますが、独り言のところで書かれている通
り、いろいろ考えると面倒だと思います。
多岐にわたる入力全てのサポートを、ユーザーがあまり触れることが無い部分で
力を注ぐのはあまりよくないように思います。

ここは今回の目的に限定したものにしたほうが現実的で、バグのリスクも少ない
ので、キー入力(一文字入力?)限定のほうがいいのではないかと思います。
(とはいってもまだ作っていなくてできるかどうかわかりませんが)

また他に必要性があるようだったら将来geteventparamを増やすということもで
きますし。

[ ]
RE:04575 単語補完と編集後タイマとiskeydNo.04586
IKKI さん 09/11/26 12:41
 
こんにちは。IKKI です。

> ここは今回の目的に限定したものにしたほうが現実的で、バグのリスクも少ない
> ので、キー入力(一文字入力?)限定のほうがいいのではないかと思います。

それもそうですね。
もっとも、それだったら遅延 0ms のときに iskeydown がちゃんと使えれば十分な気
もします。(^^:

ともあれ、β27では↓だけ対応していただければ結構ですので、よろしくお願いいた
します。

> iskeydownを使うべきかはとりあえず置いておいて、まず、候補を選んでいるとき
> に入力したキーがマクロ実行によって無かったことになってしまうのが調子よく
> ないようです。
> こういう場合でもうまくいくようにβ27で修正してみようと思います。

[ ]
RE:04548 単語補完と編集後タイマとiskeydNo.04607
IKKI さん 09/11/28 00:43
 
こんにちは。IKKI です。

> iskeydownを使うべきかはとりあえず置いておいて、まず、候補を選んでいるとき
> に入力したキーがマクロ実行によって無かったことになってしまうのが調子よく
> ないようです。
> こういう場合でもうまくいくようにβ27で修正してみようと思います。
> それで、3.mac の方法でうまくいくかもしれません。

β27 で試してみました。

●テストマクロ
// 3.mac
if (geteventparam(2)) endmacro;
if (iskeydown(0xDB)) insert "]";

●期待する結果
hoge[]

●実際の結果
hoge[

iskeydown() でキー押下を検知できなくなったような気がしますが、いかがでしょう
か。

[ ]
RE:04607 単語補完と編集後タイマとiskeydNo.04634
秀丸担当 さん 09/11/30 10:20
 

>iskeydown() でキー押下を検知できなくなったような気がしますが、いかがでしょう
>か。

WindowsXPとWindows7でタブモード/非タブモードで試してみましたが、3.macで
うまくできました。
遅延時間がある場合はタイミングでうまくできないですが、0msであればうまく
できました。
何か他に条件があるのかもしれないですが、いまのところ思いつくことはありま
せんでした。
もし条件と思わしいことがありましたら教えていただけると助かります。

というか、やはり自動起動マクロでiskeydownを使うのはあまり健全ではない気
がするので、geteventparamで何らかの方法を作ったほうがいいかもしれないで
す。

[ ]
RE:04634 単語補完と編集後タイマとiskeydNo.04641
IKKI さん 09/11/30 13:53
 
>もし条件と思わしいことがありましたら教えていただけると助かります。

こちらでも思いつきませんでした。
もし必要でしたら設定情報をお送りしますが、今回は iskeydown を使う方法には深
入りしない (調査打ち切り) ということでよろしいでしょうか。

[ ]
RE:04641 単語補完と編集後タイマとiskeydNo.04645
秀丸担当 さん 09/11/30 15:48
 

>こちらでも思いつきませんでした。
>もし必要でしたら設定情報をお送りしますが、今回は iskeydown を使う方法には深
>入りしない (調査打ち切り) ということでよろしいでしょうか。

geteventparamを追加するとしたら深入りしなくていい気もしますが、未知の問
題があるかもしれないので、お手数ですが念のために送っていただけると助かり
ます。
もし送っていただける場合、"PEH00775@nifty.com"まで秀丸担当宛であることを
書いて送っていただけると助かります。

[ ]
RE:04645 単語補完と編集後タイマとiskeydNo.04655
秀丸担当 さん 09/12/01 10:11
 

>>もし必要でしたら設定情報をお送りしますが、今回は iskeydown を使う方法には深
>>入りしない (調査打ち切り) ということでよろしいでしょうか。

ファイルを受け取りました。ありがとうございます。
設定を反映してみたのですが、なぜか再現できませんでした。
となると、他のキー操作に関係する常駐系のソフトなどがあるとしたら、それら
の影響があるのかもしれないと思いましたが、あまり深入りしないでおこうと思
います。
お手数をおかけして申し訳ありません。

[ ]
RE:04655 単語補完と編集後タイマとiskeydNo.04657
IKKI さん 09/12/01 10:20
 
こんにちは。IKKI です。

> 設定を反映してみたのですが、なぜか再現できませんでした。
> となると、他のキー操作に関係する常駐系のソフトなどがあるとしたら、それら
> の影響があるのかもしれないと思いましたが、あまり深入りしないでおこうと思
> います。

うーん、そうでしたか。
こちらでは常駐系ソフトを全部落としても再現したのですが…
いずれにせよ深入りしないということで了解しました。
ありがとうございました。

[ ]
RE:04548 単語補完と編集後タイマとiskeydNo.04702
IKKI さん 09/12/04 13:35
 
こんにちは。IKKI です。

> キー入力された一文字が取得できるといいかもしれません。

β28でうまく動くことを確認しました。
ご対応ありがとうございました。

[ ]