最終更新: 2014-12-05T17:24+0900
理由は makerss.cacheが hiddenな spamコメントで埋め尽くされたから。問題です。
最終更新: 2009-11-19T05:26+0900
すくなくとも幅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; }
隠し機能がでてきましたよ。>「矩形選択時のSPACE/TAB動作に手を入れる場合、実装上、>>dev:4103 あたりのSPACE/TABインデント仕様を実現するための実装部が絡んできそうです。」
これだから迂闊なことはできない。自分用だと自分が使う範囲で問題がない限り気にしないで済むけど。
リンク先で議論されている桁揃えのためのインデント(条件によりタブやスペ
矩形選択はつ
挿入位置の文字の末尾が矩形選択範囲に含まれていないときにインデント用の文字を入力しないことで、インデント揃えができるように追加修正した版 > fix_indentation (4.1KiB, diff to trunk2@1674)
矩形選択時、その範囲内に文字がない状態でインデントすると桁が揃うようにスペ
hor氏のヘルプースを補完します。それ以外の場合、範囲内に文字のない行はインデント対象外になります。
「範囲内に文字のない行」は考慮外だ
あいう abc
というテキストの一桁目(「あ」の前半と「a」)や、
^ ABC DEF
というテキストの一桁目(タブの前半と「D」)を矩形選択してタブやスペ
一応入力された文字の幅を考慮して右移動しているけど、右移動を行うのが選択範囲の一行目だから、この場合一回右移動するだけで行き過ぎてしまう。
それも修正 > fix_indentation.rev2 (5.3KiB, diff to trunk2@1674)
問題の存在がわかれば叩きようも考えられるけど、それがわからなければ手の打ちようがない。テスト重要。
どうして、(幅のある)文字の先頭部分が矩形選択範囲に含まれているときだけインデント用の文字を挿入、ではなく文字の末尾が含まれているときだけ、なのかといえばおそらく、そうでないとインデントの桁揃えができないから。実際に試してみればすぐわかるけど、文字の先頭を条件にするとほとんど常にインデント文字が挿入されてしま
現在認識している問題点。
入力がインデント用の文字のときにも矩形選択の幅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に変更してしま
指摘を受けて修正。原因は rev2のタイポ。指摘を受けたケ
本腰を入れて読んでいなか
つ
あいうえお 1かきくけこ
という行で幅1矩形選択をしてインデント用の文字を入力するとおかしな事になる。文字を挿入するときは幅0選択でいいじ
「ptLayoutNewを使
オプシ
とりあえずインデント文字のうちスペ
また従来は矩形選択範囲が折り返し桁に達した場合、行番号はそのままで選択範囲が行頭に移動して循環していたが、折り返し桁でとどまるようにな
折り返しといえば
1|ABC< 2|DEF< 3|GHI<
CFIを矩形選択して _を入力したとき、_が Fと Iの直前に入力されるわけではないというのはどう考えられているのだろう。これがあるから矩形選択入力と折り返しを組み合わせてはいけない、どんな結果も期待してはいけない、と思
タブが入力されたときもおかしなことにならないように改善した。>fix_indentation.rev6 (8.4KiB, diff to trunk2@1674)
原因はインデント文字の入力をスキ
テスト。1行目と 2行目をどこでも幅1矩形選択してタブを入力する。最初に選択した文字が取り残されないことを確認する。
あいうえお 1かきくけこ
4タブ設定で「う」の前半と「き」の後半を幅1矩形選択してタブをいくつか入力したとき、初回だけ「う」が後ろに行きすぎる。これはもうあきらめている。
0123456789 あいうえお 1かきくけこ (TAB幅は4の設定) で、1行目の「4」の左から3行目の「き」の右までを矩形選択(幅1桁)して TABを3回入力すると、1行目の「4」の左右にTABが入ります。
これは、「これはもうあきらめている」(@2009-11-09)ケ
行番号が55行ほどずれてしま
っています...
う
Editor.Char(9) と Editor.IndentTab() の使い分け
すでに BOOL bIndent引数が存在するのだからこれを厳密に適用しようということですね。悪くないと思いますし、対象も重な
矩形選択範囲がタブ境界にあり、全角文字の前半分が範囲からはみ出しているときにタブを挿入すると、行によりタブの幅が最小と最大にな
あいうえお 1かきくけこ で、「い」の左から「き」の右まで矩形選択します。 まず、「さ」を入力します。 次に、「a」を入力します。 結果、1行目には「さ」の手前に「a」が入ってしまいます。
不安に思
TABを含めた文字列をクリ
ップボ ードから貼り付けた場合
この場合はインデントではありませんし、揃えることよりもクリ
'int' から 'CLayoutInt' に変換できません。
直しました。個人的にデバ
二、三日前から毎日これぞ決定版fix_indentation.rev8 (10.8KiB, diff to trunk2@1674)
selectionIsOutOfLineの判定条件が(たぶん)おかしいです。 (括弧が足りてない気がします)
詳細なレポ
一日を失う手痛いミス >fix_indentation.rev8.1 (10.8KiB, diff to trunk2@1674)
インデント揃えにからむ機能のオンオフを機能の割り付けでコントロ
タブインデントとタブ文字の入力を区別。>fix_indentation.rev9
矩形選択入力で、(TABインデントや SPACEインデントによらない)タブやスペ
rev9.1を眺めていて、従来の動作に疑問。テキストが選択されていなか
わか
矩形選択で、改行文字の手前にインデント用の文字(タブとスペ
ABC ABC
Cの後ろを幅0矩形選択してスペ
矩形選択範囲の先頭が全角文字やタブなど幅広の文字のとき、インデント用の文字の挿入が桁揃えのためにスキ
あいう abc
一桁目(あの前半とa)を矩形選択してスペ
矩形選択範囲が全角文字の前半ばかりを移動してしまい、スペ
あいうえお 1かきくけこ
1行目と 2行目をどこでも幅1矩形選択して、スペ
矩形選択してタブを入力したとき、最初に選択されていた文字を置いてきぼりにして選択範囲が後ろに移動したりしない。
あいうえお 1かきくけこ
1行目と 2行目をどこでも幅1矩形選択して、タブをいくつか入力し、最初に選択した文字が範囲内に残
(何人いるのかわからない)ななしさんに協力してもら
追加修正もあるようで、
元に戻
ダウンロ
「GNU patchが5年ぶりにバ
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 にまさにその手順が書かれていた。ぱ
rev3だと>>dev:4138で例示されたテストパタ ーンでおかしくなる(従来挙動のが好ましい)よ。
>>data:7083のななしさんが「私の思い通り」と言 っている2つめの例も、従来とは違う結果になるのね。
隠し機能(インデント揃え)はオプシ ョン化して、ON/OFFで動作切替すればいいのでわ?<br>ON時の動作は従来挙動のまま放置。<br>OFF時のTAB/SPACEは他の文字入力と同じ扱い。<br>デフ ォルトはOFFで問題ないでし ょ。
テストありがとうございます。<br><br>dev:4138のパタ ーンで結果が従来と異なるのは rev2のタイポが原因でした。誤:attrIdxTo/正:attrIdxFrom<br><br>data:7083が「思い通り」になるのを確認できませんでした。スペ ースの後ろ 3行を幅0矩形選択すると行頭がインデントされました。スペ ースの前で 3行を幅0矩形選択すると先頭行にだけスペ ースが挿入されました。変更の最初の目的は改行文字の直前に他の文字と同じようにインデント用の文字(スペ ースとタブ)を挿入できるようにすることなので、従来と違い 2行目と 3行目にスペ ースが挿入されるようになるのは期待する結果です。<br><br>隠し機能(インデント揃え)は発動の条件が厳しいのでオプシ ョン化する必要もないと思 っています。掲示板の例のような悪影響を排除する努力は必要になりますが。
回避不能かもしれないけど報告しておきます。<br><br>あいうえお<br>1あいうえお<br>(TAB幅は4の設定)<br><br>で、1行目の「う」の手前から2行目の「う」の後ろまで矩形選択してTABを2回入力すると、<br>2行目の「いう」の両端にTABが入ります。
インデント挿入された行のうち、最小挿入幅の分だけ矩形移動すればいいのかな。幅はptLayoutNewから計算して。
別件ですが要望です。<br>現状、1文字のTAB/SPACE入力が必ずインデント扱いにな ってしま っていて変です。<br>マクロでいうと、<br>IndentTab/IndentSpaceはインデント扱いでいいのですが、<br>Paste/InsText/CharでTAB/SPACEが入力されるときは<br>通常の文字入力と同じ動作にしてほしいです。<br><br>そうすれば、<br>if( Editor.IsTextSelected() == 2 )<br> Editor.Char(9); // タブを挿入<br>else<br> Editor.IndentTab(); // タブインデント<br>のようなマクロをTABキ ーに割り当てることでインデント揃えの機能を完全に切ることもできます。<br>(オプシ ョン化も完全に不要になる)
↓こんな感じでできるのかな?<br>Index: sakura_core/CViewCommander.cpp<br>===================================================================<br>--- sakura_core/CViewCommander.cpp (リビジ ョン 1674)<br>+++ sakura_core/CViewCommander.cpp (作業コピ ー)<br>@@ -2787,7 +2787,7 @@<br> if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ){<br> /* 矩形範囲選択中か */<br> if( m_pCommanderView->GetSelectionInfo().IsBoxSelecting() ){<br>- Command_INDENT( wcChar );<br>+ Command_INDENT( wcChar, FALSE );<br> return;<br> }else{<br> m_pCommanderView->DeleteData( TRUE );<br>@@ -4781,7 +4781,7 @@<br> <br> <br> /* インデント ver1 */<br>-void CViewCommander::Command_INDENT( wchar_t wcChar )<br>+void CViewCommander::Command_INDENT( wchar_t wcChar, BOOL bIndent )<br> {<br> using namespace WCODE;<br> <br>@@ -4796,7 +4796,7 @@<br> // To Here 2001.12.03 hor<br> wchar_t szWork[2];<br> auto_sprintf( szWork, L"%lc", wcChar );<br>- Command_INDENT( szWork, CLogicInt(wcslen( szWork )) );<br>+ Command_INDENT( szWork, CLogicInt(wcslen( szWork )), bIndent );<br> return;<br> }<br> <br>@@ -4855,13 +4855,6 @@<br> /* 現在の選択範囲を非選択状態に戻す */<br> m_pCommanderView->GetSelectionInfo().DisableSelectArea( FALSE/*TRUE 2002.01.25 hor*/ );<br> <br>- // From Here 2001.12.03 hor<br>- /* インデント時は空白行に書込まない */<br>- if( 1 == nDataLen && ( WCODE::SPACE == pData[0] || WCODE::TAB == pData[0] ) ){<br>- bIndent=TRUE;<br>- }<br>- // To Here 2001.12.03 hor<br>-<br> for( nLineNum = (Int)rcSel.GetFrom().y; nLineNum < rcSel.GetTo().y + 1; nLineNum++ ){<br> const CLayout* pcLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( CLayoutInt(nLineNum) );<br> // Nov. 6, 2002 genta NULLチ ェ ック追加<br>Index: sakura_core/CViewCommander.h<br>===================================================================<br>--- sakura_core/CViewCommander.h (リビジ ョン 1674)<br>+++ sakura_core/CViewCommander.h (作業コピ ー)<br>@@ -106,7 +106,7 @@<br> void Command_CUT_LINE( void ); /* 行切り取り(折り返し単位) */<br> void Command_DELETE_LINE( void ); /* 行削除(折り返し単位) */<br> void Command_DUPLICATELINE( void ); /* 行の二重化(折り返し単位) */<br>- void Command_INDENT( wchar_t cChar ); /* インデント ver 1 */<br>+ void Command_INDENT( wchar_t cChar, BOOL bIndent = TRUE ); /* インデント ver 1 */<br> // From Here 2001.12.03 hor<br> // void Command_INDENT( const char*, int );/* インデント ver0 */<br> void Command_INDENT( const wchar_t*, CLogicInt ,BOOL=FALSE );/* インデント ver0 */
どうでもいいことですが、こちらで公開されているパ ッチと自分のところのrev1674からの引用ソ ースとでは、全体的に行番号が55行ほどずれてしま っています...
とりあえず報告します。<br><br>0123456789<br>あいうえお<br>1かきくけこ<br>(TAB幅は4の設定)<br><br>で、1行目の「4」の左から3行目の「き」の右までを矩形選択(幅1桁)して<br>TABを3回入力すると、1行目の「4」の左右にTABが入ります。<br>(1回目が左に入り、2回目はスキ ップ、3回目が右に入る)<br>また、上記と同じ(キ ー入力前の)矩形選択状態からTAB,abcdefの順にキ ー<br>入力すると、1,2行目にはTABの左にabcが、右にdefが入力されます。
rev7です。<br><br>あいうえお<br>1かきくけこ<br><br>で、「い」の左から「き」の右まで矩形選択します。<br>まず、「さ」を入力します。<br>次に、「a」を入力します。<br>結果、1行目には「さ」の手前に「a」が入 ってしまいます。
TABを含めた文字列をクリ ップボ ードから貼り付けた場合も<br>ずれると思うけど、それは「仕様」とするしかないかな?
デバ ッグモ ードでコンパイルすると、4883行で、<br>error C2440: 'int' から 'CLayoutInt' に変換できません。<br>のエラ ーにな って実行フ ァイルが作成できません。
rev8です。<br><br>あいうえお<br>1かきくけこ<br>0123456789<br><br>「い」の右側から、3行全部を0幅選択してスペ ース入力すると、<br>なぜか2行目がselectionIsOutOfLine==trueの条件で<br>入力スキ ップされます。<br><br>selectionIsOutOfLineの判定条件が(たぶん)おかしいです。<br>(括弧が足りてない気がします)<br><br>誤)<br>const bool selectionIsOutOfLine = reachEndOfLayout<br> && (pcLayout && pcLayout->GetLayoutEol() != EOL_NONE) ? xLayoutFrom == xLayoutTo : xLayoutTo < rcSel.GetFrom().x;<br>正)<br>const bool selectionIsOutOfLine = reachEndOfLayout<br> && ((pcLayout && pcLayout->GetLayoutEol() != EOL_NONE) ? xLayoutFrom == xLayoutTo : xLayoutTo < rcSel.GetFrom().x);<br><br>ではないですか?
rev8.1でOKな気がします。<br>いい感じ (^^)
「1文字のTAB/SPACE入力が必ずインデント扱いにな ってしま っていて変」<br>(2009年11月10日 (火) 10:49 JST, 10:50 JST)<br>の意図が通じていなか ったようで悲しい。<br><br>・タブキ ーとスペ ースキ ーに割り付けられた機能を削除すると、<br> 複数行選択したときのタブやスペ ースは選択範囲をインデント<br> するのはなく、選択範囲がスペ ースやタブに置き換わる<br> (文字入力と同等に扱われている)<br><br>ということに気づいてないですか?<br><br>つまり、インデント(F_INDENT_TAB)由来のTABと文字入力(F_WCHAR)由来のTABはもともと別の動作。<br>(マクロで言うとF_INDENT_TAB=InsertTabでF_WCHAR=Char)<br><br>なのに、<br><br>・矩形選択時だと1文字のTAB/SPACE入力が必ずインデント扱い<br> (IndentTabとChar(9)が同じ動作をする)」<br><br>が変なのです。<br><br>細かく分けると、<br><br>TABには<br>・F_INDENT_TAB由来のTAB<br>・F_WCHAR由来のTAB<br>の二つがある。<br><br>SPACEには<br>・F_INDENT_TAB由来のSPACE ← ソフトタブ<br>・F_INDENT_SPACE由来のSPACE<br>・F_WCHAR由来のSPACE<br>の三つがある。<br><br>それぞれ意味合いが違うので動作を別にする必要がある
念のため。<br>上記の、<br><br>・タブキ ーとスペ ースキ ーに割り付けられた機能を削除すると、<br> 複数行選択したときのタブやスペ ースは選択範囲をインデント<br> するのはなく、選択範囲がスペ ースやタブに置き換わる<br> (文字入力と同等に扱われている)<br><br>の「複数行選択」というのは矩形ではない通常の複数行選択のことね。
ええと、具体的にどういう動作が不満で、どういう結果になるのがよいのでし ょうか。rev.9版のバイナリは http://vvvvvv.sakura.ne.jp/ds14050/diary/20090808.html#p03 にあります。<br>矩形選択中にタブやスペ ースを貼り付けたとき、矩形選択中に TABインデントや SPACEインデントを割り付けていない状態でタブキ ーやスペ ースキ ーを押したとき、TABインデントや SPACEインデントで要求される桁揃え機能が働かないようにした(つもりな)のが rev.9 です。<br>相変わらず Comman_INDENT()が呼ばれるのは、矩形選択中の文字入力は選択中の各行への文字挿入であり、その処理(のほとんど)がインデントと共通だからという理由だけです。<br>「インデント扱い」の意味を(自分は)取り違えていますか?
行末を超えた位置にも通常文字は入る。<br>SPACEキ ーにインデントを割り付けて*いない*ときは、<br>行末を超えた位置にはSPACEが入 ってほしい。<br>でも、入らない。<br><br>nDataLen == 1という判定条件がコ ードに含まれている限り、<br>インデントか否かではなく文字数が1かどうかで判定していることになるので、<br>そこは間違 っているように見えます。
この部分ですね。<br>----<br>if( nDataLen == 1 && IsIndentChar( pData[0] )<br> && ( emptyLine || selectionIsOutOfLine )<br>) {<br> continue; // インデント文字を改行文字の後ろや空行に挿入しない。<br>----<br>この部分は独断で if( bAlign ) {} という条件の外に出してしまいました。コメントには「インデント文字を改行文字の後ろや空行に挿入しない」と書いてありますが、(こう書き直そうか迷 って結局そのままにしたのですが)真意は「空白文字を改行文字の後ろや空行に挿入しない」です。自分が便利だと思い、従来の動作から変更する利点も想像できなか ったために温存した部分にこだわられているとは思いもよりませんでした。
nDataLen == 1 && IsIndentChar( pData[0] ) <br>なんていう条件だと、<br><br>クリ ップボ ードにスペ ースが2字入 っていて、<br>それを貼り付けたときは改行超えて入力されるのに、<br>1字のときは入力されない。<br><br>これは、コ ードがそうな っているからそのように動作する<br>というだけで、混乱を招きこそすれ何の利点もない。<br><br>1字のSPACE/TABという条件は、コ ードをはじめて見た<br>瞬間におかしいと思 ったし、誰でも同じことが想像できる<br>と思 っていた。
> 選択範囲が一行だけだ ったとき、Command_INDENT_TAB()は Command_INDENTの代わりに Command_WCHAR()を呼び出す。<br><br>そうしないと他エデ ィタの動作とも整合しなくな って、<br>変な動作をするエデ ィタと思われるようにな っち ゃうよ?<br>秀、Em、VisualStudioなど、このへんはたいてい同じ動作。<br><br>てか、(こういうと失礼かもしれないけど)知らなすぎと違います?
>1字のSPACE/TABという条件は、コ ードをはじめて見た<br>>瞬間におかしいと思 ったし、誰でも同じことが想像できる<br>>と思 っていた。 <br>おかしいおかしくないは別として、インデントとは別の問題だと思 ったので元の挙動を残しました。<br><br>>そうしないと他エデ ィタの動作とも整合しなくな って、<br>>変な動作をするエデ ィタと思われるようにな っち ゃうよ? <br>>(略)<br>>知らなすぎと違います? <br>知らないのは事実です。最初のコメントに書いたとおり。ほかのエデ ィタでどうな っているかという情報は重宝していますが、整合性に重きをおいてはいません。過去のサクラエデ ィタとの互換性は気にします。<br><br>タブキ ーに割り付けられているのが「TABインデント」なのに選択範囲が一行の時だけはインデントしないんだ、と「潔癖」症的な立場から感想を述べただけですのでどうぞ気になさらず。
どうしようもないな。「元の挙動を残し」た。<<<大嘘
なんかもうぐだぐだだけど気づいてしま ってので訂正。<br>>知らないのは事実です。最初のコメントに書いたとおり。<br>最初のコメント っていつのだよ!<br>http://vvvvvv.sakura.ne.jp/ds14050/diary/20091026.html#p01 の最初のコメントに対する返答でした。