Zenモードの隠しオプションが動作しない

  1. Kuroさん、こんにちは。

    Zenモードの隠しオプションについて、気になる点がありましたので報告します。

    MeryではZenモードに切り替えると、最初は行番号やルーラーなどが表示されていますが、文字の入力を始めると、それらが自動的に非表示になります。

    【雑談】Meryと遊ぼうを参照したところ、Zenモードで行番号やルーラーなどの表示・非表示を制御する隠しオプションが、以下の4つ存在することを確認しました。

    • HideLineNumbers:行番号を非表示
    • HideRuler:ルーラーを非表示
    • HideMarks:記号を非表示
    • HideWordCount:文字数を非表示

    そこで、Mery v3.8.9でこれらの隠しオプションを試してみたところ、4つのうち HideWordCount だけは、パラメーターの値を「0」に変更しても文字数が表示されませんでした。

    念のため、ポータブル版のMery v3.8.9をダウンロードしてデフォルトの状態で確認しましたが、結果は同じでした。

    さらに、ポータブル版を使ってバージョンを遡って調べたところ、HideWordCount はv3.7.13までは正常に動作するものの、v3.7.14以降では正常に動作しないことが分かりました。

    こちらの環境だけの問題なのか、あるいはv3.7.14以降で仕様変更や不具合があったのか気になっています。

    お手数ですが、Kuroさんの環境でも HideWordCount についてご確認いただけないでしょうか。

    Mery: 3.8.9 (x64)
    Onigmo: 6.2.0
    C/Migemo: 1.3
    Tidy: 5.8.0
    Hunspell: 1.7.1
    uchardet: 0.0.8
    QuickJS: 0.16.2
    アウトライン: 3.2.5 (Outline.dll)
    Markdown プレビュー: 1.0.7 (MarkdownPreview.dll)
    OS: Windows 11 (Version 25H2, OS Build 26200.9445, 64-bit Edition)

     |  MSY-07  |  返信
  2. こんばんは、ご報告ありがとうございます。

    隠しオプションの HideWordCount ですが、心当たりはありますね😅

    というのも、以前に「Zen モードの文字数表示が常に表示されている。表示したくない」というご要望をいただいたことがありまして。

    そのときに、HideWordCount の不具合の可能性を考えて、確実に非表示になるよう処理を追加したことがあります。

    とはいえ、隠しオプションの廃止を目的としたものではなく、特定の環境で文字数表示が消えない問題への対策のつもりだったと思います。

    その結果、隠しオプションの HideWordCount の効果までなくなってしまっていたようですね。

    HideWordCount の需要がどのくらいあるのかは分かりませんが、とりあえず次のバージョンでは、HideWordCount=0 の場合は従来の処理に戻すようにしてみます。

     |  Kuro  |  返信
  3. > 隠しオプションの HideWordCount ですが、心当たりはありますね😅
    >
    > というのも、以前に「Zen モードの文字数表示が常に表示されている。表示したくない」というご要望をいただいたことがありまして。

    それは「Zenモードの下部の表示について」のことでしょうか。

    > HideWordCount の需要がどのくらいあるのかは分かりませんが、とりあえず次のバージョンでは、HideWordCount=0 の場合は従来の処理に戻すようにしてみます。

    私の場合、Zenモードを使用するときは、文字を入力した後にマウスでカーソルを移動してから、再び文字を入力するという使い方をしています。

    このような操作をしていると、行番号やルーラーなどの表示・非表示が繰り返され、画面が点滅しているような状態になるため、少し目が疲れてしまいます。

    そのため、隠しオプションを設定して、これらを常に表示するようにしています。

    今回、HideWordCount=0 の場合は従来の処理に戻すようにしていただけるとのことで、文字数も常に表示されるようになるのは嬉しいです😄

     |  MSY-07  |  返信
  4. > それは「Zenモードの下部の表示について」のことでしょうか。

    はい、そうです。ソースコードを見ると、文字数の完全非表示にも対応しようとした形跡がありました。

    ただ、そのときは特にご返信もなく、みなさんからのご意見もなかったので、需要がないのだろうなと思い、未実装になっていますね。

    > 私の場合、Zenモードを使用するときは、文字を入力した後にマウスでカーソルを移動してから、再び文字を入力するという使い方をしています。

    なるほど、そういう使い方だったのですね。

    そもそも執筆に集中するためのモードなので、頻繁にマウスでコピペなどが発生する作業では、今回のような表示・非表示の切り替えがちょっと気になってしまうかもしれませんね。

    > 今回、HideWordCount=0 の場合は従来の処理に戻すようにしていただけるとのことで、文字数も常に表示されるようになるのは嬉しいです😄

    ついでに、未実装だった完全非表示の HideWordCount=2 にも対応しておきますね😁

     |  Kuro  |  返信
  5. > そもそも執筆に集中するためのモードなので、頻繁にマウスでコピペなどが発生する作業では、今回のような表示・非表示の切り替えがちょっと気になってしまうかもしれませんね。

    私は、何か動きがあるとついそちらに目が行ってしまう性質なので、Zenモードで少しマウスを動かしただけで行番号などが表示されると、どうしてもそちらに目移りしてしまいます。

    そのため、Zenモードで執筆するときは行番号などを常に表示するようにしていますが、本当はこれらを非表示にした状態で執筆したいと思っています。

    ですので、Zenモードでは、最初から行番号などを非表示にできるようになっていると嬉しいです😊

    > ついでに、未実装だった完全非表示の HideWordCount=2 にも対応しておきますね😁

    それは楽しみですね😄

    もし可能でしたら、HideWordCount=2だけでなく、完全非表示にするための HideLineNumbers=2、HideRuler=2、HideMarks=2 にも対応していただけると嬉しいです😊

     |  MSY-07  |  返信
  6. なるほど、そういう理由だったのですね。

    HideWordCount=0 の件と、ついでに HideWordCount=2 については、次のバージョンで対応しておきますね。

    > もし可能でしたら、HideWordCount=2だけでなく、完全非表示にするための HideLineNumbers=2、HideRuler=2、HideMarks=2 にも対応していただけると嬉しいです😊

    こちらについては、難しいところです。

    というのも、行番号、ルーラー、記号については、現在でも [表示] → [行番号] / [ルーラー] / [記号] などから個別に非表示にできます。

    ただ、HideLineNumbers=2、HideRuler=2、HideMarks=2 のような「Zen モード中だけ完全に非表示」という動作を追加するとなると、話が変わってきます。

    単純に描画だけしないようにすると、画面上には見えていないのに実際には操作できる状態になってしまい、誤操作のリスクが出てきます。

    逆に、実際の表示設定までオフにすると、Zen モードを終了したときに元の状態へ戻す処理や、Zen モード中の [表示] メニューのオン・オフとの整合性なども考える必要が出てきます。

    また、これらはエディターエンジン側の表示処理にも関わってくるため、HideWordCount=2 のように単純に対応できるものでもなさそうです。

    あと、枠やスクロールバーについては、完全に非表示にしてしまうと、サイズ変更やスクロールなどの操作性にも影響が出てしまうので、そこまでは対応しない予定です😅

     |  Kuro  |  返信
  7. > HideWordCount=0 の件と、ついでに HideWordCount=2 については、次のバージョンで対応しておきますね。

    ありがとうございます。よろしくお願いいたします。

    > こちらについては、難しいところです。
    >
    > というのも、行番号、ルーラー、記号については、現在でも [表示] → [行番号] / [ルーラー] / [記号] などから個別に非表示にできます。

    確かに、行番号・ルーラー・記号については、オプション画面などから個別に非表示にできるので、あえて追加する必要はなさそうですね。

    > ただ、HideLineNumbers=2、HideRuler=2、HideMarks=2 のような「Zen モード中だけ完全に非表示」という動作を追加するとなると、話が変わってきます。

    [行番号] / [ルーラー] / [記号] については、Zen モード中だけ完全に非表示にする機能を追加すると、いろいろと問題があること、承知しました。

    > あと、枠やスクロールバーについては、完全に非表示にしてしまうと、サイズ変更やスクロールなどの操作性にも影響が出てしまうので、そこまでは対応しない予定です😅

    枠やスクロールバーについては、私としてはサイズ変更やスクロールなどの操作に使うため、Zen モード中も常に表示されているほうがありがたいです。

    そのため、こちらについては「Zen モード中だけ非表示にする」という対応ではなく、常に表示する形で対応していただくことは難しいでしょうか?

     |  MSY-07  |  返信
  8. 質問があります。

    「Zen モード中」にマウスの移動を停止した後に、一定時間を経過すると行番等が非表示になります。この一定時間は4秒位ですが、この時間を短くする事は可能でしょうか?個人的には1秒位かなと思っていますが、時間を設定できると嬉しいです。

    もし、この時間をTimerで設定しているのであれば、この設定を「0」にした場合は、Timer を実行するのではなく、TimeUp の処理を行えば見かけでは
    HideWordCount=2
    HideLineNumbers=2
    HideRuler=2
    HideMarks=2
    に該当するように思います。

    別件ですが、Delphi13 のライセンスを購入してから、以前購入した Delphi7 のライセンス登録が出来なくなってしまいました。
    現在試行錯誤中ですが解決策が見つかりません(オンライン登録が失敗、ライセンスファイルをメールで送ってもらってファイルを読み込んでも失敗)。

    以前購入した Delphi XE2 のライセンスは Starter で、今回の Delphi13 の購入は Pro なので、こちらは XE2 の新しいライセンス(Pro)を追加で申請し、無事にライセンスの登録ができました。

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

     |  大石剛司  |  返信
  9. >> MSY-07 さん

    > 枠やスクロールバーについては、私としてはサイズ変更やスクロールなどの操作に使うため、Zen モード中も常に表示されているほうがありがたいです。

    枠やスクロールバーについては、たしかに VS Code の Zen Mode などでは常に表示されていますので、「Zen モードでも操作に必要なものは残してほしい」というご要望も分かります。

    一方で、Mery の Zen モードは、必要な情報や操作をあえて制限して、できるだけ執筆だけに集中できるようにする、という考え方で作っています。

    HideBorders=0 や HideScrollBars=0 のように個別のオプションを追加していく方法も考えられますが、そうすると Zen モードで何を隠して何を残すのかを、どこまで設定できるようにするのか、という話になってしまいます。

    このあたりは、ご要望としては理解できるだけに、どこまでやるのがよいのか、ちょっと悩ましいところですね。

    ひとまず HideWordCount=0 と HideWordCount=2 の件とは切り分けて、こちらについてはもう少し考えさせてください😅

    >> 大石剛司さん

    > 「Zen モード中」にマウスの移動を停止した後に、一定時間を経過すると行番等が非表示になります。この一定時間は4秒位ですが、この時間を短くする事は可能でしょうか?個人的には1秒位かなと思っていますが、時間を設定できると嬉しいです。

    内部的には 5 秒で固定していて、オプションなどから変更することはできないですね。

    時間をオプションから変更できるようにすること自体は可能だと思うので、ご要望としていただいておきますね。

    > もし、この時間をTimerで設定しているのであれば、この設定を「0」にした場合は、Timer を実行するのではなく、TimeUp の処理を行えば見かけでは
    > HideWordCount=2
    > HideLineNumbers=2
    > HideRuler=2
    > HideMarks=2
    > に該当するように思います。

    ご推察のとおり、Timer で設定していますが、Delphi のタイマーはそもそも 0 だと動かないみたいですね。

    試しに 1 にしてみたら、マウスを動かすたびにすごい勢いで表示・非表示が繰り返されて、目がぁぁぁ!となりました😅

    > 別件ですが、Delphi13 のライセンスを購入してから、以前購入した Delphi7 のライセンス登録が出来なくなってしまいました。

    ええっ。さすがに、以前購入した Delphi 7 のライセンスまで登録できなくなるのは困りますね…

    > 現在試行錯誤中ですが解決策が見つかりません(オンライン登録が失敗、ライセンスファイルをメールで送ってもらってファイルを読み込んでも失敗)。

    認証サーバー側の事情なども考えられますが、こちらでは状況が分からないので、何とも言えないところですね。

    私も Delphi 10 を購入していますが、最近は GetIt パッケージマネージャーのサーバーが変わってしまったのか、パッケージのダウンロードすらできなくなってしまいました。

    > 以前購入した Delphi XE2 のライセンスは Starter で、今回の Delphi13 の購入は Pro なので、こちらは XE2 の新しいライセンス(Pro)を追加で申請し、無事にライセンスの登録ができました。

    おおー、おめでとうございます。

    とはいえ、過去バージョンへのアクセス権はいつまで維持されるか分からないところもあるので、XE2 のライセンスファイルなどはバックアップしておくと安心かもしれません。

    C:\ProgramData\Embarcadero
    

    このフォルダーをバックアップしておけば、いざ PC が壊れてクリーンインストールすることになった場合でも、ライセンスを復元できる可能性があります。

     |  Kuro  |  返信
  10. > ひとまず HideWordCount=0 と HideWordCount=2 の件とは切り分けて、こちらについてはもう少し考えさせてください😅

    ご検討のほどよろしくお願いします😊

     |  MSY-07  |  返信
  11. Timer の処理ですが、こんな感じではどうでしょうか?

    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
    
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Label1: TLabel;
        Label2: TLabel;
        Timer1: TTimer;
        Timer2: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
        procedure Timer1Timer(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
        procedure ShowInfo(Sender: TObject);
        procedure HideInfo(Sender: TObject);
      private
        { Private 宣言 }
        pMousePos: TPoint;
        pMousePosMem: TPoint;
        ZenModeInterval: Integer;
      public
        { Public 宣言 }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ZenModeInterval := 0;
    //ZenModeInterval := 5000;
      Timer1.Enabled  := FALSE;
      if ZenModeInterval = 0 then
      begin
        Timer1.Interval := 1000;
      end
      else
      begin
        Timer1.Interval := ZenModeInterval;
      end;
      Timer2.Enabled  := TRUE;
      Timer2.Interval := 50;
      ShowInfo(Sender);
    end;
    
    procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      Timer1.Enabled  := FALSE;
      HideInfo(Sender);
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      HideInfo(Sender);
    end;
    
    procedure TForm1.Timer2Timer(Sender: TObject);
    begin
      GetCursorPos(pMousePos);
      Label2.Caption := 'X=' + IntToStr(pMousePos.X) + ' Y=' + IntToStr(pMousePos.Y);
      if pMousePos = pMousePosMem then
      begin
        if Timer1.Interval = 0 then
        begin
          Timer1.Enabled := TRUE;
          HideInfo(Sender);
        end
        else
        begin
          Timer1.Enabled := TRUE;
        end;
      end
      else
      begin
        Timer1.Enabled := FALSE;
        ShowInfo(Sender);
      end;
      pMousePosMem := pMousePos;
    end;
    
    procedure TForm1.ShowInfo(Sender: TObject);
    begin
      Label1.Caption := 'Show';
    end;
    
    procedure TForm1.HideInfo(Sender: TObject);
    begin
      Label1.Caption := 'Hide';
    end;
    
    end.

    よろしくお願いします。

     |  大石剛司  |  返信
スポンサーリンク