秀丸本体からのexport関数の追加要望No.09465
vscode-life さん 17/06/06 23:25
 
いつもお世話になっております、vscode-lifeです。

秀丸本体に備わっている関数 Hideamru_*** の追加の要望となります。

現在のところ、
Hidemaru_CheckQueueStatus
Hidemaru_EvalMacro
Hidemaru_GetCursorPosUnicode
Hidemaru_GetDllFuncCalledType
Hidemaru_GetLineTextUnicode
Hidemaru_GetSelectedTextUnicode
Hidemaru_GetTotalTextUnicode

があります。

これに加えて、マウスの位置からエディタ的勘定におけるLinenoやColumnを
(マクロを経由せず)取得する関数があった方が良いと思います。

Hidemaru_GetCursorPosFromMousePos(LPPOINT lpMousePos, int* lineno, int* column)

のようなAPIです。
(マウスが外にあれば、[-1,-1], 改行の右にあれば、columnは-1)

MicrosoftとRed Hatが定めたlanguage server protocolなどを見ても、
エディタの編集面の分析において、マウスの位置に基づく分析も
要素のひとつですので、
各自でこういったprotocolやsdkを利用して実装するための
「口」ぐらいは確保して頂いたほうが良さそうです。

以上です、ご検討ください。

[ ]
RE:09465 秀丸本体からのexport関数の追加No.09466
秀丸担当 さん 17/06/07 10:24
 

確かにマウスの位置からカーソル位置を得る方法は無く、あったほうがいいと思
います。
今後のバージョンで検討したいと思います。

[ ]
RE:09466 秀丸本体からのexport関数の追加No.09468
秀丸担当 さん 17/06/08 17:27
 

V8.73β7で、Hidemaru_GetCursorPosUnicodeFromMousePosという関数を追加して
みています。

[ ]
RE:09468 秀丸本体からのexport関数の追加No.09469
vscode-life さん 17/06/08 18:29
 
>
>V8.73β7で、Hidemaru_GetCursorPosUnicodeFromMousePosという関数を追加して
>みています。
早速の実装ありがとうございます!

帰宅後、挙動を確認してみます。

[ ]
RE:09469 秀丸本体からのexport関数の追加No.09470
vscode-life さん 17/06/08 22:37
 
>>
>>V8.73β7で、Hidemaru_GetCursorPosUnicodeFromMousePosという関数を追加して
>>みています。
>早速の実装ありがとうございます!
>
>帰宅後、挙動を確認してみます。

BOOL WINAPI Hidemaru_GetCursorPosUnicodeFromMousePos(POINT* ppt, int* pnLine
No, int* pnColumn);

使ってみました。


以下、気づいたことです。

(a) 第1引数の ppt が全く機能していない!?

    pnLineNoや、pnColumnは、渡しているpptとは関係なく
  マウスの位置に基づいて値が決まっているように思えます。

  (pptにはnullptrを渡しても動作に影響せず)
   
(b) エディタの編集領域に「横スクロール」がある際に、linenoの値に統一性がない。

  エディタの一行の文字列が半角180文字だとして、
  エディタで表示しているのが、たまたま半角100文字ほどだとして
  こういった時には、横スクロールバーが出ます。
  
  この時、右にファイルマネージャ等を表示している状態だと、
  「仮想的な編集領域」上にマウスがあるという判定になってしまっているのか、
  行数に有効な値が返ってきています。

   
  編集領域は仮想敵には180文字ほどある。(として)
  今表示しているのは、100文字ほどだ、(としたとき)
  マウスが、下図あたりにあると、
  マウスの下が、実はファイルマネージャ枠だったとしても
  (仮想敵な)編集エディタ領域上にあるものとして
  有効な「lineno」の値が返ってきている。

  ┌─────┬──┐
  │編集領域 │ ←┼この辺(ファイルマネージャ枠上)にマウス
  │     │  │
  ├横スクロールバー┤  │
  └─────┴──┘
          ↑
          └ ファイルマネージャ枠

[ ]
RE:09470 秀丸本体からのexport関数の追加No.09471
秀丸担当 さん 17/06/09 08:32
 

早速のご確認ありがとうございます。
いずれもその通りでした。
それぞれ適切となるように修正させていただきます。

[ ]
RE:09471 秀丸本体からのexport関数の追加No.09475
vscode-life さん 17/06/14 22:44
 
BOOL WINAPI Hidemaru_GetCursorPosUnicodeFromMousePos(POINT* ppt, int* pnLine
No, int* pnColumn);

の挙動について、β8確認してみました。

・座標を指定した場合は、それに対応する行・桁
・(0/nullptr)が指定された場合は、マウスの座標に基づいた行・桁

となっており、関数動作として妥当と思います。
ありがとうございました。

■以下、テスト時に記述した適当ソース
#include <windows.h>

using namespace System;
using namespace System::Windows::Forms;


ref class TestForm : public Form {
public:
    static property Form^ f;

    TestForm() {
        InitDll();
        InitTimer();
    }

private:
    Timer^ t;

    void InitTimer() {
        t = gcnew Timer();
        t->Interval = 500;
        t->Tick += gcnew System::EventHandler(this, &TestForm::OnTick);
        t->Start();
    }

    HMODULE DLL;
    using PFN_F1 = BOOL(WINAPI *)(POINT* ppt, int* pnLineNo, int* pnColumn);
    using PFN_F2 = BOOL(WINAPI *)(int* pnLineNo, int* pnColumn);
    PFN_F1 f1;
    PFN_F2 f2;

    void InitDll() {
        DLL = LoadLibrary(L"hidemaru.exe");
        if (DLL) {
            f1 = (PFN_F1)GetProcAddress(DLL, "Hidemaru_GetCursorPosUnicodeFr
omMousePos");
            f2 = (PFN_F2)GetProcAddress(DLL, "Hidemaru_GetCursorPosUnicode");
        }
    }

    void OnTick(Object^ o, EventArgs^ e) {
        // マウスベース
        if (f1) {
            POINT ppt {0,0};
            BOOL s = GetCursorPos(&ppt);
            if (s) {
                int iLineNo{ -1 };
                int iColumn{ -1 };
                {
                    BOOL s2 = f1(&ppt, &iLineNo, &iColumn);
                    System::Diagnostics::Trace::WriteLine(String::Format("■
{0},{1}, S/F:{2}\n", iLineNo, iColumn, s2));
                    System::Diagnostics::Trace::WriteLine(String::Format("▲
{0},{1}\n", ppt.y, ppt.x));
                }
               
                {
                    // 適当にずらず
                    ppt.x = ppt.x - 40;
                    ppt.y = ppt.y - 40;
                    BOOL s3 = f1(&ppt, &iLineNo, &iColumn);
                    System::Diagnostics::Trace::WriteLine(String::Format("□
{0},{1}, S/F:{2}\n", iLineNo, iColumn, s3));
                    System::Diagnostics::Trace::WriteLine(String::Format("△
{0},{1}\n", ppt.y, ppt.x));
                }
            }
        }
        // カーソルベース
        if (f2) {
            int iLineNo { -1 };
            int iColumn { -1 };
            bool s2 = f2(&iLineNo, &iColumn);
            System::Diagnostics::Trace::WriteLine(String::Format("{0},{1}\n",
 iLineNo, iColumn));
        }
    }
};

__declspec(dllexport) intptr_t abc() {
    TestForm::f = gcnew TestForm();

    return 0;
}

[ ]