/ 最近 .rdf 追記 設定 本棚

log[SakuraEditor: 2009-11-26]



20091126() 無性に DR-Z400Sに乗りたい

最終更: 2011-01-02T16:57+0900

[SakuraEditor] CViewCommander::Command_SEARCH_PREV()

	/* 現在位置より前の位置を検索する */
	bool found = false;
	CLogicRange matchLogicRange = CLogicRange( CLogicPoint( -1, -1 ), CLogicPoint( -1, -1 ) );
	CLayoutRange matchLayoutRange = CLayoutRange( CLayoutPoint( -1, -1 ), CLayoutPoint( -1, -1 ) );
	const SearchPos originalSearchPos = searchPos;
	if( pLayout ) {
		bool retried = false; ///< 末尾から再検索したかどうか。
		for(;;) {
			found = 0 != GetDocument()->m_cLayoutMgr.SearchWord(
				searchPos.y, searchPos.x, // 検索開始位置
				m_pCommanderView->m_szCurSrchKey,							// 検索条件
				SEARCH_BACKWARD,						// 0==前方検索 1==後方検索
				m_pCommanderView->m_sCurSearchOption,						// 検索オプション
				&matchLayoutRange,								// マッチレイアウト範囲
				&m_pCommanderView->m_CurRegexp							// 正規表現コンパイルデータ
			);
			if( retried ) {
				break;
			}
			if( ! found && GetDllShareData().m_Common.m_sSearch.m_bSearchAll ) {
				// From Here 2002.01.26 hor 見つからなかったので末尾から再検索する。
				searchPos.y = GetDocument()->m_cLayoutMgr.GetLineCount() - 1;
				searchPos.x = static_cast<Int>( MAXLINEKETAS ); // とにかく大きければよい。
				retried = true;
				continue;
			}
			if( found ) {
				this->GetDocument()->m_cLayoutMgr.LayoutToLogic( matchLayoutRange, &matchLogicRange );

				// 検索開始位置での幅0マッチはなかったことにして一つ前から探す。
				if( matchLayoutRange.GetFrom() == matchLayoutRange.GetTo()
				   && matchLayoutRange.GetFrom().GetY2() == originalSearchPos.y
				   && matchLogicRange.GetFrom().GetX2() == originalSearchPos.x
				  ) {
					searchPos.x -= 1;
					found = false;
					continue;
				}
			}
			break;
		}
	}

20090808p03@2009-10-19に書いた*結果の一部が上のコ@2009-10-20でちらりと書いた現在の選択範囲が幅0かどうかで検索のその場足踏み対策を行っていたのは不十分だということがわかったので対処するために CViewCommander::Command_SEARCH_NEXT()を同じように書き換えられたら楽だけどトがないからそれは(私家版でしか)できないんだよね

gotoを使っていたりbRedobFlag1という名前の変数があるコドをいじるのは嫌だなあ(だからこそ Command_SEARCH_PREV()は全面書き直しにな)

まあbRedoはわからなくもないいや使われている部分を確認しないとわからないのだがretriedって他人にとっては似たり寄ったりかもしれないので許容しよう(ただしスコープが狭まったことで使用部分の確認がしやすいのは明らかに前進している)書き換えたっていうけどープだって単に飼い馴らされた gotoゃないかと言われるかもしれないしかも上の例では繰り返しを前提としていない(一回で抜けるのが通常パスだ)から意図が不明確になったおそれもあるでもこの関数で使われていたもう一つの gotoのように変数が初期化されない云々のエラーが出るために変数宣言を関数の頭に置くことを要求してしまうそんな使い方はできないことが担保されている(goto end_of_func; のことです)

上のコャレトが行頭にあるときのことを考慮してない(searchPos.x -= 1; の部分)一応問題なく機能してるみたいだけど


 @2009-12-01

もうひとつ問題が見つかって現状が問題ありありならばとザックリ Command_SEARCH_PREV()Command_SEARCH_NEXT()を書き直したどうせ問題続出するんだろうなあとこっそりアップロ

CViewSelectの修正がないとッチの始点と選択開始点が重なったとき(選択範囲が空になるとき)に選択ロックが外れてしまう


 @2009-12-02

 差分のバグ修正1: 対象が幅0の置換が一つ飛ばしになる件

範囲選択中でないときは幅0ッチなどによる検索のやり直しをしないようにした範囲選択中かどうかというのは条件として不十分なんだけどすくなくとも検索前と後で状態が変わるということはいえるCommand_REPLACE()が事前に選択をキャンセルしてくれているのでとりあえずは置換が一つ飛ばしになることがなくなる

 差分のバグ修正2: 検索の再試行位置が元と異なっていた件

aaaaaaa...というテキトをF6による選択ロックを利用して上方向に選択中aaaを下検索する3文字ずつ選択範囲が縮小していくはずのところが1文字ずつしか縮んでいなかったのを元通りにした

 日記のバグ修正

) SEARCH_PREV, SEARCH_NEXT

) Command_SEARCH_PREV, Command_SEARCH_NEXT


 @2009-12-03

 差分のバグ修正3: すべて置換が無限に続く件

すべて置換の無限置換対策としm_pCommanderView->GetDrawSwitch() // 全て置換の実行中じゃないという条件(見落としていた)を元のソースからコピってきた

 差分のバグ修正4: マウスクリック0文字選択されたという旨のメッセージが表示される件

CViewSelectの変更がステータスバーメッセージの不要な表示につながっていたッセージ表示部にそういうチックをさせてーソル位置による選択範囲変更で幅0選択を可能にする(昨日の修正)部分は残したいけど影響範囲を延々たたいていくようなことになったらいやなので CViewSelectの変更は取り消し

F6でロックしてキャレトを動かしまた元の位置にもどす。この状態でダイアログを出して検索をすると選択範囲の拡大縮小ではなくッチ結果が選択されてしまうこんなことが起こるならやはり昨日の修正を温存したくなる不思議なのは ANSI版も同じ挙動だったのだがUNICODE版ではきちんと選択範囲の拡大縮小になっていたこと<<< どうや「カーソル位置の単語文字列をデフトの検索文字列にするの設定が違っていただけみたい

CViewSelect.IsTextSelected()には0文字選択を含むのか含まないのかはっきりしてほしい定義からは 0文字選択を含んでいるがIsTextSelecting()というものの存在からは意図としては 0文字選択を含まないようにもとれるなんにせよ CViewSelect.ChangeSelectAreaByCurrentCursorTEST()が幅0選択を特別扱いして選択解除するのは意図がわからないし仮に目的があったとしても不適切あるいは不完全な処置だろうと思う問題は選択解除によって IsTextSelected()trueから falseに変わることでIsTextSelected()は本当にあちこちから呼ばれているので ChangeSelectAreaByCurrentCursorTEST()の変更は影響範囲が広すぎる(ステータスバーメッセージもそのひと)

そもそもkeepCurrentSelectionの条件に CViewSelect.IsTextSelected()は不要に思えるのでこれを外すことで対処元のソースをできるだけ尊重するつもりでこうしてあったんだけど

 差分のバグ修正5: 「末尾から再検索しましたが表示されない件

「末尾から再検索しましたが表示されないのは条件「先頭から再検索しましたと同じになっていたからでした(不等号が逆向)

 その他

CViewSelect.cppの修正は幅0なら何もしないのではなく () elsepSelect->Set(ptCaretPos);と同じことをしていたつもりです。m_nLastSelectedByteLen = 0; // 前回選択時の選択バト数の扱い方がわかっていないのですが選択解除もしていないの「前回選択時の~というのはあたらないのではないかと

コメトで指摘されて rev2で導入した sel.IsTextSelected()sel.IsTextSelecting()に変更したのはCViewSelectの変更を取り消したことによって検索結果による選択範囲の拡大(縮小)の結果が幅0になったときに sel.IsTextSelected()falseになってしまうことへの対策(選択開始点から先へ検索が進まなくなってしまうの)


本の: シンタックスシュガーとしてのlambdaの解説

ifの条件文に &&||3つも 4つも連なってくると 1つの Predicateにまとめてしまって名前を付けたくもなるでも struct{ bool operator()() const {...} } IsHoge; と書くだけでも面倒なのにスコープが断絶してしまうために判断に必要な変数にアクセスするためにはコトラクタで参照を受け取ってメンバ変数に保存しなければならないトラクタを書くために型名も付けなければならないもうねってられないどうせコンパイラの最適化で消えてしまうコドを長々と書くのは無駄消えなければもっと無駄はやく lambda


 @2010-03-31: 応急パッチ

http://sakura-editor.svn.sourceforge.net/viewvc/sakura-editor?view=rev&revision=1724

とにかく無限ループで強制終了しかできなくなるのは良くない

* #0の上検索がいつまでもその場足踏みしてないで上へ進むように修正 #ャレトより前の0の行頭マッチがハイラトできていなかったのを修正(あんまりやりにくいので CViewCommander::Command_SEARCH_PREV()から gotoを取り除いて不必要に選択範囲を保存するのをやめた)

 CViewSelect.IsTextSelected() -> return CLayoutRange m_sSelect.IsValid() -> return CLayoutPoint m_ptFrom.BothNatural() && CLayoutPoint m_ptTo.BothNatural()BothNaturalという名前だけど実際は xyが共に 0以上かどうかをテトしている選択範囲の始点と終点の X,Y座標がすべて 0以上のとき CViewSelect.IsTextSelected()trueを返す。

本日のツッコミ(8) ッコミを入れる

ななしfix_searchword_selection_with_selectinglock_on 置換前:$ 置換..

ななしてけと CViewCommander.cpp 【追加】 3116: const bool wasSelected..

ななし 3158: (sel.IsTextSelected() && matchLayoutRange.GetF..

ななしrev2 「先頭(末尾)から再検索するONにしているのに 末尾から再検索して「▲末尾から再検索しました ..

なな「選択幅ゼロは自明なので一切表示しなくていいと思います。

ななしCViewSelect.cppの修正は 幅0なら何もしないのではなく 以下のようにしたほうが良くないですか? ..

ななしrev2す。 abc というテキトで 置換前:abc 置換後:xyz 先頭(末尾)から再検索する:ON 置換..

ななし※同じく置換後を abcxyz置換対象を[選択文字(0)]としても起きた


20091120() DDセイバーオルタはやばい限定販売でよかったね

最終更: 2010-04-08T22:28+0900

[SHJS][SakuraEditor] 色分けにこんな機能があると便利

参照(説明の丸投げ)> タの Lex 周り - miau's blog?

SHJSと萌共通の泣き所そもそも論を言えば入力に対応した stateを一つ一つ定義していけば対応できなくもないしRubyの括弧を使った %記法%r(pattern)flag のようなものでは括弧に分類される文字種が 4つしかなかったために実際そうしたのだが非英数1ト文字や識別子が使えるとなると状態数があっという間にふくれあがってしまう

SHJSの場合はJavaScriptであることと eval()で評価されることを利用してネイブの RegExpオブジトの代わりに execメソドと lastIndexプロパを定義したオブジトを登録することで抜け道を用意できるように感じたがどんな形で特定のキャプチャを参照するのか決めかねた

今日試しにダウンロドしてみた K2Editorではヒドキュメトの色分けが可能なようだ配布パッケージに含まれる Ruby.txtK2Editor.chmによると書式はこう

・<<(["'`]?)(\w+)\1 .... ^$2$
    ヒアドキュメント1。後ろのディスクリプターは行内に唯一でなければ
    ならない。

右側の検索文字列には後方参照が使えます。 左側で()でくくってグルーピングしたマッチ文字列を 右側の検索文字列の中で取得できます。

取得するには K2Editorの置換機構の 後方参照と同じように$1,$2などを使います。

\1\2でなくて $1$2だから右側のパターンは左側のパターンマッチングが終わった後で置換されてからコンパイルされるのかも

SHJS(と萌)にあてはめた場合$1$2がどのマッチングのキャプチャを指しているのかが明らかではないというところで二の足を踏んでいる次第

 @2010-04-08: くわえて

  formatted_text = <<TEXT.strip.gsub(/\t/, " "*8)
TEXT
  texts = [<<TEXT1, <<TEXT2]
TEXT1
TEXT2

こんなんどうする?

最終更: 2009-12-06T02:34+0900

[SakuraEditor] 再度WSHプラグイン

たとえば、http://sakura.qp.land.to/?Junk%2F31 で展開されている GNU Global対応息の長い支持があるが本体に取り込まれてはいないこういう万人向けでない機能がプラガブルになっていると

  • タ本体「大きなパッチを取り込んでバイナリを肥大化させたり安定性を損なうリスクを避けられる
  • 本体とは別のサイクルでまたーザーサドで GNU Global対応を進めることができる
  • 機能が不要な人はイールしないから目にすることもコトを払うこともない

プラグイン化を推し進めると不要な機能をそぎ落としてメニーも整理して必要な機能は自分で用意する自分だけのエタになる

っていうのが xyzzyEmacsの方向性? そう思うと途端につまらなく思えてくるのは何故? プラトフームだと思うとアイデンィテが希薄に感じられるのとなんでもできる/やろうとする/できてしまう無節操さが嫌いなのかも

ったい自分はどうしたいんだ?

なんでもできるエタでやりたいことだけを可能にする!?

でも実際はタなんてなんでもいい&使い比べもしないものぐさな人間だということを行動が示している最初はメモ帳でスクリトを書いていてエラー行を見つける手段(行ジャンプ行番号表示)がないのに困って最初にダウンロドした TeraPad23年使い正規表現検索がないのを不便に思って最初にダウンロドしたサクラエタを 5年以上使いースが公開されてるもんだから色分けの不足を補えてしまって萌タをカスタマイズする機会を逸したまま現在に至る名前の良さと最初から大概のことができる間口の広さで誘い込まれースをいじる究極のカスタマイズができる自由さで閉じ込められた

  1. 見た目がよくて(ダウンロ)
  2. (適切なデフ複雑すぎない設定など)っつきがよくて(しばらくつかってみよ)
  3. 幅広いユーザーのニーズを満たす機能セトが揃っていて(使用をやめる理由がな)
  4. なくても困らないニッチな要求にも応えられる(乗りかえる理由がな)

という要素を自分は求めている(らしいサクラエタに最初の二つはなかったが必要だとは思う)のでプラグイン化で機能をそぎ落とせる必要はなくそれなりに需要のある機能をプラグインで置き換える必要もないかもしれないプラグインの本命はニッチな機能取り込むには大きすぎる機能ライフサイクルの異なる機能の実現にある……がなんでもプラグインにしてしまって柔軟にデフトを設定できるような状態にしておくというのもやはり魅力的だ(それにデフトのタイプ別設定(AWKアセンブラCOBOLJavaTeXVisual Basec……)のうち使わないものは目にするのも嫌だという人種(潔癖だね)が一定数いるらしいからそれに応えることにもな)

っていうのが Linuxの現れては消えるトリビーション? 適切なデフトが対象別に無数に存在する状態を適切なデフトが用意されているとは言いたくないな適切なデフトはとっつきの良さのために導入した指標だから(:Linuxの話ではない)

この展開の着地点を Windows ということにしてみようタ界の Windows普及(利益)を目指すなら当然の帰結とかいってとりあえず Linuxには何も考えずこれを入れとけっていう強力なトリビーションが一つだけほしいね(Ubuntuが五年後も続いていたらいいポジション)


20091105() [Vista] まただーソル移動がもっさりすると思ったら

最終更: 2009-11-19T05:26+0900

[SakuraEditor] 前略

  1. 矩形選択範囲が勝手に折り返し桁まで拡大されるのが嫌なのでまずそこをコメトア(不自然な動作を持ち込んだ上にその理由を説明しないのであれば削除されて当)
  2. そうすると矩形選択範囲が幅0のときに一切の文字が挿入されなくなるので選択範囲の幅に頼った間接的かつ誤った条件判断を正す。(正すと書いたがいまの条件判断が正しいという確信はない明らかな誤りはなくせた)

すくなくとも幅0の矩形選択で改行の手前にタブやスペースを挿入できるし選択範囲の勝手な拡大も行われないが折り返しが絡んでくるとどのように文字が挿入されるのが正しいのかなんてわからないのでそこんところは考慮外

折り返しの結果として行頭に改行がきている場合もタブやスペースが挿入されなくなるはずと思って試したら予測不可能な結果にもともと折り返し行に対して文字を挿入すると挿入した結果により折り返される位置が変化してしまい結果がどんどん予測不可能になっていくんだけどそれを上まわるかもしれない

Index: sakura_core/CViewCommander.cpp
===================================================================
--- sakura_core/CViewCommander.cpp	(リビジョン 42643)
+++ sakura_core/CViewCommander.cpp	(リビジョン 42644)
@@ -4733,11 +4733,11 @@
 	// From Here 2001.12.03 hor
 	/* SPACEorTABインンデントで矩形選択桁がゼロの時は選択範囲を最大にする */
 	//	Aug. 14, 2005 genta 折り返し幅をLayoutMgrから取得するように
-	if((wcChar==SPACE || wcChar==TAB) && m_pCommanderView->GetSelectionInfo().IsBoxSelecting() && GetSelect().GetFrom().x==GetSelect().GetTo().x ){
-		GetSelect().SetToX( GetDocument()->m_cLayoutMgr.GetMaxLineKetas() );
-		m_pCommanderView->RedrawAll();
-		return;
-	}
+	//if((wcChar==SPACE || wcChar==TAB) && m_pCommanderView->GetSelectionInfo().IsBoxSelecting() && GetSelect().GetFrom().x==GetSelect().GetTo().x ){
+	//	GetSelect().SetToX( GetDocument()->m_cLayoutMgr.GetMaxLineKetas() );
+	//	m_pCommanderView->RedrawAll();
+	//	return;
+	//}
 	// To Here 2001.12.03 hor
 	wchar_t szWork[2];
 	auto_sprintf( szWork, L"%lc", wcChar );
@@ -4833,7 +4833,8 @@
 			nDelLen = nIdxTo - nIdxFrom;
 
 			/* TABやスペースインデントの時 */
-			if( bIndent && 0 == nDelLen ) {
+			const bool emptyLine = ! pcLayout || 0 == pcLayout->GetLengthWithoutEOL();
+			if( bIndent && emptyLine ) {
 				continue;
 			}
 

 @2009-11-08

隠し機能がでてきましたよ>矩形選択時のSPACE/TAB動作に手を入れる場合実装上>>dev:4103 あたりのSPACE/TABインデト仕様を実現するための実装部が絡んできそうで

これだから迂闊なことはできない自分用だと自分が使う範囲で問題がない限り気にしないで済むけど

リンク先で議論されている桁揃えのためのインデ(条件によりタブやスペースが挿入されない行がありその結果インデトが揃う)(レイアX座標)を文字単位の座標に変換するときに中途半端な(=文字途中を指す)レイアト座標が正規化されることに依っているのかな?

矩形選択はつっつくと魔物が出てきそうだ正解がわからないから2ト文字が分割されるなど明らかな不具合以外は実装が仕様になってしまいそう


挿入位置の文字の末尾が矩形選択範囲に含まれていないときにインデト用の文字を入力しないことでインデト揃えができるように追加修正した版 > fix_indentation (4.1KiB, diff to trunk2@1674)


矩形選択時その範囲内に文字がない状態でインデトすると桁が揃うようにスペースを補完します。それ以外の場合範囲内に文字のない行はインデト対象外になります。

hor氏のヘルプ

「範囲内に文字のない行は考慮外だったけど怪我の功名で改行の後ろにインデト用の文字が挿入されないようにもなっていた>fix_indentation


あいう
abc

というテキトの一桁目(「あの前半a)

^   ABC
DEF

というテキトの一桁目(タブの前半D)を矩形選択してタブやスペースを入力すると珍妙なことになるのは変わっていない普通の文字を入力した場合は右移動で入力された文字の幅だけ移動することが決まっているけど入力された文字がインデト用の文字でそれが挿入されなかった場合右移動の移動幅がもともと選択範囲にあった文「あの幅になってしまうのが原因

一応入力された文字の幅を考慮して右移動しているけど右移動を行うのが選択範囲の一行目だからこの場合一回右移動するだけで行き過ぎてしまう

それも修正 > fix_indentation.rev2 (5.3KiB, diff to trunk2@1674)

問題の存在がわかれば叩きようも考えられるけどそれがわからなければ手の打ちようがないト重要


どうして(幅のある)文字の先頭部分が矩形選択範囲に含まれているときだけインデト用の文字を挿入ではなく文字の末尾が含まれているときだけなのかといえばおそらくそうでないとインデトの桁揃えができないから実際に試してみればすぐわかるけど文字の先頭を条件にするとほとんど常にインデト文字が挿入されてしまって桁揃えにならない


現在認識している問題点

  1. トタブ設定のときに桁揃えができていない
  2. 入力がインデト用の文字のときにも矩形選択の幅0を維持するようにした結果CViewCommander::Command_INDENT_TAB()

    if(m_pCommanderView->GetSelectionInfo().IsTextSelected() && m_pCommanderView->GetSelectionInfo().IsBoxSelecting() && GetSelect().GetFrom().x==GetSelect().GetTo().x){
    	Command_INDENT( WCODE::TAB );
    	return;
    }

    このコドが発動してしまいトタブ設定にかかわらず常にタブ文字が挿入される

修正した>fix_indentation.rev3 (5.8KiB, diff to trunk2@1674)

1つ目は fix_indentaiton.rev2のバグ意図せず bIndent引数を trueから falseに変更してしまっていることがあった2つめは該当コドを削除したもうひとつ fix_indentation.rev2のバグ0の矩形選択のときにもインデト用の文字の挿入をうっかりスキップすることがあった


 @2009-11-09

指摘を受けて修正原因は rev2のタイポ指摘を受けたケースは fix_indentationのときにしかテトしていなかった> fix_indentation.rev4 (5.8KiB, diff to trunk2@1674)

本腰を入れて読んでいなかったというか自分でやってみた今だからこそよく理解できるんだけど、4127で実際に文字を挿入された行をもとにして選択範囲を移動することが既に行われているさらに気になってはいたけどそのままにしていた全角文字がはみ出すことへの対処も行われているなんて車輪の再発明っと違う点を見つけるなら文字を挿入された行をもとにするだけでなく選択範囲から文字がはみ出していない行をもとに選択範囲の移動量を決定しているところだろうだから 4138の指摘を rev2改めrev4では回避できている


っこ非互換ではないけれど

あいうえお
1かきくけこ

という行で幅1矩形選択をしてインデト用の文字を入力するとおかしな事になる文字を挿入するときは幅0選択でいいじゃないかと思っていたが全角半角が混じるといつでも幅0で選択できるとは限らない2以上であれば問題は起こらないのでこれはインデト揃えの弊害右移動に頼らず直接入力文字のレイアト幅を計算して選択範囲を移動すればなんとかなるかも方法は知らないけれど

ptLayoutNewを使って計算< 上の例で考えると矩形選択範囲に入るのは一行目と二行目をあわせてもある文字の前半と別の文字の後半だ前半だけの行にはインデト文字が挿入されないから入力のレイアト幅を知るためには使えない後半だけが入っている行では挿入位置として与えるのが文字の真ん中を指すレイアト座標ってくる ptLayoutNewが相変わらず文字の真ん中を指す座標だとは考えにくい最大でタブ幅-1のずれが生じたりしないだろう(一人: ptLayoutNewって名前から CLayoutのイスタスだと思っていたpゃなくて ptったと)

オプション化不要と書いたとたんのこの難題どうしまし


とりあえずインデト文字のうちスペースを入力したときに選択範囲が全角文字の前半部分ばかりを移動してしまって全く入力が行われないのを改善した>fix_indentation.rev5 (7.8KiB, diff to trunk2@1674)

また従来は矩形選択範囲が折り返し桁に達した場合行番号はそのままで選択範囲が行頭に移動して循環していたが折り返し桁でとどまるようになったこれは意図したものではないが従来の挙動を期待する人がいるとも思えないのでそのまま

折り返しといえば

1|ABC<
2|DEF<
3|GHI<

CFIを矩形選択して _を入力したとき_FIの直前に入力されるわけではないというのはどう考えられているのだろうこれがあるから矩形選択入力と折り返しを組み合わせてはいけないどんな結果も期待してはいけないと思っている


タブが入力されたときもおかしなことにならないように改善した>fix_indentation.rev6 (8.4KiB, diff to trunk2@1674)

原因はインデト文字の入力をスキップされた行が取り残されることにある入力がタブだったりしたら 8桁分選択範囲が後ろに移動することもあるわけでそのとき選択範囲の中に収まっている文字はタブの入力をスキップされた行においてはーザーが最初に選択した文字とは全く異なっているインデト文字の入力スキップがインデトを揃えるためにあるというのならば実際そこにインデト文字があるかどうかをチックしてあるときだけ入力をスキップすればよい条件を厳しくすることで全角文字が取り残されることがなくなった

1行目と 2行目をどこでも幅1矩形選択してタブを入力する最初に選択した文字が取り残されないことを確認する

あいうえお
1かきくけこ

4タブ設定「うの前半「きの後半を幅1矩形選択してタブをいくつか入力したとき初回だ「うが後ろに行きすぎるこれはもうあきらめている


 @2009-11-10

0123456789
あいうえお
1かきくけこ
(TAB幅は4の設定)

で、1行目の「4」の左から3行目の「き」の右までを矩形選択(幅1桁)して
TABを3回入力すると、1行目の「4」の左右にTABが入ります。 

これは「これはもうあきらめている(@2009-11-09)ースなんですよね事前に選択行をすべてチックする必要があるように思えたので……*っとやってみます

行番号が55行ほどずれてしまっていま...

っかりしていました矩形選択中にカーソルが折り返し桁一つ手前で折り返してしまうことの対策と同じブランチを使っているせいだと思います。

 Editor.Char(9) と Editor.IndentTab() の使い分け

すでに BOOL bIndent引数が存在するのだからこれを厳密に適用しようということですね悪くないと思いますし対象も重なっていますがっしょくたにしていいものか……


矩形選択範囲がタブ境界にあり全角文字の前半分が範囲からはみ出しているときにタブを挿入すると行によりタブの幅が最小と最大になってしまい選択されていた文字を選択範囲内にとどめることができなくなってしまう問題に対処した>fix_indentation.rev7 (10.2KiB, 今度こそ diff to trunk2@1674)


 @2009-11-11

あいうえお
1かきくけこ

で、「い」の左から「き」の右まで矩形選択します。
まず、「さ」を入力します。
次に、「a」を入力します。
結果、1行目には「さ」の手前に「a」が入ってしまいます。 

不安に思っていてでも知らぬが仏とばかりに追求しようとしなかった部分(全角文字の入力)を見事に突いてきますね(すごくありがたいで)

TABを含めた文字列をクリップボドから貼り付けた場合

この場合はインデトではありませんし揃えることよりもクリップボドの中身を指定された場所に貼り付けることが第一だと思います。これまで通り

'int' から 'CLayoutInt' に変換できません

直しました個人的にデバッグモドのエラーを潰すためだけに CLogicInt(0)static_cast<CLogicInt>(0)と書かされるのが嫌なのですねせめて警告にしろと(無視する気満々)っても仕方ないです


三日前から毎日これぞ決定版と思ってるんだけど今日こそ >fix_indentation.rev8 (10.8KiB, diff to trunk2@1674)


 @2009-11-12

 selectionIsOutOfLineの判定条件が(たぶん)おかしいです。
(括弧が足りてない気がします)

詳細なレポトありがとうございます。条件演算子の優先順位は &&||の次ですからっしゃるとおり reachEndOfLayout && の部分も含めて ? の前と後ろの二つにわかれてしまっています。)A&&B?C:D)A&&(B?C:D)

一日を失う手痛いミス >fix_indentation.rev8.1 (10.8KiB, diff to trunk2@1674)


 @2009-11-13 メモ

  • タブキーとスペースキーにはそれぞTABインデSPACEインデ機能が割り付けられている
  • ABという文字の入力は ABというキーに割り付けられた機能によるものではない
  • タブキーとスペースキーに割り付けられた機能を削除してもタブやスペースの入力が行える
  • ただしトタブTABインデの機能
  • 選択範囲をタブやスペースでインデトできるのももちろTABインデ」とSPACEインデの機能

インデト揃えにからむ機能のオンオフを機能の割り付けでコトロールできるかと思ったがTABインデトが高機能なので取捨選択ができなければ意味がない

タブインデトとタブ文字の入力を区別>fix_indentation.rev9


 @2009-11-15

矩形選択入力で(TABインデトや SPACEインデトによらない)タブやスペースを改行文字の後ろや空行にも挿入するように矩形選択中のTABインデトと区別されるタブ文字の入力と SPACEインデトと区別されるスペースの入力は前例がないので自由に変更しています。>fix_indentation.rev9.1 (13.4KiB, diff to trunk2@1674)

rev9.1を眺めていて従来の動作に疑問テキトが選択されていなかったり選択範囲が一行だけだったときCommand_INDENT_TAB()Command_INDENTの代わりに Command_WCHAR()を呼び出す。これにより選択範囲が一行のときだけインデトではなく選択範囲がタブで上書きされる潔癖より実用本位ということだろうけど


 収支

わかっている範囲では以下の四つが改善され二つの非互換が確認されている

  • 矩形選択で改行文字の手前にインデト用の文字(タブとスペース)を挿入できる

    ABC
    ABC

    Cの後ろを幅0矩形選択してスペースを二回入力して(なぜか)全体が選択されたあと行頭がインデトされたりしないことを確認する

  • 矩形選択範囲の先頭が全角文字やタブなど幅広の文字のときインデト用の文字の挿入が桁揃えのためにスキップされても選択範囲の移動幅が入力文字と異なることがない

    あいう
    abc

    一桁目(あの前半とa)を矩形選択してスペースを二回入力し(奇妙に) aの前と後ろにスペースが挿入されたりしないことを確認する(あをタブにするともっと極端な結果を確認でき)

  • 矩形選択範囲が全角文字の前半ばかりを移動してしまいスペースが入力できなくなったりしない

    あいうえお
    1かきくけこ

    1行目と 2行目をどこでも幅1矩形選択してスペースをいくつか入力し入力が連続してスキップされないことを確認する

  • 矩形選択してタブを入力したとき最初に選択されていた文字を置いてきぼりにして選択範囲が後ろに移動したりしない

    あいうえお
    1かきくけこ

    1行目と 2行目をどこでも幅1矩形選択してタブをいくつか入力し最初に選択した文字が範囲内に残っていることを確認する

  • (非互) 矩形選択中に文字を入力し続けたとき範囲が折り返し桁から行頭にループしない
  • (非互) タブひとつの貼り付けスペースひとつの貼り付けTABインデトを割り付けていないタブキー入力SPACEインデトを割り付けていないスペースキー入力で矩形選択中のインデト揃え機能が発動しなくなったまたほかの文字と同じように改行の後ろや空行にもそれらが挿入されるようになったEditor.Char(9)Editor.Char(32)の結果も同じように変わっているはず。

 @2009-11-18

(何人いるのかわからない)ななしさんに協力してもらったということもあるのでッチにして投稿しなければいけないとは思っていたがあまりに次々バグ報告が来たので寝かせておく期間が必要かもとも思っていたでも目を通した上で代わりにやってくれるのは歓迎です。>unicode:1054, SourceForge.net: Sakura Editor: Detail: 2899665 - 矩形入力動作の改善

追加修正もあるようで

  • トタブ設定のときに挿入するスペースの数を選択一行目だけで判断せずすべての行(文字の前半分だけ選択範囲からはみ出してる行なども含めて)に対して適切な数を選ぶ
    • っとできる対処が思いつかなかったので見て見ぬふりをしました
  • Command_INDENT()Command_WCHAR()の交差した呼び出しを解消
    • 内部の話
  • SPACEインデトによる全角文字の左側揃え選択幅1のときは全角文字の凸凹を調整して揃える(>>dev:4136)
    • どこを選択してスペース3つなのかが書いていなかったので読み飛ばした部分です。

元に戻った点も

  • 0矩形選択時のインデトで選択範囲最大化
    • 今日の日記の最初をみるとわかるが掲示板に投稿され「改行文字直前の幅0矩形選択インデトが行頭インデトになるのを修正するのはついでで範囲が勝手に最大化されるのをやめることが個人的なスタト地点だっただか「微妙だが自ら引導を渡すほど忌むような挙動でもないかな?という見方には同意できないがこのパッチにより矩形選択範囲が幅0であることに特別な意味がなくなるので野良パッチ野良ビドで対処しやすくはなる前進

ダウンロドしてパスは通していたものの今日初めて patch.exeを使ったつまずいた点は

  1. ッチに記述されたパスにあうようにカレトリを設定したなら -p0 オプションが必要(デフトの動作ではパスを無視してファイル名だけをみるた)
  2. Subversionがよく出力する LF/CRLF混合の差分は受け付けなかったのでCRLFに統一

GNU patch5年ぶりにバージョンアップ バージョン2.6リリス:CodeZineなんて話題が今月にあったけどールされていたのはこんな patch見慣れた名前があります。

patch 2.5.4
Copyright 1984-1988 Larry Wall
Copyright 1989-1999 Free Software Foundation, Inc.

This program comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of this program
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

written by Larry Wall and Paul Eggert

* 追記@2009-11-18 http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=dev&v=4137#4137 にまさにその手順が書かれていたっと見で理解できなかったので例によって読み飛ばしていたというよりこの例は再現手順に不備があるので問題の所在から理解できていなかった

本日のツッコミ(25) ッコミを入れる

Before...

ななしデバッグモドでコンパイルすると4883行で error C2440: 'int' から 'CLayoutInt..

ななしrev8す。 あいうえお 1かきくけこ 0123456789 「いの右側から3行全部を0幅選択してスペ..

ななしrev8.1OKな気がします。 いい感じ (^^)

anonymouse「1文字のTAB/SPACE入力が必ずインデト扱いになってしまっていて変 (20091110() 10..

ななし念のため 上記の タブキーとスペースキーに割り付けられた機能を削除すると  複数行選択したときのタブやス..

ds14050ええと具体的にどういう動作が不満でどういう結果になるのがよいのでしょうrev.9版のバイナリは http:/..

ななし行末を超えた位置にも通常文字は入る SPACEーにインデトを割り付けて*いない*ときは 行末を超えた位置に..

ds14050この部分ですね ---- if( nDataLen == 1 && IsIndentChar( pData[0] ..

ななしnDataLen == 1 && IsIndentChar( pData[0] ) なんていう条件だと クリ..

ななし> 選択範囲が一行だけだったときCommand_INDENT_TAB()Command_INDENTの代わり..

ds14050>1字のSPACE/TABという条件はドをはじめて見た >瞬間におかしいと思ったし誰でも同じことが想像でき..

ds14050どうしようもないな「元の挙動を残し<<<大嘘

ds14050なんかもうぐだぐだだけど気づいてしまってので訂正 >知らないのは事実です。最初のコメトに書いたとおり 最初の..


20091026() [tDiary] aq=3 というようなクエリパラメータを含んだ google検索からのリファラをうまく置換できないので調べたら最新のではしっかり q= というパターンが [^ao]q= に更新されていた設定ファイルは古いものを引き継いでいたから対応できていなかったところで[^ao]q= より \bq= の方が将来性があって良いというか[?&;]q= でどうか?

最終更: 2011-12-20T23:29+0900

[SakuraEditor] 矩形選択時のカーソルの動きを修正

発端はこれ > 折り返ししている物理行末をーボドで左から右へ矩形選択しようとすると 次の物理行にカーソルが移動して意図した通りに選択できません

折り返し桁に到達した瞬間次の行の始めにキャレトが移動してしまうために末尾一桁が選択不可能になっている

いいだしっぺの責任のようなものを感じて一応やってみた

  • 矩形選択中はキャレトを操作と違う方向に移動しない
    • 右を押していて折り返しで次の行頭に移動しない
    • 下を押していてEOFのある行に着いたとき X座標の最大値を EOFの位置に規正しない
  • (ついで) EOFの位置にキャレトがあるときに下を押すと選択解除
    • EOFの位置で右を押したときに選択解除はすでに行われている

っくり書き換えてしまった部分があるのとCMemoryIteratorCLayoutがよくわかっていないためにっぱり自信が持てない道具が初めて扱うものばかりなのに加えフリーカーソルモ矩形選択中改行の位置折り返し桁(設定)(実際の)折り返し位置など考慮すべき対象も多すぎる

いじったのはキャレトの移動部分だけで選択については見ていないぶら下がり文字についても考慮していない選択できないわけではないので特に不都合だとは思っていない(改行がぶら下がってるときは不都合があるか)


 @2009-10-28

矩形選択をキャンセルしたときにカーソルが改行の後ろに取り残されてる

矩形選択を上下左右矢印で解除したときはカーソルを矩形の左上隅に移動するようになっているでも現状では矩形選択は Shift+F6での矩形選択ロックを利用したインターフェイスしかない(マウスのことは知らない)から矢印で選択状態を解除はできないEscを利用して選択解除するんだけどこのコマドはキャレトの移動を行わないだから取り残される

取り残されるよりはましだろうと思って必ず左上隅に移動するようにした

別件選択を矢印で解除するとき()矢印だったら選択解除だけが行われてキャレトの右()移動は行われないでも上()矢印だったら選択解除とキャレトの移動が両方行われるっちでもいいし今のように混在してても不満はない

さらに別件ャレトが EOFの位置にあるとき右矢印で選択解除ができるようになっていたので下矢印でも選択解除ができるようにしたがャレトが先頭行にあるとき上矢印で選択解除はできないャレトの実質的移動がなければ選択解除はしないということで統一しEOFの特別扱いをやめてもいい気がする

違うなあァイルの先頭で左を押すと選択解除ができるEOFでの右解除はこれにならったものだ最終行での下矢印で選択解除できるようにしたなら先頭行での上矢印解除も対応しろってことだ(そのほうが修正点が少な)

した

たぶん二行下移動(そういうコマドがあって↓に割り当てたりできる矩形選択用の二行下移動もある)ではここまでの修正が効いていないだろう

と思ったら二行下移動では EOFのみの行に一気に移動できない必ず手前の行で一度止まってしまう結果的に問題は起こっていなかったわけだけどEOFのみの行に一気に移動できるようにしたうえで修正が効くようにした

っと考えればわかるけど左上隅だからって改行の後ろでない保証はなかった普通の選択解除と同じようにコマドの方向も考慮しながら(右移動による選択解除なら右下隅にキャレトを置くとか)ャレトが有効な位置におさまるようにまじめに対応した方がいい()矢印が押されたときに選択解除とキャレトの移動を両方行うようにすれば()矢印の場合の動作と統一されるしャレトが有効な位置に収まることも左()移動コマドによって特別なことをせずとも保証される一石二鳥


 @2009-10-29

ッコミが入りました

今のサクラで選択を上下左右の矢印キーで解除するときの挙動はEmMS Wordなどと同じ動きです。

秀丸エEmEditorはおろか Wordも使ったことがない物知らずなもので……左右の選択解除でキャレトの移動がなくて上下の選択解除ではキャレトが移動することに関しては(俺がいう)一貫性以外に他と揃えるという評価軸もあるということでしょうメモ帳と Firefoxのテキトエリアでは左右の選択解除でもキャレトが移動するのでっぱりどっちでもいいことだと思うな(俺は)っちでもよくないという意見があるのだか「一石二鳥を強行したりはしないけど

(折り返し位置の1字手前から次行に移動する)概ね多くのエタと同じ動きだと思います。

これャレトの表示を折り返し位置で留まるようにして次行の行頭に飛ばないようにしたけれどその右は次行の一文字目と二文字目の間だから実質的なキャレトの位置は変えていないのだよね行頭の左が前行の折り返し位置の一文字手前であることの対称になることも意図した折り返しの一文字手前の右が次行の行頭である場合よりーザーのできることは増えるしャレトが現在の行を端から端まで移動する前にワープしてしまったような印象も受けないし他のエタも見習ってほしい動作だと思ってるこれに関してメモ帳は折り返し一文字手前の右が次行の行頭Firefoxのテキトエリアは折り返し位置と次行の行頭の間に仮想の一文字が存在するFirefoxはありだと思うけどメモ帳はどうかと思うどうかとは思うけど自分は折り返さないのでまったくの他人事だったり

書いてるうちにさらなるツッコミ

通常選択や通常カーソル移動の仕様変更するのは本末転倒かな

「本末転倒はそうだったかもしれない折り返し位置での右移動がややこしすぎて矩形選択の不都合の修正とカーソル移動を分離できなかったというかャレトがおかしな動き(改行文字の後ろに止まったり)をしないように試行錯誤しながらの修正だったからその結果が自分好みの動きになるのは当然という

二人とも矩形選択中にキャレトが折り返さないことに異論はないのかな


 自然にこうなるはずもなし。
 先人の意向ということで。

レガは積極的に振り捨てたいそれが自然でないのならばなおさら


個人的な主張や好みはおいておいて波状攻撃をくらってしまったので折り返しでの右移動を修正した元の通りに(ったはず)っと余裕ができたのでコドを整理して仕様変更をしやすくしたこれでこんどまた折り返し行の右端でキャレトを止めようと思ったときも変更がしやすいMOVE_NEXTLINE_IMMEDIATELYMOVE_NEXTLINE_NEXTTIME_AND_MOVE_RIGHTに置換するだけじゃないかなオプション化も簡単だわざわざ設定画面を用意して使用者の煩わしさを増大させるほどのものではないけど


 @2009-10-31ッチ

SourceForge.net: Sakura Editor: Modify: 2889930 - 矩形選択中にキャレトが操作と異なる方向に移動しないように



 @2011-11-30 コミ

  1. r1966(2011-11-15) コミby syat.
  2. r1973(2011-11-29)ャレトが -1行目へ移動するバグの修正 by moca_skr.
  3. r1983(2011-12-20) (F6ESCーによる)選択中の未選択状態で選択をキャンセルできないバグの修正 by moca_skr.
本日のツッコミ(3) ッコミを入れる

anonymouse今のサクラで選択を上下左右の矢印キーで解除するときの挙動はEmMS Wordなどと同じ動きです。 折り..

ななし矩形選択とい「おまけにあわせて 通常選択や通常カーソル移動の仕様変更するのは 本末転倒かな

ななし現行仕様は明らかに他のエタを調べてそれに合わせた結果と思われ 自然にこうなるはずもなし 先人の意向というこ..


20090923() Subversionの嫌なところ - 日記を書く [w] はやみずさん < 既に存在するリポトリの形式はサーバープログラム(svnadminとか)をアップデトしたとしても自動ではアップグレドされないことになってる明示的にコマ(svnadmin upgrade)を打つか DUMP&LOADするまでだから古いクライアトプログラム(svn)がお行儀悪く fileトコルでリポトリを直接読もうとしても(他に原因がなければ)失敗はしないんじゃないかと濡れ衣くさいので書いた <追記@2010-04-21>ーキングコピーの話だったらそれはアップグレドされる所詮ただのコピーなんだからクライアトごとにチックアトすればいいんですよ</追記>

最終更: 2013-04-29T21:18+0900

[SakuraEditor] 矩形選択を普通の選択と同じ操作感に(Shift+○という操作を Alt+○に置き換えるだ)

いままではAlt+矢印で矩形選択モドに入った後Altを放してそれから選択範囲の拡大を(矢印でShiftは不要)行う必要があったまた知らないうちに矩形選択モドに入ってしまっていて驚かされることも何度かあったそれらAltを放す必要や知らぬ間のモド変更がなくなる

2000年にはそのための布石というかコメトアトされたプレースホルダが用意されていたそのおかげで全くたいしたことはしてないのだけどこれまで放置されてきた理由なり原因なりを何か見落としてる?


 差分更新

easy_box_selection.rev2.txt (30.6KiB, 2010-04-13)
trunk2@1732に対する差分
ー割り当ての初期設定の間違いを一つ修正
折り返し行頭への移動が本当の行頭(改行文字の直後)への移動だったのを修正

 @2013-04-27 Mocaさんによるパッチ

Sakura Editor / PatchUnicode / #449 矩形選択移動コマドの追加

俺みたいにありもののコマドで間に合わせるのでなく足りないコマドの実装までされています。

今思うと矩形選択しながらの(折り返しでない本当の)改行単位での行頭・行末移動は不要だった気がするプレースホルダはあったけど使わないでしょう? 改行単位の GoLineEnd自体は矩形選択と組み合わせては使わないにしても、なくて不便だった(20120227p01.02)ので必要だけど

残念なのは既存ユーザーの sakura.iniには Alt+Alt+Alt+Alt+→に対す「矩形選択開始の割り当てが既に書き込まれていること勝手に設定を書き換えることはできないからプログラムをアップデトしただけでは利便性の増した矩形選択に気付けない関連するキー割り当てがデフトのときだけ書き換えてしまうのはありかもしれないップデト後1回だけ ini書き換えを実行するためにiniにフラグのための項目を増やすことが考えられるWSHで独立したスクリトを書く方がオーバーヘドは少ないが実効性は著しく下がりそう別に隠れ機能でもいいけどねよく使う人ほどこれまでの操作に慣れてるだろうからヘルプに2通りの操作があることを書いておけば気付くでしでも慣れてるけど不便だと思ってる人に気付いてもらえないなあ俺みたいにリリーストを嬉々として読む人間ばかりではないだろうし


20090922() [790FX-GD70] BIOS v1.5

最終更: 2016-03-05T00:30+0900

[SakuraEditor][正規表現] 正規表現を使った検索・置換で改行の意味を LFのみから CRも含むように

経緯 > サクラエBBS[r7030]

差分 > fix_cr_handling_of_regex(下に修正版があ)

お試し > sakuraW.zip (547KiB)(下に修正版があ) (正規表現検索・置換を試すには bregonig.dll(Unicode対応)が別途必)

検索置換を数度試したが機能しているみたいただ$ が本当に改行の手前でマッチする関係で

^.*$

を空文字列に置換するという最初に提起されたケースでは置換後の空行までが置換対象になってしまう(置換回数が 2)目的に適うより適切なパターンは

^.+$

あるいはタの行置換機能を使っているのだからっと単純に

.+

で良い


 @2009-09-24

正規表現 - SakuraEditorWikiを見ていて気付いた。\c[\c]\c$\c. という制御文字のひとつを表すパターンが存在する鬼車 正規表現 Version 5.9.1によれば \C-[\C-]\C-$\C-.\M-[\M-]\M-$\M-. も存在しうる。\M-\C-[ なども存在しそうに思ったけどこれはこういう結果になった

irb(main):001:0> /\M-\C-[/
SyntaxError: (irb):1: too short escaped multibyte character: /\M-\C-[/
        from c:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>'
irb(main):002:0

制御文字なんて扱ったことがないからなあ(もはや relicだという認識)対処の必要性がさっぱり感じられないけど……


 @2009-09-25

一括置換で $CRLFCR直前LF直前LF直後(正規表現DLLに与えた文字列末尾)の三カ所にマッチしてしまうとの指摘 >サクラエBBS[r7039]

逐一置換を実行した場合は問題ないことを確認していたのだが一括置換はライブラリに全部お任せで検索開始位置を調整することもできないから動作が違っていたのだろう$CRLFの間にマッチするのはわかっていたが明示的に \r を食べた場合にだけ影響があると思っていた一括置換なんてありふれた操作でそれが明るみに出るとは思いもせず。

急いで修正 > fix_cr_handling_of_regex.rev2sakuraW.rev2.zip (547KiB)(さらなる修正版 rev3が下)

初めて戻り読みを使ったなんとなく反則的な手段の気がして使わないですむ方法をいつも考えるのだけど無理だったこれで bregonig.dll依存が決定的になった[] の入れ子のことだけなら ] が見つかったときに charset_levelを一気に 0 にするだけで BREGEXP.DLL対応もできたのだ


\C-X\M-X というのは Ruby向けなのかもサクラエ(+bregonig.dll)\C-[ を検索しようとするpremature end of char-classというメッセージが出るとなれば\cX だけが引っかかった小骨ということになる

対処 > fix_cr_handling_of_regex.rev3sakuraW.rev3.zip

<追記>bregonig.dllでは \c\X\cX の意味になるともう知らねー。</追記>


個人プロジトでもないと色々大変そうッグフドでも食べながら様子見します。とりあえず反応だ

 2.非対応となっているBREGEXP.DLL(ANSI版)への対処方法
 ANSI版とUNICODE版は別仕様としてしまうのか?

使用できる正規表現自体が別物なので BREGEXP.DLLCBregexp::MakePattern()でよいかとーザーを驚かさないための変更なので.\r にマッチすることを期待していた人以外に影響はないつもりでいる

<追記>ANSI+bregonig.dll向けのパッチを用意したので別仕様は ANSI+(BREGEXP.DLL/bregonig.dll)Unicode+bregonig.dllの間または ANSI+BREGEXP.dll (ANSI/Unicode)+bregonig.dllの間のどちらでも選べるBREGEXP.DLLのサポトするオックスな(戻り読みをサポトしない)正規表現で$を改行直後の行文字列終端にマッチさせない方法が見つからない限り BREGEXP.DLL対応は無理。</追記>

<追記>BREGEXP.DLL版も用意した>_ANSI.rev2 >_ANSI.rev3</追記>

 3.$ が改行なし最終行のEOF手前ともマッチするように改善すること
 $ を (?=\r\n?|(?<!\r)\n|(?<[^\r\n])$) に置き換える方法を試してみたけどエラーで動きませんでした。

肯定の戻り読みは (?<=) でした(なにせ使用経験がないもので)気を取り直してパターンを (?=\r\n?|(?<!\r)\n|(?<=[^\r\n])$)* に置き換えたところ検索は予想通り最終行がEOFのみの場合を除いて文書末にマッチするようになったのだけど置換が行われない(以前は行われていたのだろうか? マッチのインデックスが文書の長さと同じ(=1つはみ出した状態)になっているはずだから特別な対処が必要なのだろ)

「以前は行われていたのだろうか?< 行われていなかったなら(間違ってるけど)おいておこう

 4.検索強調表示が検索時の選択反転表示と一致すること
 $ を (?=\r\n?|(?<!\r)\n) に置き換えた版で $ を検索すると、改行文字自体は選択反転表示にはならない(マッチしない)のに検索強調表示されている。
 また、なぜか上方向検索では改行文字自体にマッチしたかのように選択反転表示になる。

$で検索したときに改行文字が強調表示されるのは0のハイラトには意味がないので実用面から今のように最低でも幅 1を保つべきだと思っていた

上検索で改行が選択されてしまうのは間違いなので修正したいこれまでが知らず $ が改行にマッチする仕様に依存していたのかもしれずこういう修正は正しい方向に向かうためのものだと考えている

修正した(rev4)無限ループを避けるためにマッチ幅が 0のときに検索開始位置を特別にインクリメトするんだけどそのタイミングが悪くて検索開始位置だけでなくマッチの範囲までがインクリメトされていたのが原因

 5.正規表現キーワードでの $, . 指定も検索・置換と挙動が一致すること
 現状、正規表現キーワードには $, . に検索・置換でやっているような細工が入っておらず、素の正規表現ライブラリ挙動になっている模様。
 検索・置換時の . の細工([^\r\n]への置換)が追加されると、今よりも差異が大きくなって混乱しそう。

すでに書いたように.\r にマッチすること$CRLF の真ん中にマッチすることを期待していた人(いるのか?)以外は違いに気付かないだろう

\r\n$ みたいな書き方をしていた場合にマッチしなくなるこのケースはなくはないかも

 6.検索・置換や正規表現キーワードの複数行対応への順応性

ーチックsフラグが含まれる( . があらゆる文字にマッチするようになる)ときには . を置き換えないようにするmフラグが含まれない( ^$ が行頭行末にマッチしなくなる)ときには $ を置き換えないようにするとか?


>fix_cr_handling_of_regex.rev4sakuraW.rev4.zip


2ch民は 1.6.5.0をつかうのね♥マークはいらないんだConsolasも使いたくないんだ(これは俺の理由だけ) r1663を使おうぜ


 @2009-09-28

UnicodeRevision1662>http://sakura-editor.svn.sourceforge.net/viewvc/sakura-editor?view=rev&sortby=date&revision=1662

AnsiPatch>http://sourceforge.net/tracker/?func=detail&aid=2869238&group_id=12488&atid=312488


勘違いしていたUnicode版のサクラエタで使用できる正規表現ライブラリは bregonig.dll(Unicode)だけだという事実がいつの間にかbregonig.dllUnicode版専用だという思い込みにすり替わっていた

ったら採用の可否はともかくAnsi(trunk2(Release|Debug)_Ansiドのことでなく trunkのビド産物のことだろう)向けのパッチを作成する意味はあるわけだCBregexpのイスタスがその寿命を通じて 1つの DLLだけを扱うのであればトを初回に払うだけで処理の振り分けを行うことができるっちかな?

>>> DLL初期化時に呼ばれる仮想関数がありました(そのたびにチックを行えばいい実際は 1回しか呼ばれないだろ)


CheckRegexpSyntax() は癌だ検索ボタンを押すたびに DLLのロドからはじめて文法をチックしたら使い捨てるって何事文法チックは Compile()で十分その後の Match()のための準備にもなってちょうどいいもろもろの手順を共通化したいのなら引数として CBregexpを受け取るべきだ正規表現のチックをしたい(=正規表現を利用したい)部分ではもちろん CBregexpなりなんなりをすでに持っているだろうCheckRegexpSyntax()がこんな重量級のローカル変数をもつ必要はない無効な検索パターンを履歴に追加したくないがために検索の主体でない検索ダイアログが利用しているのかもしれないけど


 @2009-09-29

っつけで一応これで昨日書い「コトを初回に払うだけで処理の振り分けを行うことができるが事実になった昨日の段階では検索ボタンを押すたびに DLLがサポトする文法をチックする関数が実行されていた(初回どころではない)これでもまだ検索ボタンを押すたびに Compile()2回走るのは変わっていない

おまけとしてbregexp.dllだけが sakura.exeの隣にある状態でエタを起動しその後 bregonig.dllを配置したとき検索ダイアログでは bregonig.dll Ver....と表示されbregonig.dllしかサポトしない戻り読みを使用しても正規表現エラーにはならないものの実際の検索には bregexp.dllが使用されるためだろう戻り読みが機能していればマッチするはずの条件でもマッチ無しになってしまうこういう説明もややこしい起こりづらい状況が起こらなくなる(文法チックと実際の検索が CBregexpの同じイスタスによって行われるようになるか)

本当は CBregexpCDllHandlerを継承するのをやめて分離して1つの CDllHandler(DLLスタ)を多数の CBregexp(BREGEXP構造体)から参照するのがいいのかもっといえばBREGEXP構造体もコンパイル済みパターンとマッチ結果に分離したいサポトする文法の情報はもちろん DLL付きの情報CDllHandlerは汎用的すぎるからその任にはCDllHandlerを継承したいまの CBregexpから BREGEXP構造体だけを追い出したものを充てればいい

いまの CBregexpInitDll()を呼び出されて途中で違う正規表現ライブラリを読み込まされたときコンパイル済みの BREGEXP構造体を正しく解放できるのだろうか?


 @2009-10-01

BREGEXP.DLLでも .$ を置き換えるようにしてみた > fix_cr_handling_of_regex_ANSI.rev2(下に rev3)

副作用があってXYZ(CR)(LF) という行に対して XYZを検索すると XYZ(CR)(LF) がマッチするッチ結果が改行に隣接しているとき改行がマッチに含められます。$を検索すると (CR)(LF) がマッチするのは以前からの通りここが変わらないのは一括置換での過剰な置換を防ぐ手立てがこれしか BREGEXP.DLLからは与えられていないということ

ついでに気になった\r\n を検索したときステータスバーに 1 bytes selected. と表示されるのを修正>fix_selection_area_and_selected_byte_count_ANSI 選択領域が中途半端なサイズだったのも直ったそれもこれも CLayoutEOLの長さを常に 1とカウトしていたせいッチ範囲が勝手に 1切り詰められていた

表示としては ↵ も ⇠ も ⇣ も同じ一字だから CLayoutのすることにも一理あるのかもしれないそれなら改行文字の部分の選択領域をせめて全角幅にして検索結果のハイラト部分と大きさをそろえよう

ANSI版の View関連のソースを見てたら気が遠くなるUnicode版で

  • CRLFを全角幅で表示
  • CRLFCRLFのみハイラ選択
  • LFCRの全角表示全角幅選択(or半角幅ハイラ)
  • 行頭マッチ(^)でキャレト描画

あたりなんとかならんかな検索結果の選択範囲とハイラト領域のずれが気になる


 @2009-10-03

ANSI版を BREGEXP.DLLと組み合わせているときに不必要に改行が検索結果に含まれてしまう場合を rev2より大幅に減らした意地悪なパターンを与えられたときにどうなるかは把握しきれていない

> fix_cr_handling_of_regex_ANSI.rev3(rev2rev3にバグ発覚rev4)


fix_cr_handling_of_regex_ANSI.rev4

どういうバグだったかというと一括置換をしたときに改行や行文字列末尾付近で過剰に置換が行われないように戻り読みが使えない BREGEXP.DLLのときは検索パターンと置換文字列に細工を施すのだけど検索パターンの置き換え方がまずかった

 誤: /A|B/ -> /A|B((?:\r\n?|\n\r?)?)/
 正: /A|B/ -> /(?:A|B)((?:\r\n?|\n\r?)?)/

選択 | の結合順位は一番低いのでした


バグは CBregexp.cppを好き勝手にいじっていた結果をテトしている最中にたまたま見つかった

  • メンバ関数に constをつけたり
  • 正規表現フラグを指定する引数の型を intから専用のものに変えたり
  • CBregexp::IsLookAhead(const char *pattern)が内部状態を変更してCBregexp::Match()の結果に意図しない影響を与える可能性を排除したり

していたこれは単なる自己満足


 @2009-10-04

不必要に選択範囲が改行にかかっていたケースををさらに減少> fix_cr_handling_of_regex_ANSI.rev5 検索パターンが LF直前や文字列末尾に幅0ッチしそうなときにだけ細工を行うことにしたなんというか盆栽趣味?

バイナリ>sakura.zip


 @2009-11-25

AINI版では LFCRLFCRの間に幅0ッチしそうなときも細工を行わないといけないだろうなやらないけど(LFCR?なにそれ?という立)

* あえて (?<=[^\r\n])$ を使ったつもりでいたけど実は (?<![\r\n])$ の方が最適だった可能性二者の違いは>[[20080528p01]]ただしサクラエタ的には EOFのみの行は存在しない(行番号も表示しない)ものらしいのでどちらのパターンを使っても実際の違いは生じない

 扱うファイルが ASCII onlyという可能性FontLinkッチ<https://sourceforge.net/tracker/?func=detail&aid=1832567&group_id=12488&atid=312488>を自分で当てている可能性はある


20090912() ブラウザとエタで確認したCtrl+BackSpaceCtrl+Deleteで単語単位の削除

最終更: 2011-03-25T01:34+0900

[SakuraEditor] シンボリックリンクを開いたとき更新通知の無限ループ

そして素朴な疑問選択肢が 4つあるんだけど

  • 再読込(&R)
  • 閉じる(&C)
  • 以後通知メッセージのみ(&M)
  • 以後更新を監視しない(&N)

閉じるをクリックしても予想に反してエタは閉じられないのと(延々と表示され続けてもおかしくない)通知メッセージはどこに出ているのか?


 @2010-07-08 補足

シンボリックリンクを開くとトカトファイルを開いたときと同じようにターゲトファイルの内容がエタに表示されるそして他で何もせずとも最初に必ず更新通知ダイアログが表示されるだか「再読込を選ぶと読み込み後にまた更新通知ダイアログが表示されることになって無限ループ「閉じる(=ダイアログを閉じる=更新を無視する)を選ぶと今度はターゲトファイルが本当に更新されたときも察知できなくて永遠に黙る

対策はシンボリックリンクを開いていることを意識して常に(ァイルの読み込みと更新監視で共通して)ーゲトファイルの更新時刻を調べるようにすること

っていうほど単純でもない更新日時だけ特別扱いしたらファイルの属性に一貫性がなくなる更新監視部分でだけターゲトファイルの更新日時を比較するのが影響範囲が最小だけど更新日時を保存するメモリ領域をどこかの管理下に用意しないといけない(だれが管理する?もちろん CEditDocのメンバの CAutoReloadAgent)一番面倒がないのはシンボリックリンクのターゲトをたぐってそのファイルを開いたことにすること(トカトと同じ)なんとなくこれが嫌なのはカレトリが変わってしまうこと他にもいろいろあると思うトカトでなくシンボリックリンクを使うのはーゲトファイルがそこにあるようにアプリケーションをだましたいときだからサクラエタも(今はタイムスタンプ取得方法の一貫性のなさからかおかしなことになっているうえだまされているせいで更新の監視ができていないが)上手にだまされてほしい

 @2010-07-08 更新通知ダイアログがわかりにくい

  • 「閉じるって何を閉じるの?
  • 「以後通知メッセージのみ「以後更新を監視しないって結局再読み込みするの?しないの?

のでこうした(improve_fileupdatequery_dialog.patch)

わかりにくいと感じてるのは俺だけじゃなくて、sakura-dev:3014wmlhq氏が書いている

なお、更新通知ダイアログはわかりづらいようなので、次のようにしてください。

----------------------------------------
<!> このファイルは別のプログラムによって変更されました。

読み直しますか?
----------------------------------------
 [ ]今後、ステータスバーに通知する 
 [ ]今後、通知しない 
----------------------------------------
[はい] [いいえ]
----------------------------------------

日記を書く段になって見直したんだけど wmlhq氏のメッセージのほうが良い

  • 「更新の監視をやめるという俺のメッセージは不正確だから(タイマーは常に動いていてタイムスタンプの比較をしなくなるだ)
  • 通知メッセージがステータスバーに表示されることがわかる
  • サルでも答えられる Yes/Noクエスチョン

20090902()

最終更: 2009-09-02T23:44+0900

[SakuraEditor] http://coderepos.org/share/browser/platform/sakura-editor/

ーワドファイルなんかはみんなでいじくって改善するのにちょうどいいものだと思ったらやはりCodeReposにあったただし PHP

ーワドの羅列には興味がないけど(php-mkkwd.phpは別)正規表現キーワドは共有して他人のも見てみたいなあ(楽ができるから)javascript_re_keywords.rkwRuby_re_keywords.rkw


20090825() Emacsってイーマックスだったのねんエマックスだとばかり……VMAX(名前からの連想)みたいなデカブツは好みじゃないんだよね……ってどちらも重量級だからそれでいいのEmacs(名前も含めて)好きにならないだろう

最終更: 2010-05-19T17:19+0900

[SakuraEditor]ーテーション文字列の色分

 確かに変ですが、ここの部分をきっちりやろうとするとレイアウト処理性能にシビアに影響するみたいです。
 ざっと試したところでは、ファイル読み込みで1.5~3倍くらいの処理時間がかかるようになってしまいました。
 右端で折り返す設定で画面幅を変化させるときの応答にも同様に効いてきます。
http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=data&tree=r7015

さらりとできなくはないと書かれているがどうやるんだろう?

sakura_core\view\colors\CColorStrategy.cpp の後半(「色開始部分)をこう書きかえてみても中途半端な結果ァイルの内容は同じでも文字の追加や削除ゥなどの操作によって意図通りの結果になったり現行通りだったり処理速度に関しては5MBのファイルを開いてファイルタイプをいろいろ切り替えてみたら変更前よりプログスバーの進みが明らかに遅い1.5から 2倍というのは体感に一致している

bool CColorStrategyPool::CheckColorMODE(
	CColorStrategy**	ppcColorStrategy,	//!< [in/out]
	int					nPos,
	const CStringRef&	cLineStr
)
{
	//色終了
	if(*ppcColorStrategy){
		if((*ppcColorStrategy)->EndColor(cLineStr,nPos)){
			*ppcColorStrategy = NULL;
			return true;
		}
	}

	//色開始
	if(!*ppcColorStrategy){
		for(int i = 0; i < (int)m_vStrategies.size(); ++i) {
			if(m_vStrategies[i]->BeginColor(cLineStr, nPos)) {
				*ppcColorStrategy = m_vStrategies[i];
				break;
			}
		}
	}
	return false;
}

違うCheckColorMODE()のときに正規表現キーワドは働いてないそもそも CheckColorMODE()の目的って? CLayoutMgr::Match_Quote()がとりあえず行末を返す( return cLineStr.GetLength(); )って? それでどうやって行をまたげているんだろう


白々しさ爆発だけど書く下は sakura/trunk2/sakura_core/doc/CLayoutMgr_DoLayout.cpp から削除されたコ(の一部)この部分が修正を加えられたうえで sakura_core/view/colors/CColorStrategy.cppに移動しているreturn falseを使わずに breakしているあたりがさらに嘘くささを増してるけど別にこのときの変更をロールバックしたかったわけじゃない知らなかったし参考にしたのは SColorStrategyInfo::DoChangeColor()の方

	if(!*ppcColorStrategy){ 		
		CColorStrategyPool* pool = CColorStrategyPool::Instance(); 		
		for(int i=0;i<pool->GetStrategyCount();i++){ 		
			CColorStrategy* pcSample = pool->GetStrategy(i); 		
			if(pcSample->BeginColor(cLineStr,nPos)){ 		
				*ppcColorStrategy = pcSample; 		
				//bRet = true; 		
				break; 		
			} 		
		} 		
	} 		

俺が感じたプログスバーの進みの遅さはたぶん基底クラスからの仮想関数の呼び出しに伴うものだったんだろう一歩戻って進んでふりだしに戻る


CheckColorMODE()がないとクーテーション文字列が行をまたげない

レイア(禁則処理とか折り返しとか)とクーテーション文字列(+コメ)の関係がわからない癒着してるならトルネックにもなってるらしい CheckColorMODE()をなくして正規表現キーワドが行をまたぐことでカバーしたい


 @2010-05-19 関連ログ発見

http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=dev&v=4079#4083

サクラエタの色分け解析ルーチンは全部で3つあって

  • 行データの変更に各レイアト行の先頭色を決めるもの(CLayoutMgr)
  • 実際の作画時に各文字の色を決定しつつ作画するもの(CEditView::OnPaint)
  • 対括弧の色を戻すときに各文字の色を決定するもの(CEditView::GetColorIndex)

20090824() [Vista] エクスプローラは痴呆気味だけ>explorer .でカレトリを開けるのがえらいMDIEに乗り換えなかった理由の一つ

最終更: 2009-09-24T04:29+0900

[SakuraEditor] 最近使ったファイルを名前でソトしないで!

方法は sakura/trunk2/sakura_core/sakura_rc.rcから CBS_SORTを一か所削除するだけでしたCRecentImp.AppendItem()が名前に反してあえ「アイムを先頭に追加しているけど俺もそれが自然だと思う「開く...(ドロップダウン)ールバーボタンから出るポップアップメニーには CBS_SORTみたいなフラグがないのだろうトはされていない望み通りでも Windowsはスタトメニーの最近使った項目をファイル名でソトしてるそういう考え方もあるんだろう好きにやります。

ダイアログつながりで拡張子補完も完全に切ったお節介は不要拡張子補完って主にエクスプローラで拡張子を隠したままにしてる人のためにあると思う


20090808() docs.tdiary.orgがルトから 403 Forbiddenで読めないプラグインの説明が読めない

最終更: 2019-12-01T02:10+0900

[SakuraEditor] サクラエタの正規表現キーワドを SHJS相当にしたい

行単位で処理してるのはどちらも同じだしサクラエタの既存の設定はすべて State0のパターンとして扱えばいい行をまたぎたいときや凝った処理がしたくなって初めて State移動を使えばいいだけのことpatternStackcurrentStyleを行ごとにキッシュしておけば変更のあった行から即座に色分けを再開できるはず。文書の最初から色分けをやり直す必要はない変更のあった行より後ろの行にジャンプするときは変更によって何行後ろまでの patternStackcurrentStyleに変化を与えたかというキッシュが無効化される範囲を見極める時間が必要になりそう*.cァイルの編集中に /**を削除したりアゥしたりしたあとで Ctrl+Endするのは厳しいですよpatternStackは一行一行でそうそう変化するもんじゃないからキッシュの圧縮が効きやすいだろう(妄想するだけなら気楽だな)


 @2009-09-06

色分けが正規表現キーワドだけによって行われるのでないところが難しい他の色分け機能(コメトとか文字列とか強調キーワドとか)による先食いを考えないといけないから

今のサクラエタで正規表現キーワドで引用符を食べるとその行では組み込みのクーテーション文字列の色分けが無効になるけど次の行からクーテーション文字列が始まってしまう理由がわかった気がするその逆をやろうとしていたことに今やっと気付いた正規表現キーワドも先食いされる可能性を考えないといけない


 @2009-09-07

ック! BREGEXPのインターフェイスには検索開始位置を指定するパラメータ ――JavaScriptでの /pattern/g.lastIndex―― がない対象文字列を指すポインタを進めればそこ(文字列途中)が開始位置だと言ってよいものではないそれでは ^ のようなアンカーが毎回マッチしてしまうだろうから(試したわけではない)むむむBREGEXPには引退してもらいたい……サクラエタは自前で特定のパターン(頭・行末アンカ先読み)の有無を検索パターンに対するパターンマッチングでチックしてますね怪我の元に思えるので避けたい方法だけどこれまで信じられないぐらいうまく動いてるのは事実(でも半信半)<追記>bregonig.dllBregexp.dll for SAKURAを使用しているときは BMatchEx(これは検索開始位置を示すポインタが引数の1つに加えられている)が使用されていたのだった道理でソースを見ながらいじわるなパターンを与えても正しく動いたはずだちなみに鬼車の APIではさらに検索終了位置を指すポインタを対象文字列末尾を指すポインタとは別に渡せる。</追記>年代が違うから比較は酷だけどJavaだか .NETだかの正規表現では渡した対象文字列の(あるかもしれない)続き次第でマッチ結果が変わってくる可能性をさえ知ることができたはず(よく知らないそこまでするかと驚いた記憶だけがあ)Javaった

正規表現リテラルの影響があるのも嫌だなパターンとフラグをスラッシュで連結せずに別の引数に分けたらパターンの中のスラッシュをエスケープする必要がなくなるのにpreg_matchを思い出した文字列で正規表現リテラルを表現しようだなんて(笑止)リテラルである(=余分なエスケープが必要ない)ことに価値があるのに引用符とスラッシュで二重にパターンを囲ませる意図がわからない

<追記@2009-09-23>サクラエタのソースにエスケープを付加する処理が見あたらないなと思ったらスラッシュでなく 0xFFFF をデリミタに使用していたなるほどパターン中にそんな値は出てこないだろうな(そんな気がするだけ)0xFEFF0xFFFEBOMだけど0xFFFFは空いてるのかな。</追記>


 @2009-09-08

CColor_RegexKeywordだけをいじるんでなくCColorStrategy関連を作り直して CColor_*をそれに対応させるのがゴール(だということに気がついた)CColor_Quoteに対する特別扱いをレイアト部から切り離して SColorStrategyInfoに内包させるみたいなSColorStrategyInfoCColorStrategyドライバという位置づ

でもやっぱり色分けにレイアトがからんでくるのがわからないSColorStrategyInfoのメンバの

	//参照
	CEditView*	pcView;
	CGraphics	gr;	//(SColorInfoでは未使用)

	//描画位置
	DispPos*		pDispPos;
	DispPos			sDispPosBegin;

	CLogicInt GetPosInLayout() const;
	const CDocLine* GetDocLine() const;
	const CLayout* GetLayout() const;

こういうの

与えられた行に対してこれからはそれより前の行の色分け結果も参照しつつ一行分の色分け結果をまとめて返すから描画はそちら(CEditView)でどうぞ検索語のハイラトとの重ね合わせもそちらでよろしくといいたいんだけど

CColor_* って 1つのイスタスを 1つのプロセス(=1ドキュメ)で使い回してるのに(1つの行直前のメンバ関数の呼び出しに依存した)状態を持ってるってのが嫌strtok()並に嫌いそういうのも SColorStrategyInfoに移したい


BREGEXPの情報BREGEXP DLLを見てたんだけどそこには載ってない BMatchEx()というものもあるみたい(どこにあるのかは知らない)(BSubstEx()もあった)サクラのソース(CBregexpDll2.h)でみつけた関数の型はこう

typedef int (__cdecl *BREGEXP_BMatchExW2) (const wchar_t* str, const wchar_t* targetbeg, const wchar_t* target, const wchar_t* targetendp, BREGEXP_W** rxp, wchar_t* msg);
typedef int (__cdecl *BREGEXP_BMatchW2)   (const wchar_t* str,                           const wchar_t* target, const wchar_t* targetendp, BREGEXP_W** rxp, wchar_t* msg);

これは期待できるなあ

っと検索して一か所でだけ BMatchEX()が使われていたCBregexp.cppのこの部分

	// 拡張関数がない場合は、行の先頭("^")の検索時の特別処理 by かろと
	if (!ExistBMatchEx()) {
		/*
		** 行頭(^)とマッチするのは、nStart=0の時だけなので、それ以外は false
		*/
		if( (m_ePatType & PAT_TOP) != 0 && nStart != 0 ) {
			// nStart!=0でも、BMatch()にとっては行頭になるので、ここでfalseにする必要がある
			return false;
		}
		//	検索文字列=NULLを指定すると前回と同一の文字列と見なされる
		matched = BMatch( NULL, target + nStart, target + len, &m_pRegExp, m_szMsg );
	} else {
		//	検索文字列=NULLを指定すると前回と同一の文字列と見なされる
		matched = BMatchEx( NULL, target, target + nStart, target + len, &m_pRegExp, m_szMsg );
	}

「拡張関数がない場合もあるんですか……BMatchExgoogle検索結果もたった 7件だなあUNICODE版の正規表現DLLbregonig.dllしかないから BMatchEx()が存在するものとして BMatch()対策はいらないな


 @2009-09-12

BMatch()の戻り値は intだが boolean扱いしてはいけない。BMatch関数のサンプルとして

while (BMatch(patern1,t1+pos,t1+lstrlen(t1),&rxp,msg)) {
    (マッチング結果の処理)
}

みたいに書いてあるので騙されたけどサクラエタの CBregexp.cppにはこうある

		//	検索文字列=NULLを指定すると前回と同一の文字列と見なされる
		matched = BMatchEx( NULL, target, target + nStart, target + len, &m_pRegExp, m_szMsg );
	if ( matched < 0 || m_szMsg[0] ) {
		// BMatchエラー
		// エラー処理をしていなかったので、nStart>=lenのような場合に、マッチ扱いになり
		// 無限置換等の不具合になっていた 2003.05.03 by かろと
		return false;
	} else if ( matched == 0 ) {
		// 一致しなかった
		return false;
	}

負数の時はエラーらしいなんだこの落とし穴そしてパターン文字列を何度も渡さなくてよいという新事実struct BREGEXP.parapにパターン文字列が保持されてるから 2回目以降の呼び出しでは 2つのパターン文字列(異なっているかもしれない!)を渡すことになるのが気持ち悪かったのだっとしたら 2つのパターン文字列を比較してっていたら再度コンパイルみたいな処理があるかもしれないじゃない(そんな処理があってもなくても嫌だ)


 @2009-09-14

レイアトと色分けの関係変更のあった行を知ろうと思うと CDocEditAgentを通って CLayoutMgrへたどり着いてしまうような……CDocEditAgentのくれる情報はすごく役に立つんだけどエタ上のテキトの変更がすべてここを通過するんだろうか? CLayoutMgr::InsertData_CLayoutMgr()LayoutMgr::DeleteData_CLayoutMgr()の二カ所で行の変更を通知するようにした(後で Replaceも入れて三カ) <追記@2009-10-14>Deleteは使われてなくてInsertReplaceだけで済ませてるみたいったら Insertもいらないじゃんねえ。</追記>

次の行以降に影響する文字( " など)を入力しても即座には反映されない(最小化して元に戻すと反映されているゥすると反映されている)再描画を行う範囲が最適化されているから次の行以降の色分けが変わっていて再描画が必要なことを知らせる必要があるみたいどうすれば……?


 @2009-09-15

before

bool CEditView::DrawLogicLine(
	HDC _hdc,            //!< [in]     作画対象
	DispPos* _pDispPos,  //!< [in/out] 描画する箇所、描画元ソース
	CLayoutInt nLineTo   //!< [in] 作画終了するレイアウト行番号

after

bool CEditView::DrawLogicLine(
	HDC _hdc,             //!< [in]     作画対象
	DispPos* _pDispPos,   //!< [in/out] 描画する箇所、描画元ソース
	CLayoutInt* pnLineTo  //!< [in/out] 作画終了するレイアウト行番号

3引数を双方向にして CEditView::DrawLogicLine()の呼び出し元にさらなる DrawLogicLine()呼び出しと描画領域の拡大をしてもらうことになった

……ということをやってもらうために SLayoutWork.bNeedChangeCOMMENTMODESLayoutWork.pnExtInsLineNumが用意されてたみたいどうしたもんかな


 @2009-09-17

っぱりきたよ分割ビー問題表示する行の若い順に再描画すればいいかと思ったけど通ると思った実行パスが使われていない別方面で解決Ctrl+Endでいきなり文書末に飛んだときなんかも最初はエラーだった

あとは

  1. CEditView::IsCurrentPositionURL()を対応させる
  2. 一行だけ return true; と書いたようなざる実装を埋める
  3. ーザー設定を反映する(色分けするしないと)
  4. ドコングされてる正規表現キーワドの構築部分をファイルから読み込むようにする
  5. 空間効率の改善(一行一要素を RLEにする< 何行目までがこう何行目までがこうというデータだから run lengthではなかった相対指定でなく絶対指定だという違いだけで似たようなものだけ)
  6. 既存の色分けコドを消す。(今は色の設定部分だけを削除した状)

折り返しWSHマクロ矩形選択置換などはまだ試してない落ちてから対応する(分割ビーと Ctrl+Endは乗り越えたけど折り返しも怖いな)

自分が忘れてたので覚え書きこの変更で

  • 正規表現キーワドで複数行にわたる色分けが可能になる

    設定のフーマトが悩ましいRxKey[000], RxKey[001],...では表現できないしついでにキャプチャグループを利用した一つのパターン内での色分けを可能にしてもいいGUIはあきらめてるから SHJSlang/sh_*.jsを直接読んでやろうJSONーマ*とかいって……

  • 正規表現キーワドと組み込みの色分け機能が互いに文字の先食いをできる

    たとえば正規表現キーワドが組み込み機能より先に引用符を色分け対象にしたとき次の行から組み込みの色分けが始まることがない > サクラエBBS[r7015]

    再帰的な構造に対してはJavaScriptで動く SHJSに対して鬼車が使えるサクラエタはもともと後れをとってなかったのでSHJS方式になったところでとくに変化なし

  • ときどき落ちる(落ちないはずがな)

    レアな機能を呼び出したときが危ない


 @2009-09-18

JavaScriptで使っていた正規表現パターンを鬼車で動かすにあたっては[文字集] の中の [ をエスケープしなければならないのかな? それだけ?


 @2009-09-19

  • CEditView::IsCurrentPositionURL()を対応
  • lang/sh_javascript.jsをまるまるハドコングして色分けのバグ取りッダファイルを整理して*4

自分に対しても仕様を明確にしたいもはや色分け結果は良くも悪くも以前のものと変わらない


 @2009-09-20

  • 「ユーザー設定を反映(正規表現キーワド以)

 @2009-09-30

ァイルIO 面倒くさいそれは経験値がゼロだからだということに気付いた他人の力を借りようJSON_checkerなんて使いやすそうだけど JSONーマトには正規表現リテラルもコメトも存在しないのでそのまま使えないのが問題shjs/lang/sh_*.jsJSONーマトに予め変換しておくのが簡単だけど……(SHJSの言語ファイルをそのまま放り込めるというのがやりたいんだよなあ)


 @2009-10-02

JSON_checkerを修正して使用することにした修正内容は……

  • コメトの埋め込み可(コメトが埋め込み可能な場所はさらに調整が必要だと思う*5)
  • オブジトや配列の値に正規表現リテラルが使用可
  • オブジトや配列の値にシングルクーテーション文字列が使用可
  • オブジトのプロパ名部分に文字列だけでなく識別子が使用可(大部分の Unicode文字\uXXXXエスケープシークエスが使用不可な不完全実装で)

> allow_comment_and_regex_literal_and_single_quotation_string_and_identifier_as_a_object_key

遷移表が 30×31(=930トリ)から 40×35(=1400トリ)50%増加している気にすることではないな

enum modesenum statesをヘッダへ移動させたらあとは文字を食わせながら JSON_checkermodestateを参照して情報を取り出すだ(解釈の段階でバグが発覚しないことを祈)

(どうでもいいこ: JSON_checker.cenum定義部分だけが LFでなく CRLF改行だ)


SHJSの言語ファイルをそのまま放り込めるというのがやりたい<< 色指定が互換でないから土台無理だった

sh_preprocとか sh_functionという色指定をいちいち正規表現キーワN という色指定にマッピングすればいいのかなsh_stringSQTにするか WQTにするかは決められないけど


 @2009-10-06

オブジトとか配列とかその要素を取得できるようになったCに耐えられずついでに C++ところがJSON_checkerが最初からガチガチに隙のない C++ライブラリだったら敬遠して手を出さなかったんだよね他人の C++ドは読めない!


enumの要素(ラベル)が定数に置き換えられて構文エラこれだからマクロは!!! ヘッダの中だから勝手に #undefもできないどうすれば……

#undef IN したこれは windows.hで定義されていたもの


 @2009-10-09

でけたGUIがないから iniァイルのトリに rkw2/タイプ設定名.rkw2というファイルが存在すれば勝手に読み込んで色分けするSHJSの言語ファイルをそのまま放り込むのは無理でJSONっぽく仕立てないといけないつまりifと代入部分(セミコロンも!)を削除してオブジト配列の配列だけにする必要があるSHJSの言語ファイルは 0.50.6の間でフーマトが変わってるけどそれはたぶん効率上の理由だけだから可読性の高い 0.5のフーマトにだけ対応色指定は SQTRK1というのと強調キーワ1正規表現キーワ1というのの両方に対応したつもり(日本語での指定は確認していないした)SHJSの色指定は sh_normalsh_keywordsh_stringsh_commentsh_numbersh_urlだけがサクラエタの色指定にマッピングできた課題は正規表現パターンで文字集合の中のエスケープされていない [ これは BREGEXP.DLLbregonig.dllの橋渡しをするために色分けと関係なく対応しないといけない

BREGEXP.DLLしかないときだったら色分け能力が飛躍的に向上したと言えるんだけど bregonig.dllができる子なので行またぎぐらいしか色分け能力的には変わりがない行またぎにしたって誤爆恐さで積極的に使いたいものではないし……


 rkw2/タイプ設定名.rkw2というファイルが……

C/C++とか PL/SQLというタイプ設定名をどうしよう全角に変換しよう……した<<< 曖昧な書き方だったタイプ設定名を全角にしたのではなく読み込むファイル名を全角のものにしたという意味


ッダの減量中ッダは公共の場最小が美徳実装は何でもインクル定義して目的のために邁進する俺の世界というイメージ


 @2009-10-10

正規表現キーワN という色名がわかりにくいのとrkw2の色指定をポータブルにするために(強調キーワNや 正規表現キーワNという色は各人各様に役割が定められていてポータビリがない)正規表現キーワド用の色を増やした

短い名前EColorIndexType長い名前
RKBCOLORIDX_REGEX_KEYWORD正規表現キーワ(予約)
RKCCOLORIDX_REGEX_TYPE正規表現キーワ()
RKDCOLORIDX_REGEX_VARIABLE正規表現キーワ()
RKECOLORIDX_REGEX_CONSTANT正規表現キーワ()
RKFCOLORIDX_REGEX_ASSIGN正規表現キーワ()
RKGCOLORIDX_REGEX_OPERATOR正規表現キーワ(演算)
RKHCOLORIDX_REGEX_FUNCTION正規表現キーワ()
RKICOLORIDX_REGEX_OBJECT正規表現キーワ(オブジ)
RKJCOLORIDX_REGEX_BLOCK正規表現キーワ(構造単)
RKKCOLORIDX_REGEX_RXPATTERN正規表現キーワ(正規表現パタ)
RKLCOLORIDX_REGEX_DATE正規表現キーワ()
RKMCOLORIDX_REGEX_TIME正規表現キーワ()

どなたかの受け売りで代入( = など)と演算子( == など)を分けたこの日記での色分けも以前からそうしている


タイプ別設定のデフトに JavaScriptRubyがない!!! PHPPythonもないけどね設定17設定18...設定30という固定長のユーザー設定用プレースホルダもださいexe一つのポータビリだけでなく iniァイル一つにもこだわっているのでなければiniァイルのトリにサブトリを掘りたいトリが空だったり存在しなければ作成してデフトを充填するというポリシーで

  1. types/ が存在しない → すべてのタイプ別設定のデフトを充填
  2. types/タイプ設定名/ が存在するが空 → 基本設定のコピーもしくはタイプ設定名が既知であれば予めカスタマイズされた設定を充填
  3. types/タイプ設定名/タイプ設定名.iniが存在しない → 基本設定のコピーもしくは()

付け加えるならコピーされる基本設定とは基本設定のデフトではなく現在の基本設定を優先したい

カスタマイズされたタイプ設定というのもすべての項目を持つのではなく基本設定からの差分ここだけは譲れないという設定だけを持つようにしたい強調キーワコメト形式タブ幅とかそういうのだ大部分を基本設定から引き継ぐようにすればカスタマイズの手間が省けるタイプ別の iniァイルにも基本設定と異なる設定のみを記録するようにすればいつまでも基本設定を引き継げる

さらに強調キーワドをタイプ別設定に移してァイルで管理したい

  • types/タイプ設定名/keyword01.kwd
  • types/タイプ設定名/keyword02.kwd
  • (以下 keyword10.kwd)

ーワドの名前大文字小文字を区別するかどうかのフラグあとは単語の羅列だけの内容なのでテキトエタで強調キーワドの管理ができるようになるsakuraW.iniのスリム化にも役立つト設定もタイプ別でいいよね<<っぱりプロポーショナルフトが選べないうちはフト設定が一つだけでもいいや

スリム化といえばMRU関連を別ファイルに保存したい共通設定タイプ別設定ト設定などと MRUなど履歴情報は更新頻度が違いすぎるァイルを分ければ sakuraW.iniの不意の破損を防ぐことにもつながる設定画面を呼び出して設定を変更しない限りsakuraW.iniが読み込み専用でも運用できるようになればいい(ールバーやステータスバーの表示・非表示設定は微妙だけど sakuraW.ini入りかな)

全く関係ないが思い出したこと既存のファイルを名前を付けて別名で保存したときだったかにカレトリがあわせて移動しなくて外部コマドの実行で不都合があった外部コマドの産物が期待したところ(編集ファイルの位置)に作成されなくて見つけられなかった

@2009-12-16 カレトリの件がこの修正で直ったんじゃないかな>1073


一つだけ棚上げされていた CColor_Foundの移植完了検索語のハイラドキュメトではなくビーに属していたとは知らなかった<追記>あらら不具合扱いだ>画面分割でハイラトが引き継がれない</追記>棚上げの理由はそれとは関係なくて検索語の開始位置と終了位置をどこに保存するかというものともあれこれで既存の色分けロジックを完全に置き換えることができた

重さとか気になるなあ気がつけば CPUGPUよりケースやクーラーにお金をかけていた今の PCだけどっても Phenom720BEだからAtomの載ったマシンなんて持ってないし(フルHDとかいうわけでは全くない)DivX動画の再生にも苦労した K6-2でどうだろう(ちなみに PhenomⅡは K10)


ッダファイル only (Kazuho@Cybozu Labs: 今更 C++JSONpicojsonを書いたわ)というのは考えたことのない*6価値基準だそのこころは?


 @2009-10-11

移植ミスかと思って ANSI1.6.5.0をダウンロドして試したがどうもそうではない

\w{10} というパターンで検索をするF3を押す度に次の 10文字に選択範囲が移動するCtrl+F3を押してハイラトを解除する検索語が最後に選択されていた 10文字そのものになってしまうのだ検索オプションも変わってるもう一度 F3を押してもCtrl+F3を押しても元の状態には戻らないこれは正規表現を使わない検索では問題にならないがパターン検索では困るCtrl+F3を押しただけで検索条件が変わっては困るちなみに「カーソル位置の文字列をデフトの検索文字列にする設定とは関係がない(OFFだから)

 CViewCommander.cpp

こうしてみた

//検索マークの切替え	// 2001.12.03 hor クリア を 切替え に変更
void CViewCommander::Command_SEARCH_CLEARMARK( void )
{
	this->m_pCommanderView->m_bCurSrchKeyMark = ! this->m_pCommanderView->m_bCurSrchKeyMark;
	this->m_pCommanderView->RedrawAll();
	return;
}

これで本当に Ctrl+F3が検索語ハイラトの切り替えになったしパターン検索でも問題がなくなった2001年から現在までに何かがあったのだろう

<追記@2010-06-20> 検索条件が選択文字列で置きかわるのは意図された動作だったつま「検索マークの切替え(Command_SEARCH_CLEARMARK)は選択文字列をハイラトしたいときに実行するコマドだということハイラトが消えるのは選択文字列が空のときに限られた動作っきりいってこれは名前が悪い「クリア を 切替え に変更したときに主客転倒してしまってる別のコマドにせーよ </追記>


 @2009-10-12

脈絡もなく突然死するabnormal program terminationと出るからthrowしてる部分が原因どうしてそこを実行するような状態になるのかがわからない色分けの反映が外因による再描画が起こるまで遅れることもやはり前後の脈絡なく起こる徐々に壊れていってるのか?

 @2009-10-13

昨日の突然死はコドと仕様を整理して適当に書き換えてるうちに出なくなったみたいだがその過程で新たなミスを仕込んでいた無効化されたイテレータ変数名にしてたった 5文字のミスそのミスをした次の行ではちゃんと意識して避けていたのに……これのせいで描画範囲の最適化(いまはわかりやすさから常に全面を書き換えている)が進まなかった


 @20009-10-14

仮想関数を持ったベースクラスがあって継承するからには必ずオーバーラドしないと意味のないメンバ関数を = 0; で純粋仮想にしてそうでない必ずしもすべての派生クラスにとって必要ではないものをデフト付きの仮想関数にしていた具体的にいうとデフト付きの仮想関数は正規表現キーワドのためだけに用意されたようなもののことだ

気付かなかった継承した正規表現キーワドのクラスでオーバーラドに失敗していたことに関数が constか非constかの違いで失敗していて別の仮想関数を定義していただけだった。だから C#には overrideーワドがあるんだよ .NET1.0βのときから*7落とし穴だって事は知ってたさ気付くまでっと丸一日かかっただけで……orz

派生クラスで分かり易さのためにわざわざ virtualって書いてるんだからそのときに overrideって書かせてくれていたらコンパイラ「おまえ何をオーバーラドしようとしてるんだ(そんな対象は存在しない)って教えてくれていたはずだ

まさにコレ!>Is there some way to make the compiler check if the function I declared in the derived class actually overrides a function in the base class? (stackoverflow.com)

関連C#のえろい人の話>Versioning, Virtual, and Override


degradeの回復はもううんざりだお次はこれをする

  1. 文字集合内のエスケープされておらずコロンが後ろにない[ をエスケープ<<< POSIXブラケトだけじゃなかった普通の文字集合を文字集合の中に書いて集合の和や積を表現できるんだ(たしかにおおざっぱに範囲を指定して一部を取り除きたいときがある使える機能だ)エスケープ必須なのには理由があったということで無理
  2. 一つのパターン内での色分
  3. いまいち機能していない空間効率の改善

 @2009-10-15

  • パターン内での色分けに対応した

    JavaScriptの正規表現と違ってキャプチャの位置がわかるのでSHJSの仕様に従ってかっこを

      /(A)(B)(C)/

    というように隣接させる必要がない入れ子にすることも許される入れ子にしたら一番内側の色が適用されるようにしたつもり

  • ァイルに改行が一つもなく末尾の文字が正規表現キーワドの色分け対象だったときに無限ループに陥っていたのを修正した

 @2009-10-17

  • 改行部分の検索ハイラトが消えなかったのを修正した
  • パターンのコンパイルエラーを報告するようにした(結果的に 1つのパターンを 2回コンパイルすることになって無駄なんだけども色分けに失敗する原因を特定する時間を短縮する方が大)

@2009-10-11に書いた Ctrl+F3での検索語ハイラトの切り替えについてANSIUNICODE版に共通するパターン検索の問題としてハイラト対象かどうかの判断が(おそらく)常に行頭からのマッチングによっているの対してF3や検索ダイアログの検索開始位置はキャレトのある場所からと異なっている\w{10} というパターンを検索するときハイラトは行頭から探して 10文字を対象とするが検索はキャレトの位置から探した 10文字を選択する

検索語ハイラトのやり方を変えないといけない

先にさらに別の問題の上検索で行末からの検索が行われていなかったのを修正したたとえば"0123456789" という数字10文字の行があって行末から \d{6} を上検索したときに "012345" が選択されてしまい"456789" ではないという問題

まだ直っていないのはキャレトを "3""4" の間に置いて \d{6} を下検索したときにハイラトの範囲が(行頭から探した数字6) "012345" なのに対して選択範囲が(ャレトの後ろから探した数字6) "456789" となり一致しない問題


 @2009-10-18

検索語ハイラトのやり方を変えたパターン検索でも検索開始位置を尊重したハイラトができるようになったただし従来の色分け方法ではCColor_Found::BeginColor()CEditView::IsSearchString()に与えられる引数が十分でないために検索開始位置に配慮した判断ができないというわけでここまでの一連の変更に対する上積みの修正となった(本家へのパッチは UNICODE/ANSI版ともに作成できませ)

@2011-03-31 ハイラトが原因で13000桁を超える程度のファイルで検索がすんごく遅くなってたのでハイラトは検索開始位置を考慮しないように戻した


Luaゃんのためにブロックコメトを行コメトより優先したLuaのブロックコメトは --[[ から ]] までで行コメトが -- から行末までrkw2/Lua.rkw2ァイルを用意して正規表現キーワドで色分けすればなんなりと対応できるけどコメトに関しては専用フームが用意されてるからそちらでできた方が良いっとして Luaとは逆のパタン:行コメトを優先しなければいけない言語があるだろうか? その場合開始文字の長さでソトして長い順に色分け機能を登録しないといけなくなる(ところで Luaにはデクリメト演算子がなさそうコメトより強調キーワ強調キーワドより正規表現キーワドの方が優先順位が高いのでどちらかで -- を登録するとコメトじゃなくなってしまうだろうっそり書いたが強調キーワドに記号が登録できるように仕様変更したつもりだ英字とハイフンを混ぜられるわけではないが&& みたいに全体が記号だけならいけるは)


>>'\0'も置換できるように
>正規表現で \x00 とすれば出来ます。

無理俺は NUL文字を考慮していない

> // 前の行のNULL文字(\0)にもマッチさせるために+1 2003.05.16 かろと

というコメトを CSearchAgent::SearchWord() @ CSearchAgent.cpp で見つけたときに嫌な予感はしたけどもう遅い


設定ファイルのことを考えるときには共有メモリのことを考えないといけないんだ*8個々のプロセス(=一つの文書)にとって必要なタイプ別設定は一つだけだから共通設定と基本設定だけを共有メモリに置いておいて他のタイプ別設定は個別に自分のメモリ空間にロドすればいい気がするけどそうするとタイプ別設定の同期が必要変更して iniァイルに保存したときにブロドキトするだけ? タイプ別設定を共有メモリに載せる必要はある? > タイプ別設定数を可変長に


正規表現インクリメンタルサーチなんて機能がある! ひえ


>正規表現による複数行検索対(簡易版 正規表現ライブラリに適切なインターフェイスがない限りァイルサイズに比例したメモリを消費しないと完全な対応はできない気がする

  1. ッチに失敗したのは対象文字列を一行しか与えなかったせいかもしれない
  2. ッチに失敗したのは対象文字列を二行しか与えなかったせいかもしれない
  3. (以下 EOFまで繰り返)

既存の APIに適合させるための非効率的なごり押し(に思える)ッファに格納する行数を事前に入力させるような設計(行数に制限があることと設定の手間あと指定させるなら行数よりバッファサイズでしょうーザーの利便性よりコンピータの効率よりプログラマの都合を優先させてどうするの?)には尻込みしてしまうたとえば <table>タグで囲まれた部分を探そうとしたときにその中身が最大で何行ぐらいあるだろうかとか考えたくはない


 @2009-10-19

色分けのために行ごとに保存するキッシュをトする機能は価値があるかもMB35000行程度のファイルで一行削除する度にスクロールを待たされるのはたまらないマシスペックにもよるがPageDownーを押し続けるだけでは待たされないCtrl+Endやスクロールバーを掴んだときに顕著しかもこのファイルは色分け対象ではなかったさらに遅くなるってことだ

  • 0の上検索がいつまでもその場足踏みしてないで上へ進むように修正
  • ャレトより前の0の行頭マッチがハイラトできていなかったのを修正(あんまりやりにくいので CViewCommander::Command_SEARCH_PREV()から gotoを取り除いて不必要に選択範囲を保存するのをやめ)
  • 強調キーワドが語の境界を気にしていなかったのを修正(少し前にいらない気がして削除した部分がやっぱり必要だったとい)
  • $\b などの幅0のパターンを検索したときにキャレトが表示されたままになるのを修正(実はキャレトではなく空の選択範囲だ)

 @2009-10-20

昨日の空の選択範囲が消えない対策として空のときは範囲選択をしないことにしたら今度は下検索が先へ進まない現在の選択範囲が空かどうかでその場足踏み対策をしていたからだったっぱり正攻法の空の選択範囲の表示をキャレトの移動に伴ってきちんとクリアすることで解決するのがよさそうそのへんのコドの流れがよくわからないから手を付けなかったんだけど

空の選択範囲はキャレトと表示がかぶってしまってャレトの点滅が一巡するまでキャレトを見失うデメリトもあるっそ描画しないのがいいのではそれがいいとは思わないけど幅のない矩形選択範囲も現在は描画されていないのだし

わかってきた空の選択範囲が消えないのは改行記号を描画していないからだ

というわけでもなかった

選択開始時というのは幅0の選択をしている状態であるそのときにCViewSelect::DrawTextArea()を呼ぶことで選択範囲の始点の反転・反転解除の対応がとれたと思う空の選択範囲のゴミは残らなくなったそのおかげで幅0の矩形選択範囲を不具合なくある程度の幅で描画できるようになった

そもそもどの変更でゴミが残るようにしてしまったんだろう?検索と色分けのあたりしかさわってない

 // 2005/04/02 かろと 0文字マッチだと反転幅が0となり反転されないので、1/3文字幅だけ反転させる
 // 2005/06/26 zenryaku 選択解除でキャレットの残骸が残る問題を修正
 // 2005/09/29 ryoji スクロール時にキャレットのようなゴミが表示される問題を修正

こういうコメトが残っていて繊細な部分だったという言い訳はできそうだ

ここ数日は一退一進で進んでいない

18日から 20日にかけてexeのサイズが 50KBdiffのサイズが数KB縮んでいるmergeのやり方を変えたんだが失敗しているとしか思えない


 @2009-10-20

色分けは別スレドにするのがいいなCPU使用率を(3コアだか) 33%にはりつかせてーザーをなすすべもなく待たせてってることが色分けだなんてアホすぎる>@2009-10-19

中心となるデータ構造は一つ行ごとの色分け開始状態コンテキトといってもいい前の行から続くコメトの中なのか文字列の中なのか一番外側なのかを表した配列

色分けスレドは未確定の要素のうち一番小さいインデックスを持つものの一つ前の行をひたすら色分けして確定に変えていく

メイスレドは行の内容に変更があったからその次の行が未確定に変わったことある行からある行にかけて削除されてしまったからその後ろが軒並み未確定に変わってしまった(賢ければ対応する要素を取り除いて後ろの要素を前にトし未確定にするのは先頭の一要素だけで済ませてよい)ことを知らせる色分け結果はタイムアト付きで受け取り間に合わなければ色分けなんてせずに文字の表示を優先する

  • 排他処理
  • 未確定要素が存在しないときに色分けスレドの実行をブロック
  • タイムア

こういう機能はどうやったら手に入るだろう特に 2番目と 3番目イベトとかシグナル? C++標準は無し?

そもそも配列を所有するオブジトがこういう機能を提供するのだろうけどそのオブジトはどのスレドに属しているの3

違う違う両方のスレドがそのオブジトのメンバ関数を起動するから排他処理が必要になるんだって

Unicodeリテラル(>20091007)といい正常進化だよね>C++0xのマルチスレド機2/3CodeZine難しい部分はコンパイラとライブラリ作者に任せて便利な部分を享受するだけの末端アマグラマ拝


非キーワド文字を含む強調キーワドの色分けを可能にした空白が入っていてもハイフンが入っていてもバッククオトで始まっていてもーワドの先頭と末尾が語の境界にありさえすれば色分けする今は文字を 3種類に分類して語の境界を検出している即ち空白類ーワドに使用できる文字ーワドに使用できない文字おおざっぱだけど結構大丈夫この変更は単独パッチにできる

正規表現でたとえると従来の色分けは \b\w+\b を色分けする昨日までは \b(\w+|[^\w\s]+)\b を色分けしていた今日のは \b\S.*?\b を色分けする(\b\w[^\w\s]\w\s[^\w\s]\sの境)

弱点は最長一致ではないから共通の接頭辞を持つ複数のキーワドが一緒に登録されていると長い方は絶対に色分けされないことA-BAが登録されていたときA-Bは絶対に色分け対象にならない面倒だけどキーワドセトを二つに分けて長い方を強調キーワ1短い方を強調キーワ2に割り当てると番号の若い強調キーワドが優先されるので長いキーワドも色分けできるようにはなる

<追記@2010-04-04> やはりというか、掲示板(unicode:1156)で最長一致について言及されてしまったrev2ッチで最長一致に対応したつもり </追記>


 @2009-10-22

昨日おかした間違いトイレで気がついたよ<どうでもいい

長さが足りなくて登録キーワドと一致しなかったときにーワド文字かどうかに関わらず続く語を加えて改めてキーワドかどうかお伺いをたてるようにしたのが昨日の変更それでその結果が結局不一致となったときにカーソルを巻き戻すのを忘れていたせいでーワドの見落としが起こっていた(はずだ)

予想通りだった修正した

こういうケース

# 強調キーワード(2つ)
本日は、晴天なり
晴天じゃないよ

# テキスト(1行)
本日は、晴天じゃないよ。

晴天じゃないよの部分が見落とされていた


 @2009-10-24

ハイラトの描画が古い情報に基づいていたのを修正したなにが大丈夫だから省略> 過去の自分


 @2009-10-27

@2009-10-20での矩形選択始点にゴミが残る問題の修正の結果普通の選択でゴミが残るようになっていたそれならこれでどうだ


 @2009-10-30

組み込み「半角数値の色分けが単語の境界を認識せず数字とみれば見境なく色分けするようにしてしまっていたのを修正した


検索語ハイラトがおかしいCEditView::IsSearchString()の仕様が正規表現検索とそうでない場合で異なっていたことに気付かず正規表現を使用しないときは一行につき一つしかハイラトできていなかった正規表現を使用した検索でもハイラトすべき語が周期的にスキップされてしまう

修正した


@2009-10-10で書いた「どなたかの受け売りで代入( = など)と演算子( == など)を分けたこの日記での色分けも以前からそうしているの元ネタを再発見したこれを以前読んでいたのだ

With syntax highlighting it would be possible to mark "=" and "==" in different colours. Yay! A good reason for implementing syntax highlighting! Butand at this point it probably won't surprise youevery colour scheme I've come across uses the same colour to highlight both "=" and "==".

http://www.linusakesson.net/programming/syntaxhighlighting/index.php

 @2009-10-31

っと考え直して正規表現キーワドの優先順位を強調キーワドの下に下げた正規表現キーワドのフーマトは難しく強調キーワドのは簡単なので「何でこのキーワ登録して設定したのに色分けされへんの?ムキー!ってならないように(容易に想像できる通り今日の自分がそうだったからで)


 @2009-11-01

正規表現キーワドの色設定のチック状態が反映されていなかったのを修正した以前の正規表現キーワドと違い一つのパターンが一つの色設定にひもつけられるわけではないのでック状態は機能の ON/OFFを意味しないックが外れていた場合「テキ色に色分けすることにした


 @2009-11-02 検索語を複数の色でハイラトできるようにした

>複数検索結果のハイラト表示 Request/197 - SakuraEditorWiki

最初に一言検索履歴を利用して複数の色分け対象を探すのは使いやすいインターフェイスがみつからないだろう

検索機能は大枠で三種類あるパターン検索単語検索それとただの検索今回変更したのは単語検索単語検索では検索語が一単語でない場合たとえば空白やピリドやハイフンを含んでいた場合これまでは絶対にマッチが見つからなかった(と思う)だから検索語を単語に区切って各々を違う色に塗り分けても悪影響はないだろうむしろ望むところ?という判断

ールバーの検索ボックスを単語検索専用にするか別に用意すればすごく使いやすくなる


 @2009-11-04

検索文字列の色設定のチック状態を反映するように修正


 @2009-11-15

Very Sleepyを試してみたCtrl+Endを押すと wcschr()がものすごい勢いで呼ばれているらしいそれを呼ぶのは文字変換系などを除くと WCODE::IsZenkakuKigou()がくさいさらにそれを呼ぶのは CWordParse::WhatKindOfChar()これは単語の境界判定で使われている

改行文字36223折り返し64935行のファイルの先頭で Ctrl+Endを押すと以下のような呼び出し履歴を伴って CWordParse::WhatKindOfChar()が○百万回呼ばれていた笑うしかないと書こうとしたが終わらない回数は数えられなかったどうやら Visual Studioが張り付いた状態では限界が低くなるらしいこのファイルの内容をサイズが 100MBを超えるくらいまでコピペを繰り返したファイルでも無限ループ状態になるのを確認している(何時間も終わらなければ無限でし)

sakuraW.exe!CWordParse::WhatKindOfChar(const wchar_t * pData=0x027dd078, int pDataLen=134)  行 120	C++
sakuraW.exe!CWordParse::WhereCurrentWord_2(const wchar_t * pLine=0x027dd078, int nLineLen=134, int nIdx=125, int * pnIdxFrom=0x0017f76c, int * pnIdxTo=0x0017f768, CNativeW * pcmcmWord=0x00000000, CNativeW * pcmcmWordLeft=0x00000000)  行 49 + 0x10 バイト	C++
sakuraW.exe!CEditView::IsSearchString(const CStringRef & cStr={...}, int nPos=125, int * pnSearchStart=0x026338f4, int * pnSearchEnd=0x026338f8)  行 307 + 0x24 バイト	C++
sakuraW.exe!CColorML_Found::IsStartOfKeyword(const CEditDoc * const pDoc=0x02740048, const int nLineNumber=40057076, const int nPosWithinLine=125, EColorIndexType * const outColor=0x0017f80c, void * * userData=0x04af1e94)  行 56	C++
sakuraW.exe!ColorMLStrategy::HighlightEngine::DoHighlightLine(const std::vector<CColorML_Base * const,std::allocator<CColorML_Base * const> > & strategies=[2](0x026338a8,0x026338e8 {pView=0x0263a458 lineNum=1582 begin=-1 ...}), const CEditDoc * const pDoc=0x02740048, const int nLineNumber=1582, const ColorMLStrategy::HighlightEngine::StartingStrategy & startingStrategy={...}, ColorMLStrategy::Result * const outResult=0x00000000)  行 113 + 0x27 バイト	C++
sakuraW.exe!ColorMLStrategy::HighlightEngine::HighlightLine(const std::vector<CColorML_Base * const,std::allocator<CColorML_Base * const> > & strategies=[2](0x026338a8,0x026338e8 {pView=0x0263a458 lineNum=1582 begin=-1 ...}), const CEditDoc * const pDoc=0x02740048, const int nLineNumber=36202, ColorMLStrategy::Result * const outResult=0x0017f9bc)  行 69	C++
sakuraW.exe!ColorMLStrategy::HighlightLine(const CEditDoc * const pDoc=0x02740048, const int nLineNumber=36202, ColorMLStrategy::Result * const outResult=0x0017f9bc)  行 200	C++
sakuraW.exe!CEditView::DrawLogicLine(HDC__ * _hdc=0x00008d6a, DispPos * _pDispPos=0x00000000, int * pnLineTo=0x0017fbe4)  行 546	C++
sakuraW.exe!CEditView::OnPaint(HDC__ * _hdc=0x01011734, tagPAINTSTRUCT * pPs=0x0017fc38, int bDrawFromComptibleBmp=18)  行 377	C++
sakuraW.exe!CEditView::DispatchEvent(HWND__ * hwnd=0x00080684, unsigned int uMsg=0, unsigned int wParam=0, long lParam=0)  行 693	C++
sakuraW.exe!EditViewWndProc(HWND__ * hwnd=0x00080684, unsigned int uMsg=15, unsigned int wParam=0, long lParam=0)  行 103	C++

  1. 検索語ハイラトが無駄に表示領域外の色分けに励んでいたのをやめさせた
  2. そうすると次に単独の関数として一番時間を食っているのが _wctomb_s_l()これは URLの色分け判定で使われる IsURL(@parse/CWordParse.cpp)から呼ばれているIsMailAddress(@parse/CWordParse.cpp)IsUrl()から呼ばれやはりかなりの時間を消費している単語の境界判定を上位で行って IsURL()の呼び出し回数を減らした
  3. CDocLineMgrの実装がリトなのドキュメトの○行目を取得するコトが高い個々の色分けユニトにパラメータを通して CDocLineを渡すことにした

CLayoutMgrの実装もリランダムアクセスの遅さ(=CLayoutMgr.SearchLineByLayoutY()の遅さ)がスクロールバドラッグしたときのカクカクした反応に現れているメモリは潤沢にあるものとしてCPU速度と相談していくつまでならリトをたどっても満足なスポスを返せるかを決めるたとえばそれが 10000なら 10000行ごとにシトカト用のポインタを持っておけばいい

インデックスのはりすぎは更新のコトがいやんなことになる@2013-07-2610000行ごとって決めてしまわずにルーズに管理して更新頻度を減らそうとすると直近のシトカトを見つけるのが割り算一発からバイナリサーチになるなあ

ポインタ二個分のオーバーヘドをもった doubly-linked listなんかよりつなぎ合わせた vectorでいいじゃない(そうするとこんどはリターンキーのスポスが気になるわけだけ)


 @2009-12-21 われながら遠回りしてるよなあ

  1. ップバッファは GreenPad で知ったのだが私は説明しないんで別のページで勉強してください(Alpha のグダグダ日)
  2. 17:35 04/05/29ップバッフ(w.l.o.g.)

AlphaGreenPadとならんでースを参考にしたいエタのにおいがする(まだチラ見もしてないけど)Alphaのリポトリの最終更新は 43時間前とまだ生きてるのも嬉しい

GreenPadはねえどこに機能があったのか?と見返してしまうほどにひとつひとつのファイルはすかすかで整然としてるだからといってべらぼうにファイル数が多いわけでもないテキトエタなんてその程度の規模のアプリなんだと思わせてくれるのだけど自分で書いたら管理不能なスパゲになるのが見えていて知識とテクニックと設計能力の差を思い知るよね


Alpha-0.7.5.16α-fix10.rbァイルを開く#のみの行で #がコメト色にならないとかなんで設定変更できないの?とか枝葉末節はおいておいて機能性もスポスの良さも申し分ない文字の表示がきれい軽や紙切れのようだ100MB超のファイルを開くと CPU使用率 33%(1コアフルロ)でフリーズして応答が戻らないけどそんなん耐久テトのみの世界だし正規表現で複数行検索できるのが何よりすばらしいそれはやはりBoost.Regexだからできたのかなあ >2006-12-22 Boost.Regex で改行をまたぐ検索を その 8 (Alpha の अनुपयोगी な日)入力はイテレータかトリームで与えたいよねえっと\w{10} の前検索が戻っていかない(毛色の違う先端バージョン 0.7.9x系列)Alpha-0.7.93.5αや\w{10}\n というパターンだとバックしていくのだAlpha-0.7.93.5αは選択範囲の D&Dで落ちた本当にアルファ版なんだ

ースの前に日記(Alpha の अनुपयोगी な日記)も読み応えがあるなあグリフって何?レベルの人間には Unicode関連の話が理解できない内部文字集合が Unicodeってだけでなくすごく真面目に Localization(でいいのかな?)に取り組んでるのが伝わってくるそれとメモ帳タを名乗るからにはこけおどしの機能をてんこ盛りにする前に文字の表示で(世界中で販売されている Windowsに添付されている)メモ帳品質を超えていてほしいものだ


 @2009-12-23 l10n v.s. m17n

昨日Localization(でいいのかな?)と書いたけど2006年あたりの日記(Alpha の باطل な日記)を見てると Multilingualizationまで踏み込んでいる気がする「気がするのは用語の適用範囲がいまいちわかっていないから。Unicodeがモノリンガルであるということの意味がそもそもわからん


 @2009-12-24 パターン検索での上検索と下検索の対称性

ってしまいました

@2009-10-17に書い「上検索で行末からの検索が行われていなかったのを修正したたとえば"0123456789" という数字10文字の行があって行末から \d{6} を上検索したときに "012345" が選択されてしまい"456789" ではないという問題に伴う副作用だと思う気付いたきっかけはこの日記

サクラは '00000'00000 ←→ 00000'00000' だから挙動に納得は出来る EmEditorは一見真魚と同じに見えるが aaa1aaa1aaa1に対して+1で検索すれば 順方向では開始位置から最後までがヒトするのに逆方向ではa1だけがヒトする これも全く納得できない理解不能な動作だ

汁么ゴ魚 - 鬼車#3

上検索で a1 ではなく aaa1aaa1aaa1 にマッチするようにはできる副作用だけを取り除けるはずだ正規表現マッチの基本は greedyだから上検索で a1 にしかマッチしないのは自分も納得できない

真魚の最新版(2.2.3.5)aaa1aaa1aaa1 に対して .+1 を下検索すると全体がマッチするのに上検索すると a1 に三回マッチするっていうのは全く納得できない理解不能な動作だどこかで心変わりしたのです

気にせず greedyな上検索にしてみたけど中途半端な結果になった

  1. aaa1aaa1aaa1 の末尾から .+1 を上検索すると aaa1aaa1aaa1 がマッチする(期待通)
  2. aaa1aaa1aaa1 の末尾の 1の手前から .+1 を上検索するとマッチなし(先頭から aaa1aaa1にマッチしてほし)
  3. aaa1aaa1aaa1 の末尾から .+?1 を上検索すると 1aaa1 にマッチする(右から左へのマッチングを正当に行った場合は a1にマッチするのが正しいかもしれない下検索の対称という観点では aaa1にマッチするのもありかもしれないでもどちらでもな)

本家のサクラエタは 3番目に対応している上検索の実装が(行頭から始まる)下検索の巻き戻しだからだところがそれではキャレト位置からの上検索ができないからと変更したのだったその結果下検索を繰り返してキャレトが進んでいくたびにキャレトより前のハイラト範囲(=上検索でのマッチ範囲)がうぞうぞと変化するようになったと自分で報告していたのだから最初から上検索と下検索の対称性などのぞむべくもなかったのだ

対称性は(自分の望んだ結果なのだから)捨てられるとしても2番目と 3番目にはよりよいマッチが存在しているのに対応することができないっとしたら 2番目は鬼車の APIを直接使「検索対象文字列の終端とは違「検索対象文字列の検索終了位置を渡すことで$が誤ってマッチする心配なしにaaa1aaa1にマッチさせられるかもしれないでも 3番目は .NET FrameworkRegexOptions 列挙体 (System.Text.RegularExpressions)に用意されている RightToLeftオプションのようなものが予め用意されていなければ自作するしかないような気がしたが\1 のような参照とキャプチャの前後を入れ替えられるわけもなく.+?1 の上検索が a1にマッチするのを期待するのは無茶ってものだ

行末やキャレト位置からの(中途半端におわってしまう)上検索より(行頭からの)下検索の巻き戻しのように(大部分で)対称的に動作する上検索がわかりやすさも使い勝手も勝ってるようだ(すでに加えた変更を巻き戻すかどうか迷)

 CRLFCRLF

同じく真魚の作者の日記から

正しくは、
CR:←
LF:↓
CRLF:←曲がって↓
LFCR:↓で一行、←で一行
こんな表記になる。

あきらかに間違っているのはサクラエディタで、CRとLFの矢印が逆だ。
いや、Windowsの間違いにわざと乗ってやってると言うべきなのか。
CR:↓(逆)
LF:←(逆)
CRLF:↓曲がって←(逆+逆)
LFCR:←曲がって↓(一行にまとめてはいけない)
汁么ゴ魚 - CRLFの問題

今は ANSIUnicode版ともに CRLFの逆転は解消されCRは←でLFは↓で描画されているCRLFはそのままだがこれはLF()CR()の組み合わせなのではなくリターン記号(cf.リターンキ(ja.wikipedia.org))ったんだよWindowsにおいて改行と CRLFとリターンキーは切っても切れない関係なんだからという強弁で乗り切ろう


 @2010-01-23

URLの色分けがいつからかできてないや

2009-11-16からだアルファベトかをどうか調べる関数に文字(wchar_t)のかわりにその文字の文字列中でのインデックス(int)を渡していた

intwchar_t(オプションにより組み込み型扱いになっている)は全くの別物だと思うんだけどなあ


相変わらずマージってやつは泥臭い作業で自信が持てない同じコドブロックが複数回連続してるような場所がみつかってもまったく驚かないよ


 @2010-04-14 バグ修正

行をまたぐ色分けに問題があってたとえば一画面に収まらない長大な複数行文字列があったとして何度も上下にスクロールしたり改行を入力したりするだけで色分けが変わってしまっていた


 @2010-04-23っとしたバグ

括弧類を色分け対象にしていて「対括弧の強調も有効になってる場合ャレトが括弧から離れるときに閉じ括弧の表示が閉じ括弧の次の文字と同じになってしまう


 っとしたバグ解決

このブランチ単体でも純粋な公式 trunk2でも再現しないからその差分を見ていたら見つけた

http://sakura-editor.svn.sourceforge.net/viewvc/sakura-editor?view=rev&revision=1723

Index: sakura_core/view/CEditView_Paint_Bracket.cpp
===================================================================
--- sakura_core/view/CEditView_Paint_Bracket.cpp	(.../shjs_style_regex_keyword)	(リビジョン 45197)
+++ sakura_core/view/CEditView_Paint_Bracket.cpp	(.../build_my_sakura)	(リビジョン 45197)
@@ -138,7 +138,7 @@
if( IsBracket( pLine, OutputX, CLogicInt(1) ) ){
	// 03/10/24 ai 折り返し行のColorIndexが正しく取得できない問題に対応
	// 2009.02.07 ryoji GetColorIndex に渡すインデックスの仕様変更(元はこっちの仕様だった模様)
-	nColorIndex = GetColorIndex( pcLayout, OutputX );
+	nColorIndex = GetColorIndex( pcLayout, OutputX + 1 );
 					}
else{
	SetBracketPairPos( false );

+1したら次の文字の色になるのも当然GetColorIndex()の中身がブランチの方で別物になってるから公式で行われた上のような呼び出し部分の変更はマージしてはいけなかった


ここらで続く


sakuraW+rkw2.zip (645KiB, 2011-05-25, 2.0.2.0(r1913))

shjs_style_regex_keyword(trunk2@1711).patch (352KiB, 2010-04-14)

svn co https://sakura-editor.svn.sourceforge.net/svnroot/sakura-editor/sakura/trunk2/@1711
  • 突然エラー終了しても泣かない
  • 突然応答がなくなって強制終了するしかなくなっても泣かない
  • 数千文字ある行に対して . をパターン検索するなどして数千回のマッチングが行われそうな場合応答がなくなる(っても返ってくるかは不)
  • bregonig.dll(Unicode)exeの隣にないと当然機能しない
  • タイプ設定名と rkw2ァイルの名前を一致させないと機能は ONにならない
    • タイプ設定名にファイル名に使えない文字が使われている場合その文字を対応する全角文字に置き換えた名前のファイルを作成すればいい
    • この文字( \ )が円マークに見えてる人も全角の \ に置き換えないとファイルを見つけられないので
  • たまたまこの日(2009-08-08)の日記に SHJSのバトラックのことが書いてあるがその機能はない\(改行)JavaScriptの文字列が次行に継続することならば確認できる
  • 無限ループ対策をしていないのである Stateから同じ State一文字も消費しないで遷移するルトが存在すると抜けられない先読みを使って遷移先を振り分けるときは注意

気ままな変更がちらほら

  • 設定のデフトを常駐OFFに変更ーラーソル行アンダーライン改行文字タブEOF表示をOFFに変更正規表現キーワドの色分けを ONに変更
    • 常駐はしないのが普通(俺はブラウザの次によく使うからスタトアップに入れて常駐させてるけど)
    • 改行もタブも空白としてありふれた文字だから表示するとうるさい視認する必要も一般人にはあまりない
      • いきなりの自己否定一般人はサクラエっていうかエタ自体使わないんだよね(伝聞)画像はフトシテキトはワみたいなjpgを表示するだけならフトシップよりブラウザブラウザより IrfanView(たとえが古いな)が軽いだろうけどそんなことは気にしないアイコンをダブルクリックするだけというイメージ
    • 今や実在も疑わしい EOFわざわざ表示する必要はなかろう
    • ーラー? カーソル行アンダーライン? 存在理由がわからない(ーラーにこだわる人がいるのは知っている)
    • 正規表現キーワドは表示までにユーザーの設定が別途必要なので色設定は予め ONの方がわかりやすい
  • 色設定を二つのファイル( view/colors/EColorIndexType.h, .cpp )に集約
  • パターン検索でも検索開始位置を尊重した上検索とハイラトを行う
    • \w{10} のようなパターンで F3(Shift+F3)を押していけばャレトが通り過ぎたあとのハイラト範囲がうぞうぞ変化するのがわかるかと
  • 0の矩形選択範囲が見える
  • 空白やハイフンを含んでいたりッククオトで始まっている強調キーワドを色分けできる(最長一)
  • 検索語を複数の色でハイラトできる
  • 文脈依存変換パッチrev3.3(SourceForge.net: Sakura Editor: Detail: 2972711 - IME前後ドバック機能)
  • 拡張子の存在しないファイルはファイル名を拡張子とみなして適用するファイルタイプを決定する(guess_filetype_of_extlessfile.patch 拡張子リmak makefileとしておけば MAKEFILEにもファイルタイプを適用できる副作用で a.makefileMAKというファイルにも適用され)

 SHJS-0.5/lang/sh_*.jsから rkw2ーマトへの変換

  • ifや代入部分(セミコロンも!)を削除してオブジト配列の配列だけにする
  • パターン中の文字集合の中の [ をすべてエスケープする
  • \xXXというパターンを Unicode形式にするか削除する(JavaScriptではこのへんをうまく扱ってくれる*9のだけど鬼車は違)

色分けされないときのチックリ

ァイルの配置は正しいか?
sakuraW.iniァイルのあるフォルダに rkw2ォルダを置かないといけないsakuraW.exesakuraW.exe.iniのあるフォルダではない
正規表現キーワドの色指定をデフトから変更したか?
色分けの結果「テキと同じでは区別できない

Javaった java.util.regex.Matcherクラスの requireEnd()hitEnd()がそう他にも AnchoringBoundsTransparentBoundsが用意されているなど至れり尽くせりこういう生真面目さが Javaの良さであり冗長さや遅さを許す一因だったのかもと今は思う

* WikiPedia(ja)を見たら JSONで表現できるデータタイプに正規表現がない!ポータブルじゃないからか? ほかにも有効でないエスケープシークエ(\Gとか \qGq自身を表す)とか \(改行)というエスケープシークエスが無効シングルクーテーション文字列もないJSON_checkerによるとマイナスの後に空白を入れるのもプラスを明示的に付けるのも許されない窮屈だけど\x[\x] というエスケープシークエスの存在が正規表現パターンの簡易的な解釈を一段面倒なものにしていると感じていた(>[[20090922p01]])ところなので悪くはない

 内部で使用するだけの型の完全な情報を実装(cppァイル)に閉じ込めようと思ったらッダの中のクラスはその見せる必要のない型をポインタで保持するしかないのか? privateメンバーの詳細(サイズとか)なんてどうでもいいから隠したいのだがポインタで保持することにするとコトラクタで newすることになるのが嬉しくないというジレンマトラクタが呼べないからと std::auto_ptrにすることもできず生ポインタをメンバにしないといけないのも困りもの(明らか「所有しているのに生ポインタではそれが伝わらない)

 @2009-10-24トラクタが呼べないのはauto_ptrをメンバに持つクラスのデトラクタがコンパイラの生成するデフトのデトラクタだったからッダでデトラクタを宣言して実装で空のデトラクタを書けば解決ョルン・ールソBoost(2008, ピアソン・エデュケーション)に書いてあったimplクラス(構造体)の寿命管理を scoped_ptrに任せトラクタから pimpl_(implオブジ)delete文を削除する(scoped_ptrを使えば deleteは不要となるのです)だけで作業は完了です。ただトラクタそのものは定義しておく必要があるということを覚えておいてくださいその理由はコンパイラが暗黙のデトラクタを生成する時点では型 implが不完全でありpimpl_のデトラクタを呼び出せないためです。implの格納に auto_ptrを用いた場合こういったエラーを含むコドがコンパイルされてしまうことになりますがscoped_ptrを用いることでエラーを検出できるのでauto_ptrの場合に起こ「こういったエラが何なのかわかっていないが……

*4 @2010-01-29 More Exceptional C++を読み返していたらこれにも原因の説明と対処法が載っていた読んでいたはずだけど一度自分で穴にはまらないと気付きにくい問題だろうね

*5 今のままでは正規表現のフラグとフラグの間にコメトが埋め込めそうコメトは空白文字だとしてreturnStateに戻る代わりに state_transition_table[returnState][C_SPACE]に戻れば良さげ。

*6 現在までに書いた C++ドの 99%以上がここ 12か月のものだというにわかではあるけども

*7 というかそのときの C#しか知らない

*8 共有メモリにオブジトを置いて初期化されていないゴミメモリにアクセスしたりったら placement newの出番だとコトラクタを呼んだんだけど(想像では)似非共有オブジトが私的に確保したメモリは共有されてなくてやっぱりエラーになった少し前の記憶がよみがえる

@2013-07-26 Scintillaでの行管理の工夫[[Scintillaのデータ設計 - maneman8000の日記|http://d.hatena.ne.jp/maneman8000/20110206/1297006996]]インデックスの更新が必要なエリアはある点から始まり必ず末尾で終わるある点をひとつ記憶しておくことで更新範囲をある点とある点の差分にすることができる

*9 文字列の内部表現が Unicodeなのに \xXX という ASCIIド指定を意味が変わらないように解釈してくれる


20090622() 関数の外の const intstatic const intは同じ?

[SakuraEditor] メニーバー右端のメッセージ表示改善

縦書き編集機能とか実装できるほどのスキルがあればいいんだけどねえ


2chに化けるという書き込みがあって試してみたら表示が消しゴムで消すように欠ける描画漏れだと思ったんだけど後で調べたらそもそもメッセージを保存していなくて再描画するつもりがないったら改善す"べき"とまでは思えないんだよね(タイポのようなものの指摘はできても自分の考えを押しつけることまではできない)


ステータスバーが非表示のときにメニーバー右端に表示されるメッセージの再描画に対応一時メッセージだとしてもメッセージが半欠けの状態で表示されてたらバグととられても仕方ないから> fix_menubarmessage.diff

この修正中にこんな処理が行われていたことを知ったのだけど……

 // 編集ウィンドウ切替中(タブまとめ時)はタイトルバーのアクティブ/非アクティブ状態をできるだけ変更しないように(1)	// 2007.04.03 ryoji
 // 前面にいるのが編集ウィンドウならアクティブ状態を保持する

タブ切り替え時に二つのサクラエドウが重なる瞬間があってAero Glass効果が有効だとこの時にタトルバーの透明度が下がる(色が濃くなる)結果対策もむなしくちらついて見えるこれに対応した対処法はあるかな?


 ッコミを受けての追記

行・列番号の表示よりも右の部分にゴミが表示されます。

Vistaしかないので制御文字が半角空白に置き換えられたときに区別できるようにッセージの余白ではな*で埋めて表示してみたけれど表示は変わらないこのッセージの余白を埋める文字がすべてゴミになっているのだろう2ch

ステータスバーを消すとメニーバーの右端が化けちゃうんだけどどうすれば

サクラエタふぁんくらぶ part12

というのを読んで俺は表示が欠けることを指して化けると言っているのかと思ったんだけど(繰り返すけど Vistaだとゴミは見えないので)この書き込み主は Windows2000でも使っていて半角「・のことを指して化けると言っている可能性もあるかも(俺がバグを仕込んだのではないと思いたい)

タブ切り替え時のちらつき防止はーアイ(ったら書いてる)っかく見映えの細かいところにまで気が配られているのに自分の環境で働いていないってのは悲しいからAero Glassにも対応できたらいいよね


_tcsncpyコピー元が短いときにコピー先の末尾に埋める '\0' 「・に変換されるんだCの林立する文字列操作関数が大嫌いでいつも(といって片手で数えられるほど)std::stringに逃げるんだよね元々のソースはちゃんとやってたのに俺がテーなことをしたわけだ確保した領域の一つ先に書き込むとか言い訳できないミスもしてるし……

今度は右端に埋め文字( の代わり*)が見えた > fix_menubarmessage(rev2).diff


さらなるチョンボ(泥沼の様相を呈してきました)っきの改訂でメッセージが空になることがなくなったので表示したメッセージのクリアが行われないはずだ

もう最後にしたい > fix_menubarmessage(rev3).diff

本日のツッコミ(1) ッコミを入れる

ryojiッチ(fix_menubarmessage.diff)を適用したものだと 行・列番号の表示よりも右の部分にゴミ..


20090603() [SakuraEditor] () 新しく開いたファイルを現在のタブのすぐ右側に追加する機能

最終更: 2009-08-26T17:01+0900

[SakuraEditor] 新しく開いたファイルを現在のタブのすぐ右側に追加する機能(2009-06-04)

要望を書いて次の日になんとかするセルフサービス > open_tab_right.diff

便利なメソ( CTabWnd::ReorderTab )が既に用意されていたので楽でした

結果はわりと希望通りの動作

  • タに対して Ctrl+Oすぐ右のタブにファイルを開く
  • タに対して Ctrl+Nすぐ右のタブに新しいファイルを作成
  • タに対して Ctrl+Gすぐ右のタブに GREP結果
  • タに対してファイドロップですぐ右のタブにファイルを開く
  • トレイアイコンから新規作成では右端にタブを追加
  • トレイアイコンから最近使ったファイルでは右端にタブを追加

ックグラウドでタブを開く機能はないから連続してファイルを開いたときに新しいタブが右に延びるか左に延びるかということは考えていない(01234...となるか 0...4321となる特別に考慮しなければ後者にな)

タブを閉じたときに次にアクブになるタブは多分直前にアクブだったタブ理想とする Firefox + TabsOpenRelativeだと基本的に閉じたタブの右側のタブがアクブになるもののある条件で元のタブ(閉じたタブの左側のタブ)がアクブになるタブを閉じたとき次にアクブになるタブにこだわりはないので変更していない


知らなかったけど svk diffの出力をリダイレトしたファイルが CR/CRLF混合diff自身のメッセージが CR区切りになってるからみたいったいどこの diffを使ってるんだ

よくみると CRの部分は改行がダブってるCRCRLFCR+CRLFと解釈されてるみたいCRLFLFに誤って CRを補ってしまったのかも(だれが)


あとは「前回開いていたファイルを復元する機能が欲しいところタブの順序ーソル位置スクロール位置検索文字列ゥ記録(は無理か)などなどの復元も込みで