|
毎度お世話になっております。
さて、searchdown2 文で正規表現 DLL を hmonig.dll にして、カーソル位置の改行
文字にマッチさせることを
意図して照合開始位置のアンカーの \G を使用して \G\x{000A} を検索したところ、
カーソル位置から大きく
離れた位置の改行文字に強引にマッチしてしまう不具合がありました。
検証マクロは次の通りです。
debuginfo 2 ;
#defaultCompatibleMode = setcompatiblemode(
0x00000003
| 0x0000000C
| 0x00000200
| 0x00020000
| 0x00080000
| 0x00400000
| 0x00800000
| 0x04000000
| 0x08000000
) ;
#defaultTopY = screentopy ; #defaultLeftX = screenleftx ; disabledraw ; disa
bleinvert ;
#defaultColumn = column ; #defaultLineNo = lineno ;
#lineCount = 6 ;
#lineIndex = 0 ;
while ( #lineIndex < #lineCount ) {
#lineNo = #lineIndex + 1 ;
// カーソルを行頭に置く。
moveto2 0 , #lineNo ;
// カーソルのすぐ右隣の改行文字を選択状態にする。
// カーソルの右隣は改行文字でない場合は失敗するはずである。
searchdown2 @"(?#hmonig)(?#maxlines:1)(?#fulllinematch)(?u)\G\x{000A}" ,
casesense , regular ;
call WriteResult #lineNo , result ;
#lineIndex = #lineIndex + 1 ;
}
moveto2 #defaultColumn , #defaultLineNo ;
enableinvert ; enabledraw #defaultTopY , #defaultLeftX ;
setcompatiblemode #defaultCompatibleMode ;
endmacro ;
WriteDebug :
debuginfo $$1 + "\U0000000A" ;
return ;
WriteTitle :
call WriteDebug @"[" + $$1 + @"]" ;
return ;
WriteValue :
call WriteDebug $$1 + @" = " + str( ##2 ) ;
return ;
WriteResult :
call WriteTitle str( ##1 ) ;
call WriteValue @"Result" , ##2 ;
call WriteValue @"BeginLineNo" , seltoplineno ;
call WriteValue @"BeginColumn" , seltopcolumn ;
call WriteValue @"EndLineNo" , selendlineno ;
call WriteValue @"EndColumn" , selendcolumn ;
call WriteDebug @"" ;
return ;
このマクロを以下のような 1〜3 行目は文字があって 4〜6 行目は改行文字だけのフ
ァイル ( UTF-8 、LF 、BOM有り )
0001 aaaaaaaa
0002 aaaaaaaa
0003 aaaaaaaa
0004
0005
0006
で実行したところ、次のような出力となりました。
[1]
Result = 1
BeginLineNo = 4
BeginColumn = 0
EndLineNo = 5
EndColumn = 0
[2]
Result = 1
BeginLineNo = 4
BeginColumn = 0
EndLineNo = 5
EndColumn = 0
[3]
Result = 1
BeginLineNo = 4
BeginColumn = 0
EndLineNo = 5
EndColumn = 0
[4]
Result = 1
BeginLineNo = 4
BeginColumn = 0
EndLineNo = 5
EndColumn = 0
[5]
Result = 1
BeginLineNo = 5
BeginColumn = 0
EndLineNo = 6
EndColumn = 0
[6]
Result = 1
BeginLineNo = 6
BeginColumn = 0
EndLineNo = 7
EndColumn = 0
結果は、カーソルが改行文字だけの行の行頭にある場合は searchdown2 は成功して
改行文字が選択されるという
正しい結果となりました。しかし、カーソルが任意文字を含む行の行頭にある場合は、
本来ならば searchdown2 が
失敗していなければならないのが、なぜか成功扱いになり、しかもカーソルから離れ
た位置にあるはずの行頭の
改行文字を選択してしまっている状態となっております。
このため、カーソル位置を表すアンカー \G を使って、カーソル位置の文字列が任意
の正規表現にマッチするかどうかを
searchdown2 を使って調べる際に、その正規表現が改行文字にマッチする場合に正確
な判定ができなくなってしまって
います。
環境は、
秀丸エディタ : 9.12 Float x64
hmonig.dll : 0.8.7.0
HmJreSelect.dll : 0.10
です。
|
|