[ 新規に投稿する ]

V8.88β4No.09826
秀丸担当 さん 18/12/11 10:02 [ コメントを投稿する ]
 
V8.88β4を公開しました。

以下のページの「先行開発バージョンはこちら」からダウンロードできます。
https://hide.maruo.co.jp/software/hidemaru.html

32bit版:
https://hide.maruo.co.jp/software/bin3/hm888b4_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hm888b4_x64_signed.exe
[ ]
RE:09826 V8.88β4No.09827
あべのり さん 18/12/13 11:17 [ コメントを投稿する ]
  >V8.88β4を公開しました。

inputcharが,第二引数なしの場合に従来通りの動作をしていないようです.

#c = inputchar("a");
// 従来までならばキーを押すまでこのmessageは実行されないが,β4では即時実行される
message str(#c);

環境はWindows 10 + 秀丸 8.88β4です.
[ ]
RE:09827 V8.88β4No.09828
秀丸担当 さん 18/12/13 12:09 [ コメントを投稿する ]
 
バグ情報ありがとうございます。
うまく再現できなかったのですが、ソースを確認してみたところ、第2パラメータが無い場合は不定なタイムアウトになってしまっていました。
第2パラメータが無い場合は、確実にタイムアウトは無くなるように修正させていただきます。
β4においては、0を指定しておくと、明示的にタイムアウトなしにして回避できると思います。
[ ]
RE:09826 V8.88β4へのフィードバック(その1)No.09829
ohtorii さん 18/12/15 18:31 [ コメントを投稿する ]
  お疲れ様です。

inputchar関数のタイムアウトに早速対応して頂きありがとうございます!!
試用したフィードバックをお返しします。

以下コードの時に、
while(何か条件を満たすまでループ){
    #input=inputchar("何か入力して下さい",100);
    if(#input==0){
        //バックグランド処理
    }else{
        //キー入力処理
    }
}

タイトルが再描画され点滅するため、
タイトルを変更しないフラグが必要になりました。

(関数の例)
inputchar(s1, show_title=true, timeout=0);
ディフォルト引数は過去のコードに影響を与えないように配慮します。

(関数の使用例)
//タイトル変更は title 関数に任せる。
title "何か入力して下さい";
while(何か条件を満たすまでループ){
    //タイトルは変更せずキー入力のみ行う。
    #input=inputchar("",false,100);
    if(#input==0){
        //バックグランド処理
    }else{
        //キー入力処理
    }
}

ご検討よろしくお願いいたします。
[ ]
RE:09826 V8.88β4へのフィードバック(その2)No.09830
ohtorii さん 18/12/15 21:42 [ コメントを投稿する ]
  お疲れ様です。

inputchar関数のタイムアウトに早速対応して頂きありがとうございます!!
試用したフィードバックをお返しします。

以下コードの時にキー入力の取りこぼしが発生します。
while(何か条件を満たすまでループ){
    #input=inputchar("何か入力して下さい",100);
    if(#input==0){
        //短時間のバックグランド処理
    }else{
        //ちょっと時間のかかる(20〜100msくらい)処理を
        //行っている瞬間にキー入力を行うとinputcharで取得できません。
        //(キー入力の取りこぼしが発生します)
    }
}

多分、この現象は昔から発生していると思いますが、
せっかくバックグランド処理が出来るようになったのに、
勿体ない気がしました。

秀丸エディタの内部実装やマクロの互換性など分からないことは多々ありますが、
inputchar関数から抜けてもキー入力は内部でバッファリングし、
次回inputchar関数が呼ばれたときに1文字返せば良いような気がしますが、
如何でしょうか?


==========
背景
==========
最近、このようなマクロを作成してまして、
https://github.com/ohtorii/command-line
こちらの掲示板にinputcharとrunexの要望を書き込んでいます。

よろしくお願いいたします。
[ ]
RE:09829 V8.88β4へのフィードバック(その1)No.09831
秀丸担当 さん 18/12/17 08:42 [ コメントを投稿する ]
 
確かにそうやってループする場合はタイトルバーは点滅することになります。
やるとしたら、inputcharでタイトルが残るままになる動作よりも、title文で変えたものをそのままにするほうが妥当だと思います。
inputchar関数にタイトルを変えないパラメータがあってもいいと思います。
現状では同じ文字列を指定することで、ほぼそれと同じようなことになると思いますが、以下のような方法でどうでしょうか。
$a="何か入力して下さい";
title $a;
#input=inputchar($a,100);
[ ]
RE:09830 V8.88β4へのフィードバック(その2)No.09832
秀丸担当 さん 18/12/17 09:05 [ コメントを投稿する ]
 
inputchar関数は、どちらかというと、message文やinput関数のようにユーザーインターフェースが切り離されたダイアログのようなもので、それがダイアログを出さずにタイトルバーだけにするというようなものになっています。
他の処理をしてもメッセージキューに溜まったキー操作を拾うのは、keypressedキーワードが適しています。
keypressedを使う方法でどうでしょうか。
例:
disablebreak;
while(1){
  #a=keypressed;
  if(#a==0x1B){//Esc
    break;
  }
  if(#a!=0){
    title hex(#a);
  }
}
message "終了";
[ ]
RE:09831 V8.88β4へのフィードバック(その1)No.09833
ohtorii さん 18/12/17 21:03 [ コメントを投稿する ]
  お疲れ様です。

ご提示の方法で回避できました、ありがとうございます!

>$a="何か入力して下さい";
>title $a;
>#input=inputchar($a,100);
[ ]
RE:09832 V8.88β4へのフィードバック(その2)No.09834
ohtorii さん 18/12/17 21:13 [ コメントを投稿する ]
  お疲れ様です。

ご提示のコードを試してみました、
アルファベット+数値の入力は問題無さそうですが、
"#$%&'()=などのシフトキーを組み合わせた文字入力ができませんでした。

う〜ん困りました・・・
何か良い方法が無いでしょうか?

よろしくお願いいたします。
[ ]
RE:09834 V8.88β4へのフィードバック(その2)No.09835
秀丸担当 さん 18/12/18 08:46 [ コメントを投稿する ]
 
Shiftキーが押されいるかどうかはiskeydownで知ることができます。
例えば以下のような感じでどうでしょうか。

disablebreak;
while(1){
  #a=keypressed;
  if(#a==0x1B){//Esc
    break;
  }
  if(#a!=0){
    title hex(#a)+" shift:"+str(iskeydown(0x10));
  }
}
message "終了";
[ ]
RE:09835 V8.88β4へのフィードバック(その2)No.09836
ohtorii さん 18/12/18 22:01 [ コメントを投稿する ]
  お疲れ様です。

ご提示のサンプルでシフトの押下を取得できましたが、
問題が1点あります。

例えば、shift+2 はキーボードの種類により結果が異なります。

*日本語キーボード(109/109キー)
  "(ダブルクォーテーション)

*英語キーボード(101/102キー)
  @(アットマーク)

マクロ作成者はキーボードレイアウト毎に処理しなければならず現実的ではありません。

例えば、記号を返してくれるkeypressed_exがあると良いのですが・・・
如何でしょうか?

よろしくお願いいたします。
[ ]
RE:09836 V8.88β4へのフィードバック(その2)No.09838
秀丸担当 さん 18/12/19 11:30 [ コメントを投稿する ]
 
keypressedは仮想キーコードなので、確かにキーボードによって違うことがあります。
V8.88β5でkeypressedexをkeypressedex(1)で仮想キーコードではなく文字コードとして取得できるようにしてみています。
[ ]

[ 新規に投稿する ]