-
Notifications
You must be signed in to change notification settings - Fork 165
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
マクロ関数の選択開始桁と選択終了桁で取得できる数値が桁数でない #326
Comments
ご報告ありがとうございます。 OSDNフォーラムのほうは「GitHub怖いと感じている人向けの避難所」みたいなものですので、本当は直接Issue投げてもらえるのが一番助かります。 内容は後ほど確認しますね。 |
情報あざっす。 ぼくの認識では、桁位置報告の誤りは既知の問題の認識でした。
「桁」という概念は、サクラエディタ特有の考え方だと思っています。
報告された値からすると、to{行,桁}の桁に入っている値がおかしいですね。 15 = 3 × 5 で、期待値は 3 です。じゃあ 5 はなんだ?と考えると・・・ いろいろと考え方はあると思いますが、
|
いや、原則Issue推奨にしませんか。個人的にはそのほうがありがたいです。この話(issue or osdn)の続きは management-forum で話しましょうか |
@kobake さん、立ててみました。 |
なるほど、そうゆうことだったのですね。 ----- マクロのサンプル -----
折り返さない設定で一行に500文字ほど入力して、 6pxだと少しずれてしまったので、7pxで計算しました。 一先ず、2.3.0.0~2.3.2.0のバージョンでは、上記のサンプルのように使用していこうと思います。 |
http://svn.code.sf.net/p/sakura-editor/code/sakura/trunk2/ に対して svn bisect? (二分探索)で特定しました。 以下のファイルにあるテキストファイルと、報告いただいたマクロファイルを元に 手順
結果まとめ
対応する git の commit66f5d68 です。
66f5d68 の一つ前の
|
66f5d68 ではいっぱい変更点がある。 |
プロポーショナルフォント対応は v2.2.0 の目玉の一つと認識しています。 |
単に書き間違いかもしれませんが、問題は行ではないです。列です。 |
たんに書き間違いです。
sakura/sakura_core/macro/CMacro.cpp Lines 1629 to 1634 in e904d43
呼出行は問題コミットでは触られていません。 絵に描いたようなスパゲティコードなので原因追及は手間取りそうです。 |
う~む、原因っぽいものを見付けました。 ここから解説 diff --git a/sakura_core/cmd/CViewCommander_Cursor.cpp b/sakura_core/cmd/CViewCommander_Cursor.cpp
index 8b614a80..711833e4 100644
--- a/sakura_core/cmd/CViewCommander_Cursor.cpp
+++ b/sakura_core/cmd/CViewCommander_Cursor.cpp
@@ -307,7 +307,7 @@ void CViewCommander::Command_RIGHT( bool bSelect, bool bIgnoreCurrentSelection,
const bool nextline_exists = pcLayout->GetNextLayout() || pcLayout->GetLayoutEol() != EOL_NONE; // EOFのみの行も含め、キャレットが移動可能な次行が存在するか。
// 現在のキャレットの右の位置( to_x )を求める。
- CMemoryIterator it( pcLayout, GetDocument()->m_cLayoutMgr.GetTabSpace(), GetDocument()->m_cLayoutMgr.m_tsvInfo );
+ CMemoryIterator it = GetDocument()->m_cLayoutMgr.CreateCMemoryIterator(pcLayout);
for( ; ! it.end(); it.scanNext(), it.addDelta() ) {
if( ptCaret.x < it.getColumn() ) {
break;
CMemoryIterator it の取得方法が変更されてます。 CMemoryIterator itの取得結果は、移動先の桁位置に影響します。
取得した it.GetColumn() と「キャレットの現在の桁位置+1」を比較して大きい方を取ってます。 通常ルートの移動先位置の決定はこうなってます。 sakura/sakura_core/cmd/CViewCommander_Cursor.cpp Lines 370 to 371 in e904d43
x_maxには最大桁数っぽいものが入っています。 問題になってる
メソッド名に関してのツッコミは一旦置いておくとして、 原因箇所の特定、なんですが一旦コメントを分けることにします。 |
なんだこれ?な追加関数を発見しました。 sakura/sakura_core/view/CTextMetrics.h Lines 59 to 66 in e904d43
関数名は描画単位(ピクセル幅)を返す関数のように見えますが、 引数なし版で固定値1を返していることから、 次のアクションをどうしたらいいか分からなくなってきました。 |
某匿名掲示板で「昔cyclemanにまったく同じ質問が投げられてるじゃん」という書込みがありました。 http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=unicode&v=2364 掲示板ログでは「これはプロポーショナルフォント対応に伴う仕様変更」と説明されています。 選択桁位置を取得する関数をどう仕様変更したら 登場人物(?)の整理
用語と内部構造をマッピングするとこんな感じ。
描画位置の概念は、問題のコミットではいったものです。 次アクションは、「仕様、結局どうする?」の議論なのかなと思っています。 |
今更ですが、この場合元の関数の意味を考えると、元の振る舞いに戻すのが正しい気がします。
これを別名で(今の仕様)で作るのが今回についてはいいような。 既存の関数の振る舞いを変えた方が既存の利用しているマクロに影響が少ない場合も無きにしも非ずですが今回は意味が変わっちゃってますし。 |
同意します。 (ところで、マクロでサクラエディタのバージョンを判定して、バージョンに応じた動作をさせることはできるんでしたっけ。) |
IMPORTANT のタグをつけました。 |
この Issue が何を問題としているのかが自分には不明瞭です。
これらを明確にしたうえで、取得した値が「桁数」であったにしろ「X 座標」であったにしろマクロでそれらの値を取得・設定する限りにおいて違いを意識せずに済むように、マクロ関数同士で対応が取れていれば問題にはならないはずです。 関連するかも知れない余談。Ruby ではあるバージョンから ?X で得られるものが文字定数から長さ1の文字列へと変更されましたが、?X の利用シーンを調べて ?X の受け入れ側で(長さ1の)文字列を受け入れるような変更が同時に為されたために、利用者は ?X の型の変更を意識する必要がありませんでした。 |
Alt + 左右キーによる範囲選択が不必要にピクセル単位で動いてしまうケースがあってギギギギ |
プロポーショナルフォントが入ってきたときに、その関数の期待値がどうあるべきかをあまり議論しないで、もしくは議論する必要性もないまま、実装的にやりやすいほうに倒れているのが現状なのかなと推測しますが、プロポーショナルフォントがないころを考えると、 @beru さん言われるように、
この論点については同意します。 |
「何文字目」というのは「半角文字何文字分」だったのではないかなと思います。そういう要求に対しては旧掲示板でもかさんが対応策が用意されていることを指摘し、問題報告者がそれに応じています。 |
こういうパッチがありますよ>「SAKURA Editor / PatchUnicode / #1047 プロポーショナル版で変更された単語単位移動を戻す」 |
お、確かに。等幅に限定しても半角と全角文字があるので、ちゃんと半角って単位に明言しないと駄目ですね。 |
お、なるほどですね。 |
紹介ありがとうございます。 https://sourceforge.net/p/sakura-editor/patchunicode/1006/ こちらをまず適用しないといけないみたいですね。 両方適用したところ期待する動作になりました。 |
プロポーショナルフォント対応のニーズってどこにあるのか自分は理解していません…。対応するにしても等幅フォント使用時の操作性を損ねてしまうと困るなぁと思います。逆もまた然りなんでしょうけど。 |
@beru さん
経緯はよく分っていません。 文字を綺麗に表示したい要求から来たものと思っていますが、もしかしたら「使えないフォントがある」への対策なのかも知れません。単に「使えないフォント」への対策だとすれば、variadicに描画する必要はないので、「文字を綺麗に表示したかった」の方がよりしっくり来る予想です。 では、文字を綺麗に見せるためには可変ピッチにしないとダメなのか?ということですが・・・。 さて、ここからどうするか・・・。 |
嘘ですよ。そんな使い道のないものに自分がスペースを与えることはありません。
選べるフォントが増えることだと理解しています。矩形選択などを活用したい場合には等幅フォントを選べば済むことです(たぶん)。 |
え、どうやって? 共通設定⇒ウインドウ⇒ルーラーの高さを0にすると、表示されなくなる・・・ 利用バージョンはこれ。
なんか壊してるかしら・・・ |
|
現時点のぼくの理解を追記しておきます。
参考資料
|
「桁」という単位を、できるだけ祖語がおきないように定義してみる。 「桁」とは、
|
ちょっち不正確。
現時点で「桁」のカウント方法は実際の表示幅に依存しないので、利用すること自体は可能。 |
上にも書いていますが、再度私の考えをまとめておきます。
問題は、1回動作を変更してしまったものをもう1回変更しても良いのかというところですが。 |
バグ?の報告です。
OSDNフォーラムとどちらに報告しようかと迷いましたが、
とあったので、こちらに報告いたします。
2.3.0.0~2.3.2.0で、以下の二つのマクロ関数を使ったところ、
桁数ではない値が返ってきました。
・function GetSelectColmFrom() :Integer;
・function GetSelectColmTo() :Integer;
使用環境は以下の通りです。
・エディション Windows 10 Home 64bit
・バージョン 1803
確認に使ったマクロを以下に抜粋します。
ご確認をよろしくおねがいします。
----- マクロのサンプル -----
----- マクロの結果 2.2.0.1 -----
From [2, 2]
To [2, 3]
----- マクロの結果 2.3.0.0 -----
From [2, 8]
To [2, 15]
The text was updated successfully, but these errors were encountered: