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へのフィードバック(そ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へのフィードバック(そ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へのフィードバック(そNo.09831
秀丸担当 さん 18/12/17 08:42
 

確かにそうやってループする場合はタイトルバーは点滅することになります。
やるとしたら、inputcharでタイトルが残るままになる動作よりも、title文で変えた
ものをそのままにするほうが妥当だと思います。
inputchar関数にタイトルを変えないパラメータがあってもいいと思います。
現状では同じ文字列を指定することで、ほぼそれと同じようなことになると思います
が、以下のような方法でどうでしょうか。
$a="何か入力して下さい";
title $a;
#input=inputchar($a,100);

[ ]
RE:09830 V8.88β4へのフィードバック(そ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へのフィードバック(そNo.09833
ohtorii さん 18/12/17 21:03
 
お疲れ様です。

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

>$a="何か入力して下さい";
>title $a;
>#input=inputchar($a,100);

[ ]
RE:09832 V8.88β4へのフィードバック(そNo.09834
ohtorii さん 18/12/17 21:13
 
お疲れ様です。

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

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

よろしくお願いいたします。

[ ]
RE:09834 V8.88β4へのフィードバック(そ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へのフィードバック(そNo.09836
ohtorii さん 18/12/18 22:01
 
お疲れ様です。

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

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

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

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

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

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

よろしくお願いいたします。

[ ]
RE:09836 V8.88β4へのフィードバック(そNo.09838
秀丸担当 さん 18/12/19 11:30
 

keypressedは仮想キーコードなので、確かにキーボードによって違うことがあります。
V8.88β5でkeypressedexをkeypressedex(1)で仮想キーコードではなく文字コードと
して取得できるようにしてみています。

[ ]