Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5ch: SetViewTop() に対応する Getメソッドが欲しい #1388

Closed
k-takata opened this issue Sep 4, 2020 · 6 comments
Closed

5ch: SetViewTop() に対応する Getメソッドが欲しい #1388

k-takata opened this issue Sep 4, 2020 · 6 comments
Labels
enhancement ■機能追加

Comments

@k-takata
Copy link
Member

k-takata commented Sep 4, 2020

https://egg.5ch.net/test/read.cgi/software/1587603412/146

自作のスマートインデントプラグインを作っている者ですが
このたび意図した動作をするところまで漕ぎ着けたのでここに報告します。褒めて下さい

しかし一つどうしてもクリアできない部分があり困ってます
こちらで質問する前にググったら「(現状)無理。」とのこと
よってここに要望を書きます

//要望ここから ----------

・現在の画面スクロール位置の行(画面先頭行)を取得したい。

SetViewTop() に対応する Getメソッドが欲しいです。
ExpandParameter() からの取得でも構いません。

// ここまで---------------

スマートインデント実行後に元の行に戻ると
元の画面スクロール位置(表示位置)とずれてしまいます
実害はないのですが、操作性・視認性を損なうため改善する価値はあります
これはスマートインデントに限った話ではなく、カーソル移動を伴うマクロ全般で役に立ちます

↓過去に同様の話題が出ていたようなのでリンク貼ります

マクロの命令 SetViewTop を使用すると,
表示する一番上の行の行番号を指定することができますが,
現在何行目から表示されているかを取得するにはどうすればよいのでしょうか?
https://sakura-editor.github.io/bbslog/sf/macro/641.html

@berryzplus
Copy link
Contributor

ああ、これ見ました。

「褒めて下さい」に「よかろう」とコメントしかけて放置してました。

Setコマンドの成否を知る方法がない件については #1301 の実現に必要なので、対応はそのうち入れたいと思っています。

現状、失敗を恐れずレビューに参加できるメンバーが絶望的に不足しているので、具体的にどうしたいか決まっているならPRを出してもらった方が早いと思います。

@berryzplus
Copy link
Contributor

PRを出してもらったほうが早い、といいつつ、ここを見る人の9割にとって「無理。」だと思うので少し解説します。

マクロ関数の追加は、とくに難しい作業ではありません。
何故かというと、基本的には既存コードをパクれば動くように工夫されているからです。
どこをどうパクったら望みの機能が実現できるかを見極めるには技術力が要りますが、難易度は低いです。

GetViewTopを作るには、SetViewTopの実装を真似すればよいです。

{F_SETVIEWTOP, L"SetViewTop", {VT_I4, VT_EMPTY, VT_EMPTY, VT_EMPTY}, VT_EMPTY, NULL}, // ビューの上の行数を設定
{F_SETVIEWLEFT, L"SetViewLeft", {VT_I4, VT_EMPTY, VT_EMPTY, VT_EMPTY}, VT_EMPTY, NULL}, // ビューの左端の桁数を設定

先頭部分をみれば定義はMacroFuncInfo型であると判断できます。

MacroFuncInfo CSMacroMgr::m_MacroFuncInfoCommandArr[] =

MacroFuncInfo型の定義はコレなので「ID、名前、引数、戻り値」の順に書いたらよいことが分かります。

struct MacroFuncInfo {
int m_nFuncID;
const WCHAR* m_pszFuncName;
VARTYPE m_varArguments[4]; //!< 引数の型の配列
VARTYPE m_varResult; //!< 戻り値の型 VT_EMPTYならprocedureということで
MacroFuncInfoEx* m_pData;
};

ここで、SetViewTopには戻り値がないことに気付くと思うので、別なマクロ関数を真似たほうが良さそうだと分かります。

妥当なパクリ元を探してファイル内でスクロールをコロコロしてみると、ビューの行数・桁数を取得する関数(GetViewLines/GetViewColumns)が見つかると思います。

{F_GETVIEWLINES, L"GetViewLines", {VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY}, VT_I4, NULL }, //ビューの行数取得
{F_GETVIEWCOLUMNS, L"GetViewColumns", {VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY}, VT_I4, NULL }, //ビューの列数取得

GetViewLinesの実装をパクるためには、キーとなる機能IDを同じように追加してやる必要があります。
なので、機能ID F_GETVIEWLINES をソリューション内でGrepします。結果はこんなんになります。

すべて検索 "F_GETVIEWLINES", 大文字と小文字を区別する, 完全に一致する単語だけを検索する, 正規表現, サブ フォルダー, 検索結果 1, ソリューション全体, ""
  C:\work\sakura-editor\sakura\sakura_core\macro\CMacro.cpp(2328):	case F_GETVIEWLINES:
  C:\work\sakura-editor\sakura\sakura_core\macro\CSMacroMgr.cpp(475):	{F_GETVIEWLINES,			L"GetViewLines",			{VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY},	VT_I4,		NULL }, //ビューの行数取得
  C:\work\sakura-editor\sakura\sakura_core\Funccode_define.h(471):#define F_GETVIEWLINES 40056
  C:\work\sakura-editor\sakura\sakura_core\Funccode_enum.h(472):	F_GETVIEWLINES = 40056,
  C:\work\sakura-editor\sakura\sakura_core\Funccode_x.hsrc(578):F_GETVIEWLINES		= 40056,	// ビューの行数取得
  一致する行: 5    一致するファイル: 5    検索ファイル総数: 721

Funccode_enum.hとFunccode_define.hは自動生成なので、挿入すべきコードは3か所であると分かります。

まずは Funccode_x.hsrc に追加するマクロ関数の機能IDを追加します。
6f0d12d

次に、追加するマクロ関数のスクリプト定義を追加します。
c5a2ad8

最後に、マクロ関数の実体コードを追加します。
34381e9

以上のように、マクロ関数の実装はそんなに難しいものじゃないです。
中身見ればわかると思いますが、ダミーのコミット積むのに5分もかかってないです。

ぼくがこれらのコミットをPRとしない理由は、どうせ誰もレビューできんからです。
レビューできない理由は「覚悟が足らん」の一言に尽きると思っています。
なんか問題があったときに「すまん。」という覚悟が足らんのです。

なのでまぁ、誰かやる気のある人がPRしてくれればそのほうがいいと思ってPRにはしないでおくことにしました。
もっとも、作ったダミーコミットは要件のポイントをわずかにずらしてあるのでそのまま流用してPRできませんけど 😃

@berryzplus
Copy link
Contributor

さすが @beru さん 😃

@beru
Copy link
Contributor

beru commented Sep 7, 2020

#1388 (comment) に追加の手順が詳細に書かれていたので作業しやすかったです。

このIssueをはもう閉じてしまっても良いんでしょうか?それとも自作のスマートインデントプラグインを作っている者さんが Ver 2.4.2 リリース後に成仏したのを見届けてから?

@berryzplus
Copy link
Contributor

引用元要望は100%達成されていると思うので閉じても問題ないはずです。
一応、 @k-takata さん待ちで放置してある感じです。

7末にOSDNでオートインデントON/OFFの判定方法を訊いてた人の要望だと思うので、放置せずに細かく切っていくのがベターだとは思っていますが。

@k-takata
Copy link
Member Author

k-takata commented Sep 7, 2020

一応、 @k-takata さん待ちで放置してある感じです。

えっ、そうだったの?
#1393 の本文に "Close #1388" と書いておいて、マージとともにクローズしてもよかったと思ってますが。なので閉じます。

プロジェクトによっては、リリースしてから issue をクローズするという運用をしているところもありますが、master にマージしたらクローズする運用の方が多いんじゃないですかね。

@k-takata k-takata closed this as completed Sep 7, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement ■機能追加
Projects
None yet
Development

No branches or pull requests

3 participants