プラグイン MeryRowCol エレメント数とタブの計算

 

1行の文字を取得して、行頭からカーソル位置までの文字列を取得します(折り返しがある場合も大丈夫です)。

 

結合文字として1文字毎にエレメント数を取得します。

各エレメントが1以上で、表示できない文字なら文字幅は0、それ以外は2とします。

各エレメントが1で、情報なしなら文字幅は0、特殊文字なら文字幅は0、タブなら文字幅はMeryのタブサイズ、それ以外なら文字幅は1とします。

 

取得した桁数(文字幅の合計値)をタブサイズで割り算した結果により桁位置を計算しています。

 

  //該当行の文字列を取得
  FillChar(Text, SizeOf(Text), 0);
  LineInfo.flags := POS_LOGICAL;
  LineInfo.cch := Length(Text);
  LineInfo.yLine := iPosY;
  Editor_GetLine(hwnd, @LineInfo, Text);
  sStr4 := Text;
  //設定
  sStr6 := Copy(sStr4, 1, iPosx);

  //桁位置を計算
  iNum2 := 0;
  iLen2 := 0;
  sStr9 := ' ';
  for iRow1 := 0 to iPosX-1 do
  begin
    //1文字設定
    sStr7 := MecsCopyC(sStr6, iRow1+1, 1);
    FillChar(LpBuffer, SizeOf(LpBuffer), 0);
    StrPCopy(PChar(@LpBuffer[0]), sStr7);
    //該当文字のエレメント数
    iLen3 := MecsCCSLength(sStr6, iRow1+1);
    //各エレメントの内容
    iValue1 := Ord(LpBuffer[0]);
    iValue2 := Ord(LpBuffer[1]);
    //エレメントが1以上
    if iLen3 > 1 then
    begin
      if      ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFD) = $DFFD)  then
      begin
        iLen5 := 0;
      end
      else if ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFF) = $DFFF)  then
      begin
        iLen5 := 0;
      end
      else
      begin
        iLen5 := 2;
      end;
    end
    //エレメントが1
    else
    begin
      if      iValue1 = $0000 then  //情報なし
      begin
        iLen5 := 0;
      end
      else if iValue1 = $200D then  //特殊文字
      begin
        iLen5 := 0;
      end
      else if iValue1 > $00FF then  //半角エリア外
      begin
        iLen5 := 2;
      end
      else if iValue1 = $0009 then  //タブ
      begin
        iLen5 := IntTabSize;
      end
      else
      begin
        iLen5 := 1;                 //該当外なので半角
      end;
    end;
    //とりあえず加算
    iLen2 := iLen2+ iLen5;
    //余り
    iMod2 := iLen2 mod IntTabSize;
    //無し
    if      iMod2 = 0 then
    begin
      iNum2 := iNum2 + iLen5;
      iLen2 := 0;
    end
    //有り
    else
    begin
      //タブ
      if iLen5 = IntTabSize then
      begin
        iNum2 := iNum2 + iLen5 - iMod2;
        iLen2 := 0;
      end
      //タブ以外
      else
      begin
        iNum2 := iNum2 + iLen5;
      end;
    end;
  end;




プラグイン MeryReadOnly

 

ビューワは自作の「BonsText」を使用していますが、こちらも「Mery」をメインのビューワに移行中です。

 

以前は「表示」の「色の反転」を使用してマクロで作成しましたが、今度はプラグインで作成を試みました。前回使用した「色の反転」はダークモードで使用すると急に明るくなって目には優しくないので、少しだけ色を変更する方法に修正しました。

 

「Mery」の色の設定はプラグインからの直接の設定はできないので「Mery」のマクロを経由して実行しています。

 

ビューワとして使用する場合は、ファイラーから「Enter」で起動して、ビューワで「Enter」で終了するのが一般的です。「Mery」のプラグインはキーボードイベントをサポートしています。早速使用してみましたが、検索画面が最前面にある場合に「Enter」を操作すると検索画面の操作を飛び越えて「Enter」を検知して「Mery」が終了してしまう動作になってしまいました。色々と検討した結果、Delphi 側で最前面にあるアプリのタイトルバーを取得して「 - Mery」の記述があれば編集画面の状態であると判定する方法に到達しました。これで「Enter」で終了させる事が違和感なく操作できるようになりました。ただ、ファイラー側に「Ctrl+Enter」でビューワが起動する機能を追加し、ファイラーで「Ctrl+Enter」でビューワを起動、「Mery」で「Ctrl+Enter」で終了、という一連の操作も可能にしました。

 

 

「書込禁止」アンチェック色で表示

 

「書込禁止」チェック色で表示

 

プロパティ画面

 

MeryReadOnlyのダウンロード

BonsFM - MeryReadOnlyDll(win)

 

 

プラグインの設定

1:使用したいプラグインの「.dll」は、「Mery」をインストールしたフォルダの配下にある「Plugins」に保存します。
2:メニューの「ツール」「プラグイン」「プラグインの設定」をクリックします。
3:保存されているプラグインの一覧が表示されるので、必要であれば「上へ」「下へ」で移動します。「プロパティ」をクリックすると「プロパティ画面」が表示されます。
4:メニューの「表示」「ツールバー」「プラグインバー」をチェックします。
5:右上に「プラグインバー」が表示されるので、プラグインバー左端をドラッグしてドロップすると、表示位置の変更が可能です。
6:メニューの「表示」「ツールバー」「ツールバーのタイトル」をチェックします。

以上で設定は終了です。

「プラグインバー」をクリックすると、クリックしたプラグインが起動されます。
「プラグインバー」を右クリックして「プロパティ」をクリックすると、「プロパティ画面」が表示されます。
「プラグインバー」を右クリックして「キーボードショートカットの割り当て」をクリックすると、キーボードのショートカットが設定できます。



 

プラグイン MeryRowCol

 

エディタは自作の「BonsMemo」と「Mery」を使用していますが、「Mery」をメインのエディタに移行中です。

ビューワは自作の「BonsText」を使用していますが、こちらも「Mery」をメインのビューワに移行中です。

 

「Mery」では、情報として「行」と「列」が表示されますが、「列」は文字単位で表示されます。

全角文字が2文字の場合も、半角文字が2文字の場合も、2文字として表示されます。

半角文字の場合は4文字と表示して欲しい場合があり、何とかできないかと調査しました。

 

プラグインを見て試行錯誤しましたが実現できませんでしたが、「Mery」の作者の「Kuro」さんからアドバイスがあり「MECSUtils.pas」を教えていただきました。

「MECSUtils.pas」は使用していますが、詳細までは理解できていませんでした。読み進めていきながら、文字コードの情報も必要になりました。最終的に出口が見えました。

 

- 行頭の先頭からカーソル位置までの文字情報を取得して、桁位置を計算します。
- 結合文字を考慮して、1文字毎のエレメント数を取得して、各エレメントの内容を取得  して、「半角」または「全角」を判定しています。

- タブ文字 #09 は、設定されたタブ幅から計算して桁位置を計算しています。

 

「Mery」の画面で、画面下のアウトプットバーに表示

 

プロパティ画面

 

MeryRowColのダウンロード

BonsFM - MeryRowColDll(win)

 

【参考】MECSUtils リファレンスの「結合文字列ルーチン」の「MecsCCSLength」
https://ht-deko.com/tech021.html

 

【参考】文字コード

とほほの文字コード入門 - とほほのWWW入門

 

 

 

Thinkpad E480 Windows11 トラックポイント キーボード 無効

 

先日、中古の ThinkPad E480 を購入しました。

 

動作確認を行い、シャットダウンし、その後、電源を入れて起動したら、何故かトラックポイントとキーボードが無効になっていました。

トラックパッドは有効だったので、再起動を行い、 BIOS 画面に入って設定の確認を行いました。

トラックポイントもトラックパッドも有効になっていて、F10 で保存して再起動させたら、トラックポイントとキーボードが有効になっていました。

 

正常になったのでシャットダウンし、その後、電源を入れて起動すると、何故かトラックポイントとキーボードが無効になっていて、この状況は再現性がありました。

1:シャットダウン後は無効になる

2:有効な状態で再起動後は有効になる

3:BIOS 画面に入った後は有効になる

 

WEB を検索しましたがヒントはなく、Windows の設定を片っ端から確認し、最終的に以下の対策で正常になりました。

 

1:「コントロールパネル」
2:「ハードウェアとサウンド」
3:「電源オプションの電源ボタンの動作の変更」

ここの

「シャットダウン設定」の「高速スタートアップの有効」が「チェック」

されている

4:「電源ボタンの定義とパスワード保護の設定の有効化」
の下にある
5:「現在利用可能でない設定を変更します」
をクリックします

6:「高速スタートアップの有効」を「アンチェック」

に変更して

7:「変更の保存」

をクリックします

以上で解決しました。

 

このような設定まで行う事は通常は無いと思いますが、情報の提供という言事で報告しておきます。

 

なお、ThinkPad の X230 Windows10 では、上記が「チェック」でも大丈夫でした。