/ 最近 .rdf 追記 設定 本棚

脳log[SakuraEditor: 2011-04-06~]



2011年04月06日 (水) zenback を入れてみた」一点にだけ注目していた。期待は裏切られなかった。コメントの後に ZENBACKが表示されるのがイイ。そうでないと、読もうと思ったコメントが遅延ロードされた ZENBACKに押しやられて逃げていってしまうから。追記@2011-04-07:「zenbackをツッコミ欄の後ろに表示させた一件 - kayakaya日記(2011-03-28)」 突如わいてきた(ように見えた)要望の目的は最初からそこにあったのね。スクリプトを埋め込むのに tDiary本体の修正が本当に必要?って思って、danなにがしさんの(コメントが逃げる)ブログを Firebugで覗いてみたりしてたのよ。この後者のエントリを発見したのが、前のエントリの関連リンク(powered by zenback)だってんだから有用性は疑いえないな。

最終更新: 2011-04-14T01:54+0900

[SakuraEditor] BugReport/70 - SakuraEditorWiki

まったく、CViewCommander::Command_REPLACE_ALL ってのは人類の理解の範囲を超えている。

  • 通常選択範囲を置換
  • 矩形選択範囲を置換
  • ファイル全体を置換
  • 対象範囲を行単位で置換
  • 対象範囲をひとつのマッチごとに置換
  • 正規表現ライブラリを使って置換
  • クリップボードのテキストに置換
  • クリップボードの矩形テキストに置換
  • 置換ではなく前に挿入する
  • 置換ではなく後ろに挿入する

これ、あえて異なる複数の分類を一括りのリストにしてるけど、実際のコードがそうなのだ。こんな処理が一つの関数の中に、変数を共有しながら―しかも型を偽って本来とは違う使い方が特定の処理ルートではなされていたりする―、一部の処理を共有しながら、インターリーブされてる。

BugReport70.patch (1.7KiB, 2011-04-07 02:50)

submit(<commit以前)はしない。怖すぎる。


「「すべて置換」は置換の繰返し」フラグが ONのときの対策がまだ。

コミットログも読まずに軽率な修正。>BugReport70.rev2.patch (2.7KiB, 2007-04-07 06:50)

これから読む。>「SourceForge.net Repository - [sakura-editor] Revision 1049」, 「SourceForge.net: Sakura Editor: Detail: 1636751 - 行置換のオプション化&問題修正

うむ。削除したコードがなぜあえて論理座標だったのかわからない。


 @2011-04-11 「// 行単位で置換するので colDifは常に 0。」

って書いて削除したコードがパッチにあるけど、一つの行が複数のレイアウト行に分割されてることがある。一行処理して次の行……と思ったらまだ折り返された同じ行にいた、とか。前にも別件で書いてるけど、折り返しと矩形選択(+文字一括挿入/+置換)は本当にひどい組み合わせ。結果を予測できるものにするためには選択範囲の末尾の行から処理をしないといけない。そうすると文字の削除や挿入による折り返し位置の変化が後の処理に影響を与えないので。でもそうはなってない。だから、結果を維持する労力を割く必要もない「未定義」の動作だと考えてしまう。


2011年02月10日 (木) 「それは仕様です」ってそんなに嫌いではない。発言者にその宣言を遵守する意志があるのなら。言われた方はその宣言を以て、即座にその仕様(と手元の実装)に依存できる。言った方は修正の手間がないし、挙動を変えて周囲(期待と実際の違いに気付いていなかった方の集団)を騒がせるおそれもない。とはいえ一般には「仕様のわけねーだろ。バグだよ、バグ」って言いたくなるようなものに対して「これは仕様でしょうか?」ってのも嫌みったらしく聞こえそうなので控えたい。何回かやってるけど。

最終更新: 2011-02-11T00:59+0900

[SakuraEditor] SourceForge.net Repository - [sakura-editor] Revision 1887

Fix: 検索(ツールバー)を使うとプラグインコマンドが実行される(2)

検索ボックスのコードをほとんどコピーした自作ツールバーボタンもやばい気がするものの、CBN_SELCHANGEはツールバーボタンで処理してるんだよね。処理しなかったメッセージが誤った取り扱いを受ける、ということなんだろうか。わからないよん。

>>脳log[2008-06-04-p01] 現在適用されているファイルタイプを表示/変更するツールバーボタン


2011年01月29日 (土)

最終更新: 2011-04-09T19:20+0900

[SakuraEditor] サクラエディタに複数行検索を導入する際に考慮する必要がある正規表現パターンへの細工。

今のサクラエディタはユーザーが入力したパターンに細工を施している。>「正規表現を使った検索・置換で、改行の意味を LFのみから CRも含むように。

サクラエディタでは改行をまたいだ検索ができないけど、将来できるようになると問題が生じる。(その根拠は20100709p01の実験による)

  • ^(改行文字の直後にマッチ)が CR直後(かつLF直前でないことが望ましい)にマッチしないことが露見する。
  • $(?<![\r\n])(?=\r|$) に置き換える現在の細工では、連続する改行と改行の間にマッチできない。

^(?:(?<=^|\n)(?=[\s\S])|(?<=\r)(?=[^\n])) に、$(?=\r\n?|(?<!\r)\n|(?<![\r\n])$) に置き換えるのでいいかなあ。用意した入力が期待した結果になるのは確認したけど、予期しない入力が予期しない結果になる可能性はやっぱりある。

 ^ や $ を、先読みや戻り読みを使ったパターンに置き換えることの副作用

戻り読みの中に ^ や $ を置けなくなる。複数行検索ができるようになったときには、戻り読みの中で行末を検知したくなることもあるかもしれないね。でも、できないね。


2010年10月15日 (金) Adobe Readerや Quick Timeをアップデートしたくないのは、たまにしか起動しない Adobe Readerやたまにしか利用しない Quick Timeのために Windowsのスタートアップを遅くして欲しくないのと、無効化していた Firefoxの PDFプラグインをアップデート後にもう一度無効化しなければいけないのが極めて面倒だから。Quick Timeはアンインストールしたけど Adobe Readerとは手を切れそうにないのがつらい。それと、スタートアップに Flash Playerのアップデートタスクを登録しても無駄だから。再起動が必要な Windows Updateをひと月ふた月待つつもり?

最終更新: 2010-10-15T10:51+0900

[SakuraEditor] Meryの、ローカル変数の定義位置・次(前)の使用位置に飛ぶ機能(違

93 :名無しさん@お腹いっぱい。:2010/10/15(金) 01:30:28 ID:hD6Ahu8Z0 
マウスだと何が良いのかあんまりわからない気がする。 

1.マウスで文字列選択 
2.メニューで[次の文字列を検索]or [前の文字列を検索] 

がマウス操作の基本だと思うけど、Ctrl+F 同様に単語の選択が必須ではなくて 

1.検索したい文字列かその直前にカーソルを置く(マウスのダブルクリックで選択される範囲に相当) 
2.キーボードで Shift+Ctrl+↓or Shift+Ctrl+↑ 

みたいにいきなり検索&ハイライトができる。もちろん単語というか検索語句に応じて 
文字列選択はしたりしなかったりなので、必ずしも文字列を選択しなくていいという訳でもない。 

個人的には編集中に文字列をちょっと連続で参照して元の場所に戻るのが特に便利。 
直前or直後なら2アクションで参照して戻ってこられるし、連続でポンポンと参照して戻ってくるのも直感的で分かりやすいキーボード操作になる。 

次を検索[F3] では良くも悪くも、検索する文字列に縛られるのが利点ではあるものの、ちょこっと確認したいときには不便。 
というか F3 と別系統で検索が可能になるので、F3 での検索文字列を維持できるようになるのが地味に便利。 

個人的に感じているメリットはこんなところ。

すげー使いたい。そして、こういうことを実現できない(よね?)サクラエディタのマクロに幻滅。あれってただのコマンド集(しかも公開を目的としていない)だし、キャレットの位置を知る方法が Editor.ExpandParameter("$x,$y") とか、やっつけ仕様過ぎ。きちんとしたオブジェクトモデルが必要だ。

本日のツッコミ(全4件) ツッコミを入れる

名無しhttp://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F153

名無し「Wiki Macro/投稿/153」がまさに相当するマクロだと思うけど。 他にも関連マクロで「Wiki Macr..

名無しVisual Studioが本元かな? 調べてみたらEmEditor Freeにも同じ動作の 次の文字列を検索(Ct..

ds14050おおぅ。まさしく。 「ダブルクリックで単語ハイライト」とか聞いたことがあるけど、あれの変種でしたね。図らずも VC..


2010年09月21日 (火)

最終更新: 2017-10-13T21:42+0900

[SakuraEditor] (2ch) 選択領域の描画が反転に固定されてるのが嫌だ、半透明がいいというが。

半透明選択 反転選択

眠たくないですか? ラスタオペレーションをセットして領域を塗りつぶすだけの操作に比べてビットマップビットを操作する手間をかける価値があるだろうか。Windowsでの標準的な描画方法は、背景を選択領域(背景色)で、文字を選択領域(文字色)で塗るだけみたいだけど。どうして半透明? それともさらに手間をかけて半透明の選択領域を単色からグラデーションパターンにするぐらいやるんだろうか。AeroGlassがそんな風に微妙なパターンを入れてる。どうやったらグラデーションが表現できるのか知らんけど、ピクセル当たり 1バイトで表現できるなら GDIブラシでパターンを塗り込めておけるかも。

 余談

  • 左の画像のステータスバーに文字が少ないのは、エディタを一回非アクティブにして再度アクティブにしたときに消えるから。バグじゃないよ。
  • 選択領域の描画は CEditView::DispTextSelected() と CViewSelect::DrawSelectAreaLine() の少なくとも二カ所で行われてる。この DRYじゃない実装や、反転の反転で元の状態に戻したりしてるのが、選択領域のかすが残る度々の不具合につながってる気がするんだけど。画像のエディタは CViewSelect::DrawSelectAreaLine() には手を付けてない使えないはりぼて。
  • 選択領域の色設定画面 「文字色」が領域の色。「背景色」が RGB各バイトのα値。透明度を上げていくと背景色は黒に近づいてみえる。色分けするかどうかのチェックが外れてるときを従来通りの反転描画に割り当てたので Windowsの標準的な描画方法を指定する方法がない。

 @2010-09-23 あるいは

テキストの背景色と XORをとったときにユーザーの指定した色になるような色を使って排他的論理和をとってみたりするとどうなるだろう。コントラストを保ちつつ選択領域の全体的な色をコントロールできるのだろか。


やってみた。

//HBRUSH hBrush    = ::CreateSolidBrush( SELECTEDAREA_RGB );
HBRUSH hBrush    = ::CreateSolidBrush( selColorSetting.GetBackColor() ^ CTypeSupport(this, COLORIDX_TEXT).GetBackColor() ); // assuming SELECTEDAREA_ROP2 == XOR

わりと文字がつぶれる。つぶれないような色を選ぶと上左の画像のような淡い色になってしまい、だったら半透明でいいじゃない? 変更が一行で済むのだけが利点。半透明の方はざっと抜き出してもこんなに。

CreateCompatibleDC( hdc );
CreateCompatibleBitmap( hdc, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top );
SelectObject( hdcMem, hbmpSelected );
BitBlt( hdcMem, 0, 0, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top, hdc, rcClip.left, rcClip.top, SRCCOPY );
GetObject( hbmpSelected, sizeof bmpSelected, &bmpSelected );
GetDIBits( hdcMem, hbmpSelected, 0, bmpSelected.bmHeight, pBits, &bmpinfo, DIB_RGB_COLORS );
for (RGBQUAD* pQuad = pBits; pQuad < pBits + bmpSelected.bmWidth * copiedLines; ++pQuad)
SetDIBits( hdcMem, hbmpSelected, 0, copiedLines, pBits, &bmpinfo, DIB_RGB_COLORS );
BitBlt( hdc, rcClip.left, rcClip.top, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top, hdcMem, 0, 0, SRCCOPY );
DeleteObject( hbmpSelected );
DeleteDC( hdcMem );

GetDIBits, for, SetDIBitsあたりがやばいかんじ(速度的に)。


 @2010-09-25

半透明処理にすると、反転の反転で元通りみたいなことができなくなるのだよね。反転処理前のビットマップを保存しておかなければ戻せない。あと矩形選択で行っていた、リージョンを結合して差分をとって PaintRgn一発で選択解除と選択描画のできあがり、ということができない。矩形選択なんて四角を一個塗るだけで済むはずのものなのに……。クライアント領域をいくつかのレイヤーに分けたいなあ。背景<文字の後ろ(罫線など)<文字<文字の前(アンダーライン、対括弧強調など)<選択領域<キャレット みたいに。Z座標でなく更新頻度でわけるのもあり。半透明にすると他にも、左に選択範囲をのばしていくとキャレットの残像が次々増えていく問題が。くじけそう。きままにやるけど。


 @2010-09-26 transparent_selection(trunk2@1825).patch (21.8KiB)

非効率的なのを承知で CViewSelect::DrawSelectAreaLine() で行っていた処理を CEditView::OnPaint() に委譲した。それが選択描画を取り消すのに一番簡単だったから。Vistaだと確認できないけど古い Windowsだとフリッカーがひどいかもしれない。気付いたのは検索を行ったときにカーソル行アンダーラインがちらつくことが増えたこと。範囲の拡大・縮小も遅い。<追記@2010-10-15>再描画する領域を最小限にする努力が必要。でも重なった二つの矩形が作る領域をどう扱ったものか(9つに分割して、左上↘右下、左下↗右上、左上↖右下、左下↙右上で網羅できるものなのか、もっと簡単にできるのか)、悩み中。</追記>


 @2010-10-03 2chスレ見て

選択色指定(固定色or半透明)のお試し版がすでにあるとか。なんだよもう。ソース読も。

725 :名無しさん@お腹いっぱい。:2010/10/03(日) 03:45:30 ID:FVNsnn5V0
ちなみに、「下の全部」というタイトルで以下のような物も公開されている。
> 状態:アルファ
> bin/pp-disable: skrw_ext13_bgimg_100929.zip Unicode版1.6.5.0 base r1827
> bin/pp-enable: skrw_ext13_bgimgpp_100929_pp.zip Unicode版1.6.5.0 base r1827
> 背景テストデータとini: bgimage 111KB
> diff:skrw_ext12_to_ext13bgimgpp100929.zip 78KB ext12からの差分,テスト未整理コードあり
> ext+背景表示+プロポーショナル
> ClaerType対策に選択文字列の作画表示の実装を追加。OFF→従来のように反転,色指定→固定色,文字色=背景色→元の色と20%で色混合)で設定
> 改行文字の色指定を変更。ベース色<改行の指定色<検索色<選択色。
> pp-enableのほうだけプロポーショナルが使えます。その分動作はあやしいです。
>
> r1827/100929/ext13+bgimg v0.4+ppfont v0.2(バージョン情報ではext12になってます)
> 選択色指定:デフォルトで色指定になっています。色分けをOFFにすると戻ります。0幅表示未対応
> ・[ext/skrw_search_fast_v0_0]rev1827の大文字小文字変換対応。skr_toupperに切替
> ・[ext]DIFFのデフォルト設定色のRとBが反対だった(iniはBGR順でした)

プロポーショナルフォントが指定できるとメイリオが選べて嬉しい。次は Operaのようにブロック単位でフォントを指定したい。英字は Consolas、日本語はメイリオ、ひらがなは……、カタカナは……というように。


プロポーショナルフォント関連のあやしい動作を一つ発見 >skrw_ext13_bgimgpp_100929 矩形選択で文字のないところを右側に範囲を拡大していくとキャレットが 1pixelずつくらい移動するんだけど、このとき画面が横にスクロールするとルーラーが逆行する。7戻って15進むという具合につじつまは合うみたいだけど。改行の後ろの選択範囲の描画もずれる。


ソース読んだ。選択範囲の半透明処理って、「テキスト」「コメント」「URL」などなどの文字の色と背景色をずらすだけでできたらしい。なんだよもう(二度目)。

CRLFマークがはみだすことの対策もあった。3ピクセル出てるらしい。上の画像ではみだしを確認できるけど、みっともないもんね。改行マークが非表示だと選択範囲が右にちょっとはみ出して見えるのもみっともないと思ってるんだけどどうだろう。

 フェイズとレイヤー。WebKitの例。(@2014-01-18)

WEB+DB PRESS Vol.54 - WebKit Quest 第5回を読んでる。フェイズはレイヤーより細かい区分。

paint()メソッドを呼び出す側は、何度もpaint()を呼び出します。その際、指定されるPaintPhaseは背景から前景へ推移します。

WebKitはフェーズの数だけ何度も Renderツリーをトラバースし、各フェーズを重ね描きすることでページの描画を行うのです(図5)

enum PaintPhaseのメンバーはこれで全部ではないけどこんなかんじ

  • PaintPhaseBlockBackground
  • PaintPhaseFloat
  • PaintPhaseForeground
  • PaintPhaseSelection
  • PaintPhaseOutline

レイヤーが必要な場面はこれより大局的な

  • z-indexが指定されたとき
  • transformが指定されて座標変換が必要なとき
  • opacityが指定されて透過するとき
  • など

エディタ領域の描画はフェイズで十分そうね。

本日のツッコミ(全2件) ツッコミを入れる

Mocaいつもお世話になってます。 色の合成は、指定色で選択作画を書く→ここをみる→混ぜればできるのを思い出して追加の順だっ..

ds14050後半の意味がわからないと思ったら、ANSI版では改行マークの表示・非表示に関係なく改行マークの背景色が塗られていた。..


2010年09月15日 (水)

最終更新: 2013-01-11T22:45+0900

[SakuraEditor] 拡張子のないファイルにもタイプ別設定を自動適用する。

どこかに書いた気がするのに見つからないのでもう一度。

サクラエディタは拡張子を見てファイルの種類を区別し、色分けルールやタブ幅、折り返しルールなどを使い分けるが、拡張子がない makefileや ChangeLogはみんな「基本」設定になってしまう。

 案1: 「拡張子」ではなくファイル名の末尾に対するマッチングでファイルタイプを区別する。

ファイル名の末尾が .rb だったら Ruby。.js だったら JavaScriptという具合。ファイル名の末尾(といいつつ全体)が makefileだったら makefile、.htaccessだったら Apache HTTPD設定ファイル。

ところがサクラエディタが設定として持ってる、判別のための拡張子リストが

c,cpp,cxx,cc,cp,c++,h,hpp,hxx,hh,hp,h++,rc,hm

という具合に、「ドット省略必須」「スペースorカンマorセミコロン区切り(ヘルプによればカンマ区切りらしいが、「,」と「.」が紛らわしいのでスペース区切りにするのがいいよ)」のリストなもんで、この案は没。広まってしまったドット省略拡張子リストに対処することができないので。

 案2(採用): 「拡張子」がないときはファイル名を拡張子として扱う。

makefileを .makefileだとみなしてファイルタイプを判別するということ。

パッチ> guess_filetype_of_extlessfile.rev2.patch (0.9KiB)

JSという名前のファイルが拡張子が .jsの JavaScriptファイルだとみなされることになるけど、気にしないよね。

 @2012-11-04 moca_skrさんによるパッチ。

>>SourceForge.net: Sakura Editor: Detail: 3581841 - タイプ別設定の拡張子を二重・なしにも対応

0 < _tcslen が使われてないところが好み。zero fill(""での初期化)するかしないかに強い意見はない。結局呼び出した関数が null-terminateするかギリギリまで書き込むかに依存するのだから。自分に影響がありそうな部分にコメントした(試してないので勘違いかも)。


杞憂だった。恥ずかし。GetDocumentTypeOfExtはパッチだけでは全体がわからないから元のファイルにあたってみて、その後でパッチの追加部分に戻ってくるのを忘れてた(という言い訳)。


GetDocumentTypeOfPathでごちゃごちゃせずに、引数として渡されたファイルパス(pszFilePath)をたどって最後のパスセパレータの次の位置を指すポインタを GetDocumentTypeOfExtに渡すだけにしたらすっきりするのに、と思った。a...............................................b.txtみたいなファイルでスタックオーバーフローを起こすだろうか。


@2012-11-06 ちょっと臆病になってここに書くけど、二重拡張子探索のためにファイル名からピリオドを探索するときに _tcschr を使ってるけど _tcsrchr ではないのかな。_tcschr を使ってるなら、すぐ上に書いたようにバッファの確保も _tsplitpathも省いて _tcsrchr(pszFilePath, TEXT('\\'))で得たポインタ+1を GetDocumentTypeOfExtに渡すのと似た結果になりそうだが。

_tcsrchrを使うには表(Shift_JISだと2バイト目が\と同じ)のような文字対策が必要で、_tsplitpathはそういうのも隠蔽してくれてるのかな。だとしたら似た結果にはならないか。

再度考え直し。_tcsrchr が _mbsrchr にマップされる可能性。_mbsrchr はうまくやってくれるのだろうか。

こんなんだからこそ JScriptでパスを扱うときは必ず

new ActiveXObject("Scripting.FileSystemObject").GetFileName
new ActiveXObject("Scripting.FileSystemObject").BuildPath

を使って、自分で文字列処理をしないのだけど、_tsplitpath が拡張子付きのファイル名を返してくれなかったりするから自前でやるはめに。Cだから固定長バッファが前提でその長さが問題になってくるからかもしれないが、ケチるんだったらポインタで返してくれたらいいのに。引数のここからここまでがファイル名ですって。正規化したいから無理だって?


 @2012-11-13

..............................................................................................................................................................................................................................................t

というファイル名を、trunk2@2457 + skr_imp_ext_ex.patchで、試してみたけれどスタックオーバーフローは起こせませんでした。ピリオドの数よりちょっと少ないくらい GetDocumentTypeOfExtが呼ばれる(二重拡張子でなく多重拡張子をテストしてる)のは確認できたけれど。

 @2013-01-11 コミットされています。

http://sourceforge.net/p/sakura-editor/code/2565/

そういう機能が欲しいと思ったから自分でも改造してたんだし喜ばしいことなんだけど、自分でビルドするサクラエディタに反映するとコンフリクト必至なのが憂鬱。

 RUNESOFTのインストーラが、ユーザーがインストール先を変更したときに、レジストリに記録するインストールフォルダ末尾に \ を付け忘れてしまい、おそらくファイル名を連結するときに \ を補わなかったのだろう、ゲームの起動に失敗するというポカをやらかしていた。


2010年09月07日 (火)

最終更新: 2010-09-15T20:40+0900

[SakuraEditor][正規表現] 検索。置換。

Command_REPLACE(置換)や Command_REPLACE_ALL(すべて置換)が Command_SEARCH_NEXT(下検索)を呼ぶのをやめたい。連携手段がレイアウト座標を基にした選択範囲しかなく、一文字で表現される CRLFの LFだけがマッチしたときに情報が欠落するし、Command_SEARCH_NEXTが持つ検索以外の事前・事後処理が無駄になるし、正規表現検索が BMatch(検索), BSubst(検索&置換)の計二回行われるのも無駄。

wchar_t単位で検索を行う CSearchAgent::SearchWordが、検索結果をレイアウト座標に変換する際の誤差(前述)を考慮してマッチ範囲を拡大し、結果を不正確なものにするのは誤りだと思う。それより、上の層でこれを呼び出している CLayoutMgr::SearchWordがその配慮を行うべきでは。

 あったらいい操作

Match
対象文字列の対象範囲全体がパターンに一致するか調べる。
Search
対象文字列の対象範囲からパターンに一致する部分を探す。
Replace
対象文字列の対象範囲からパターンに一致する部分を探し、与えられたフォーマットの文字列に置き換えた文字列を返す。(返るのは対象文字列の対象範囲に相当する文字列)
Expand
Matchや Searchの結果を用い、マッチ全体($0)を与えられたフォーマットの文字列に置き換えた文字列を返す。
パターン
BREGEXP.DLLは m/pattern/flags/pattern/replace/flag も同じ一つのパターンとして扱うので、検索用のパターンと置換用のパターンに互換性がない。そうではなく、Search(Compile("pattern", flag), "target", startindex), Replace(Compile("pattern", flag), "target", startIndex, "replace") だったら良かった。(※ "pattern" と "target" と "replace" は実際は二つの引数で表す)

bregonig.dllや bregexp.dllを使いながらパターンの共通化や Expandの不足に対処するにはどうするか。自分で Expandを実装し、dllが用意した置換機能(置換パターン)を使わないで済ませる。でもねえ、実装の数だけ仕様がある状態を避けたいから Expand機能をライブラリに用意して欲しいわけで。(置換文字列の $$ が $に展開されなかったり、\1 が展開されたり、$1が展開されなかったり、色々あるんよね)


 @2010-09-10 悪夢のような「クリップボードから貼り付ける」置換オプション。(本当は矩形選択が)

  • CRLFの CRだけや LFだけをクリップボードの内容で置き換えることができない。
  • 正規表現検索のとき検索始点(終点)挿入オプションがきかない。
  • クリップボードの形式が矩形テキストだったときに検索条件によっては無限ループ。

    例えばクリップボードに

    789
    456
    123

    という 3行9文字(改行文字はない)がおさめられているとき、マッチと置き換えられるのは 789 であり、456 123 はそれぞれ次行、次々行に挿入される。つまり、456 123 はこれから検索対象になるということだ。検索条件が \d{3} だったり ^ だったり、矩形テキストの二行目以降にマッチするものだったら無限ループ。

置換操作が二階層潜らないとロジック単位にならないというのも悩みの種。検索はロジック単位で行えてるのに、それをレイアウト単位に変換してそれがさらにロジック単位に変換されて、一対一対応じゃないからごにょごにょしないと思い通りに置換されなくて。

 @2010-09-15

どうして最上層のレイアウトを基準にして文字列処理を行わなければいけないか。文書(wchar_t列としておく)の変更を LayoutMgrに通知する仕組みを整備するのを怠って、LayoutMgrを通して文書の変更を行うことで通知を不要にしていることが背景にあるのでは? GUIを通しての文字列操作に限ってはそれで十分だからそうなるのも仕方ないし、必要に迫られた人間(俺とか)がより汎用的な手段を整備せずにダーティハック*に頼る方が罪は重いかも。

* 挿入位置・置換範囲を文字レイアウト境界まで拡大して、挿入・置換文字列も同じだけ拡張する。


2010年08月30日 (月)

最終更新: 2010-08-30T23:07+0900

[SakuraEditor] 2ch. 正規表現キーワード

規制で書き込めないのでここで。

583 :名無しさん@お腹いっぱい。:2010/08/25(水) 15:31:52 ID:wtW19SUb0
    頭に**がある行はコメント行として緑色にする
    という正規表現での色分けと
    ABCという言葉は赤色にする
    という正規表現の色分けを同時にする方法はありますか? 

    (省略)

587 :名無しさん@お腹いっぱい。:2010/08/30(月) 14:18:00 ID:yI6qoQsb0
    >>584
    正規表現キーワードって、設定の上下に優先度あるらしいけど(ヘルプ情報)、結局の所、先に検索で引っかかった方が優先されるらしいよ。
    wiki でバグじゃないかと報告されて、誰かが仕様じゃボケぇ、なんもおかしなことないわ! と切れてた。

    個人的には、キーワードに優先順位があるならそれに準拠して欲しいと思うんだけどね。
    なんていうか、二つの仕事を割り振られたA君が優先順位を決めて作業した結果、端から結果だけ見ると作業をひとつしか終えていないように見えるんだよね。
    言葉の意味をはき違えているように思えて、そこが気持ち悪い。 

言及されてるバグ報告ってのはこれ。>>BugReport/60 - SakuraEditorWiki

587の、自分の想定した動作モデル以外を認めない姿勢がなんだかなあ。いわく「優先順位があるならそれに準拠して欲しい」いわく「言葉の意味をはき違えているように思え(る)」。バグ報告者の方は単なる理解不足だし、あんなに噛みつかれたことに同情するけど。

優先順位は確かに存在してる。使われ方が 587の期待と違うだけで。たとえに沿って説明すると、仕事は最初から一つしかない。「正規表現キーワードの色分け」これひとつ。何をキーワードとみなすかの判断基準として複数の正規表現が存在してるだけ。複数の正規表現のマッチが重なったときに最も左から始まり最も上にあるパターンが優先される。最も左が優先されるのは正規表現キーワードを含む色分け要素(文字列、コメント、URLなど)間の順序付けにも利用されてる大原則なのでわざわざヘルプに書く必要を感じなかったんでしょうよ。上の方のパターンが優先されるというのは、コメントなど他の色分けより正規表現キーワードの色分けが優先される(これもヘルプに書いてある)と言うときと、全く同じ意味で使われている。不自然なことはない。

「先に検索で引っかかった方が優先されるらしいよ」というのは嘘。「先に」(時間的な前後)ではなく「前の方で」(空間的な前後)なら間違いではないが。

バグ報告した人(たぶん 587も)の希望する動作を強調キーワードに置き換えると、「『IN』『SELECT』『EXISTS』『JOIN』というのを強調キーワード1,2,3,4にしてそれぞれ別の色に色分けするようにしている。強調キーワード1は強調キーワード4より優先されるはずだから JOINの中の INが色分けされないのはおかしい。」という内容になる。Keywordの中に別の Keywordがあるなんて想定はない方が普通でしょう。

7195の System_UPJさんのように動作を理解した上で使いこなしてる人もいる。ヘルプには改善の余地があるとしても今の動作はバグではないし変更されると困る人が(正規表現キーワードの利用者の中では、たぶん)大多数。存在しない別の機能を要望していることに気付くべき。

583へのレスとして用意した、んで規制された、文章ものせとく。

Wikiでも似たような要望がバグとして報告されてたけど、よくある要望なんかね。
手持ちの案はこげな感じ。
1.キャブチャ部分に別の色を指定できるようにする。
2.従属的な正規表現キーワードを指定できるようにしてキーワード内キーワードを
  色分けできるようにする。
3.萌ディタのように色分けに状態を持たせる。
実装の難易度   1=2<3
設定の面倒さ   1=2<3
色分けの自由度 1<2<3

2010年07月30日 (金)

最終更新: 2012-11-01T13:41+0900

[SakuraEditor][SHJS][Ruby] Rubyの %リテラルの色分けを修正。

説明が面倒なのと誰も知りたくないだろうから適当に、備忘のためだけに。

  1. まさか %{literal}literal部分で \{\} を使う人間がいるとは思わなかった。(違う種類の括弧を使えばいいじゃない。開閉の釣り合いがとれてれば同じ種類の括弧でもエスケープ不要だし)
  2. だのに Ruby1.9の rake.rbにこんなパターンが……

    %r{[*?\[\{]}
  3. エスケープされた { 2のはの考慮がないから、閉じ括弧が足りないとしてファイル末尾まで正規表現として色分けされてしまう。
  4. ちょちょちょいと .rkw2ファイルにエスケープ文字を追加してサクラエディタに対する修正は完了
  5. SHJSの lang/sh_ruby.js(自作)への対応も同じですむはずが、入力の末尾に達した時点で意図せぬバックトラックが発動し、閉じ括弧が足りなくても色分けが適当な閉じ括弧で終了してしまう現象に遭遇。これは自業自得(20090808p01)なので自分でなんとかせねば。間違いが埋没してしまうのはよろしくない。
  6. こうした

    %r{余分な開き括弧{。間違いはインタープリタを通す前から目立つように}

2のは Rubyインタープリタに対するエスケープ、と同時に正規表現パターンとしてのエスケープですよ。%r[\[] と /\[/ が同じパターンになって、%r[[] がRubyのシンタックスエラー、/[/ がパターンのコンパイルエラーになるんだから。(ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32] / ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32])


2010年07月09日 (金) Windows Confidential: The Third Rail of Keyboard Shortcuts | TechNet Magazine」を読んでの違和感。レイモンド チェンは Win+Eがどこを開くかの話をしている。おれは Win+Eがどこを開くかなんて確かめたことがなく、Windows Explorer――フォルダを表示するときに利用される簡易表示ではなくフォルダツリーが付いた正式版――を起動するためのショートカットだと思っていた。そんで、だから、使ってない。

最終更新: 2014-01-02T18:04+0900

[SakuraEditor][正規表現] 「鬼車と bregonigに hitEnd(20100531p01)機能が搭載されることを願う他力本願日記」

なんてことをこの日記の冒頭に掲げたもんだから自分でやってみた(どういうこと?)。

 更新履歴

rev3 (2010-09-05, そのうち書く)
(サクラエディタ) 複数行検索を利用した複数行置換を実装。(複数行全置換はまだ。似たようなコードだし必要なのは手間だけだけど)
rev2.1 (2011-01-29)
(サクラエディタ) バグ修正。複数行検索モードでマッチ位置をバッファ内インデックスから(行,桁)に変換する際にミス。誤った検索結果が表示されることがあった。
rev2 (2010-08-27)
(サクラエディタ) 複数行検索モード実装。(正規表現を使った下検索のみ。50MiB制限あり。制限による探索打ち切り・マッチ範囲切り上げの通知なし)
テストバイナリ+変更点(test_multiine_search.zip)
rev1
(鬼車) 普通のマッチなしと、入力次第でマッチする可能性のあるマッチなしに異なる戻り値を割り当てた。
(bregonig) 入力不足のときに BMatchの戻り値を 0(正常終了,マッチなし)にして、エラーメッセージで入力延長によるマッチ成功の可能性を伝えている。
(サクラエディタ) 下検索での入力不足によるマッチ失敗をステータスバーで通知。

 bregonig

既存アプリに影響があるので良くないけど、bregonigへの暫定的な変更はこう。

 regexec_onig(bregonig.cpp)
	} else {
		/* ERROR */
		onig_err_to_bregexp_msg(err_code, NULL, msg);
-		return -1;
+		return err_code == ONIG_MISMATCH_INPUTSHORTAGE ? 0 : -1;
	}

入力が足りなくてマッチしなかったときは、エラーメッセージをセットするけど戻り値は負数(エラー)ではなく 0(マッチなし)。

 鬼車

鬼車(5.9.2)に「K.Takata's software : bregonig.dll」で手に入る onig-5.9.2-mod.diffを適用したものをさらに変更。マッチに失敗したときのエラーの種類で hitendしたかどうかを伝える。ちゃんと動くのか非常にあやしい代物。TODOもいっぱいある。

  • 特定のパターンのパターンに向けた最適化を無効にしている。(そこまで手が回らない)
  • backward searchに対していつ hitendフラグを立てていいのかわからない。(ので未対応)
  • "aaaaa\n" という文字列から [a\r\n]+a というパターンを検索したときにバックトラックにより "aaaaa" がマッチするわけだが、その次の行にも "aaaa.." という文字が続いていた場合は……。一応マッチは見つかっているが hitendフラグも立てたい。
  • [\w\W\s\S] というようなパターンで、メタ文字の登場順([\W\S\w\s]とか)に 依存しておかしな結果になる。(もちろん俺のミス。原因は解らない)

やっぱり鬼車は手に負えないかも。

 サクラエディタ

なんのことはない、影響を受ける既存アプリにはサクラエディタが含まれている。正規表現のコンパイルエラーと入力不足によるマッチなしを区別するためにちょっと変更した。

 複数行検索モード

一行検索(従来動作)してみて、マッチが行末まで続いていたり次の行の内容次第でマッチが成功に変わりそうなときはとりあえず二行ぶん検索してみる。それでも状況が同じなら 50MiBのバッファを埋めてから三度目の検索を行う。50MiBって大きすぎるだろうか。大きさの問題だろうか。かかか。

実装は CSearchAgent::SearchWord()に。これって単語検索専用のメソッドではなかったのですよ。CGrepAgentもこれを利用したらよかった。

バッファの実体は std::wstringで。文字列を比較するにも wmemcmpなりを使おうとして結局 std::wstring("hoge") == L"hoge" を使ったへたれなので、str系のライブラリ関数は恐ろしくて毎回すぐに投げ出します。(あれを使いこなせる人は VBや PHPも使いこなせると思うんですよ)

 TODO
  • 上検索。
  • 検索語ハイライトの処理がたぶん一行ごとに行われている。一行ずつ進みながら複数行を対象に検索を行ってるってわけ。無駄だし目に見えて遅い。
  • バッファ長の制限により、マッチ範囲が途中で切られたりマッチの探索が打ち切られたりしても何も言わないのをなんとか。(制限をなくすかメッセージでも)
  • SourceForge.net: Sakura Editor: Detail: 2309002 - 正規表現による複数行検索対応(簡易版)」のコメントを見ると、検索語ハイライトのほかに「すべて置換」にもパッチが必要そう。パッチを流し読みしてたら BookmarkManager(::MarkSearchWord)までが GrepAgentが持ってたような検索の勝手実装を持ってるらし。SearchAgentを使ってよね。(あ、いや、SearchAgentは当時なかったんだっけ)
  • (複数行)検索にマッチしたなかでも、最初の行がマッチに含まれているか含まれていないかというのは区別する価値がある。サクラエディタの既存の実装は行指向が強いだろうから、「マッチした(ただし先のほうの行で)」ということを勘違いしかねない。(SearchAgentや選択範囲にはそういう指向がないから運良く複数行検索が自然に実装できただけ)
  • (@2011-08-01) [\s\S]*$ というパターン。最後の行の末尾までマッチして欲しいのに一行目の改行直前で止まってしまう。マッチに成功したときの hitEndフラグの扱い。

 @2010-07-12 「鬼車 for Java

hitEnd()の実装の参考になるか?と思ったけどそうもいかなそう。

Revision  74 hitEnd()の実装(但し仕様は満たしていない)。
Revision  85 useAnchoringBounds()及びuseTransparentBounds()に対応。→hitEnd()の実装を修正。
Revision 103 hitEnd()に@Deprecatedを追加。
    /**
     * This method is experimentation phase, and implementation has not been completed yet.
     * @return
     * @deprecated
     */
    @Deprecated
    public boolean hitEnd() {
        return (hasAnchoringBounds ? (range == region.end(0)) : (input.length() == end()));
    }

hasAnchoringBoundsが設定されてる場合は無視するとして、そうでないときは入力の長さとマッチの末尾(end())が一致してることをテストしてるだけに見える。それって hitEnd()とは違うよね。5月31日の日記文字列 aa に対してパターン aa を適用したときに hitEnd()が falseになった事例を引用した。

そうそう。これこそが hitEnd()の使い道 >Check if string is a prefix of a Javascript RegExp - Stack Overflow コメントの最後に見たことのある名前が☺


 @2010-07-12 PCRE

PCRE(現在 ver. 8.10)は戻り読みも再帰も(パターンのコンパイル時の)改行指定オプションもスキャナー的に使うための hitEnd()のような機能(read pcrepartial)も、およそ欲しいものをすべて備えている。悪名高いスタックオーバーフローにも、1.スタック使用量を減らす。2.代替メモリ確保関数を使う(汎用ゆえに遅いmalloc/freeか自作)。3.pcre_exec()の代わりに pcre_dfa_exec()を使う。みたいな各種対策があるらしい。


2010年06月22日 (火) 支払い完了。コナミスタイル先着特典のチャームコレクション3キャラセットでないなら通常版でよい。

最終更新: 2010-06-26T01:41+0900

[SakuraEditor] メニューコマンドの点々。

https://sourceforge.net/tracker/?func=detail&aid=3002900&group_id=12488&atid=1013762#artifact_comment_4019898

たんなる自己弁護に終始するのでここに書くけど、

  • 俺の態度が「現状が最高」と誤解された部分は、張っていた予防線の内幕ばらしに過ぎない。防衛線に余裕をもたせていたというだけのことで、誤解された部分を攻撃材料に使ってはいない。
  • パッチ(現状への変更)を基準にして意見したら、現状支持が目立つのは当然では?
  • パッチを基準にせず、現状の「印刷プレビュー...」の点々を削るようにも意見できたはずだけど、そのときはガイドライン(間違いようもなく、PrintPreviewには付けんな、って例示してある)を未読だったのと最初に参考にしたのが WordPadだった(「印刷プレビュー...」になってる)のでできなかった。
  • 現状の「アウトライン解析...」と「ウィンドウ一覧...」の点を削るように意見しなかったのは、もう書いたように、アウトライン解析というのは名前から推測されるように解析を行うのが主目的のコマンドというだけでなく、関数を一覧にしてその定義にジャンプするためのものだと自分でも思っていたから(むしろそちらが主目的)。定義にジャンプするのが「primary/intended action」だとするなら、表示される解析結果はコマンド実行に必要な補足情報をユーザーに選んでもらうためのダイアログとなり、まさしく点々を付ける理由になる。
  • 現状が基本的に納得できる点々の付け方だった。moca_skrさんのコメントでそれはみくさんの仕事だと紹介されているが、そのときの基準「操作が確定しないものには"..."を付ける」というのは「...はクリックしただけではコマンドが未遂*のものに付いている」という自分の理解と違わないのだから。
  • 他アプリケーションを見ても、...の使い方はかなり恣意的な様です

    だからこそ俺はガイドライン(を紹介するコラム)を紹介したし、MSのアプリしか参考にしてないし、俺判断が入り込まないようにできるだけ緩くガイドラインを適用してはみだした部分だけを指摘したつもりだけど、それでも現状最高うぜーと思うならガイドラインに従って反論してほしいと思う(もちろんガイドライン不採用というのも一つの選択肢として残ってるけど)。

別コメントへの反応。ダイアログのモーダル/モードレスと点々には関係がないと思う。検索ダイアログがモードレスだとモーダルに比べて、ダイアログを表示してからでも検索文字列を編集テキストからコピーしてきたり、スクロールしてテキストを確認しながら検索条件を練ることができて便利、ぐらいの違いしかないのでは。


ああ、いやいや、モードレスであることで違う使い道ができる。コマンドの目的(できれば名前も)が変われば点々の必要性も変わる。

  • 「検索...」->「検索ウィンドウ表示」
  • 「アウトライン解析」->「アウトライン解析結果表示」

ツールパレットを表示するコマンドには点々が付かない(これは既定事項)。サクラエディタの検索画面はモードレスだし勝手に閉じないようにも設定できるので、メインウィンドウの横に置いてツールウィンドウとして利用することができる。その場合「検索...」コマンドは「検索ウィンドウ表示」コマンドとして振る舞っている。モーダルだった以前と違い多目的コマンドなのだが点々はいかがすべき?という内容だったのかも。

こうなると複数あるかもしれないコマンドの使途ではなく、コマンドの名前から主目的を一つ判断して点々の有無を決めることになるだろう。してみると「コマンド名に『アウトライン解析』を選んでいるからには、点々を付けるべきではない」と主張すべきだったかもしれない。解析結果がモーダルダイアログに表示されていたときでも同じ(点々を付けるべきではない)。

「指定行へジャンプ...」のアウトライン版に相当するコマンド名を採用したときには点々を付けるべきだが……と考えながら思い立って「指定行へジャンプ...」を実行したらメモ帳のそれより大きいダイアログが表示された(初めて見た)。場所をとってるのは PL/SQLのコンパイルエラー行を選択するためのもの。先を越された。アウトライン解析結果を参考に特定の行にジャンプするのが目的なら、こういうアプローチもありでは?(やっぱり専用画面の魅力には負ける気もするが)


 @2010-06-25

アウトライン解析ってその結果をジャンプだけでなく色分けや補完にも使いたくなるから、「アウトライン解析」っていう名前のコマンドは消えてもいい。

* 確認のメッセージが表示されるコマンドも未遂には違いないけど、この場合は点々をつけないらしい。

 適用と適応が使い分けられない人はそもそも二種類の似たものがあるということを知らないんだろうなあ。applyと adaptだよ、って見分け方を教える以前の問題。個人的には適応より順応を使うし、「過剰適応」とか「適応放散」みたいな熟語で使うぐらい。あ、過剰適応って専門用語なのね。[[知らなかった|20100512]]。外面と内面の不一致が前提にあるらしい。


2010年06月20日 (日) ASR @ COM Meets Rubyがアップデートされてる。

最終更新: 2016-11-30T10:20+0900

[SakuraEditor] 行削除って便利。

標準では Ctrl+Shift+E。俺は Ctrl+Deleteに割り当てた。

で、使ってるとスクロール位置がずれるのが気になってくる。深いディレクトリで GREPすると表示される結果の大部分が定型のパスだけになるから、違いを見分けるためにはパス末尾のファイル名とマッチした行が見えるように右にスクロールする必要がある。そして、目当てのものではない行を Ctrl+Deleteで削除していくんだが、行削除後にキャレットの行頭からの桁位置は保たれてるんだけどスクロール位置がずれる。画面の真ん中にいたと思ったマリオが次の瞬間背景とともに右端に移動していたようなもんだ。これがうっとうしい。

削除前に一瞬、行全体が選択されるように見えるので、このときにスクロール位置が変わってしまうのかと思って「行選択->選択範囲削除」の流れを変えて、範囲選択に依存しない削除方法を採用したのがこれ>improve_delete_line.patch(5.2KiB)

実際は削除に使っている ReplaceData_CEditView()というコマンドがキャレットの位置調整を行っていたのが原因だったから、削除方法は選択範囲の削除のままでもよかったかも。ともあれ、行全体を選択する操作がちらつくのとスクロール位置がずれるのがなくなった。(ReplaceData_CEditView()がやっているように再描画の必要な範囲を求めたりせずビュー全体を再描画してるから環境によっては画面全体がちらつく可能性がなきにしもあらず。「画面キャッシュを使う」とか DWMがなんとかしてくれることに期待。どうせ 1画面50行のうち削除された行より下は元からすべて再描画対象だしー)


 @2010-06-21 タブやタイトルバーに変更フラグが表示されるように修正した(rev1.1)。

improve_delete_line.rev1_1.patch(5.5KiB)

フラグ自体は立ってたけど描画が行われていなかったというミス。


2010年06月10日 (木) iPadがインターネットごしに DLNAクライアントになれたら迷わず買う。(これって買わない宣言?) 読書端末の本命 Sony Readerの年内発売を待っている。

最終更新: 2012-10-27T00:23+0900

[SakuraEditor] サクラエディタの正規表現キーワードを SHJS相当にしたい。(その二)

その一(20090808p03)がだらだら長くなったのでいったん切って、ここに続ける。

 @2010-06-10 バグ発見。

ひどい。「/*」を入力して後ろの行がコメント色一色になったとする。つづけて「*/」を入力しても後ろの行がコメント色のまま。たぶんこれが関係する。

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

本当にそうなら、泥縄式バグ潰し無間地獄へ突入ですな。消火行為が点火に直結した効率のいいマッチポンプだもん。


まさしく > たぶんこれが関係する。

そのときの変更にこんなコメントが添えられているのを発見した。「IsInsideKeyword()から呼ばれたときは精算したらダメっぽいのでコメントアウトして様子を見る。」様子見の結果はダメでした。さあ、どうしよう。


別の場所で不必要にキャッシュを無効化している部分を厳密に処理したら直ったっぽい。キャッシュの有無で結果が変わるはずないんだけど……。(さらなる追求が必要。でもそれは問題が見つかってからにする)


 @2010-06-13「キャッシュの有無で結果が変わるはずないんだけど……」

変わりうる。一行の色分けは一時(いちどき)に、他の行の色分けを挟んだりせずに終わらせなければいけない。正規表現キーワードは各行の行頭がどういう状態か(コメントの中か?とか)を覚えているキャッシュの他に、ある行を中間まで処理したマッチング結果を持っており、先ほどはこれをキャッシュと呼んでいた。そいつは、次の IsStartOfKeyword()呼び出しを待っている宙ぶらりんな状態。期待していた呼び出しがくる前にクリアされたら結果がおかしくなる。マッチングを中間で止めざるをえないのは、他の色分けに先食いされた文字をマッチに利用してしまわないように。