--- Title: scieditor2 12 Author: yamasyuh68 Web: https://mimemo.io/m/MpVzxoDbRb4vZLb --- 191002 # 複数行検索の実装 - シンチラの検索では対応していない 置換については \r\n を指定したら改行してくれるが、検索はダメ - そこで python で検索して、その結果をシンチラで表示する事を考えた シンチラから全体文書を取得して python で正規表現検索をかけること自体は出来た 検索結果はマッチオブジェクトとして返り、start , end メソッドで位置がわかる - しかしpythonの戻り値は文字ベースになっているが、シンチラで位置を指定する場合は、行+文字数か、バイトベースかのいずれか。**行無しの文字ベースだと位置指定できない ┐('д')┌** - しばし悩み中 191003 # 複数行検索の実装2 - 新たに二つの関数をscintillaの派生クラス内に実装してうまくいった ( ´∀`) ①パイソンで得られた文字インデクスを、scintillaの行+インデクスに変換 ②scintillaで得られた行+インデクスをパイソン用の文字インデクスに変換 - pythonの検索結果をscintillaに反映させることがテーマでこれは① pythonで次を検索する時に検索開始位置を指定するが、それをscintillaからもらうこと、①の丁度逆になるけどそれが② - scintillaは文書を文字ベースだと行単位、全体はバイト単位で管理している模様 n行のm文字目、は直ぐに指定できるが、先頭から1000文字目、は指定できない 先頭から1000バイト目なら指定できる - しかし各行の文字数はわかるから、積み上げていけば結局はわかる 先頭から1000文字目は、0行目から文字数を取得して加算していって、初めて1000文字を超えた行内にあるということになる 力業ではあるがこの考え方で実装したらすっきり行けた - しかし、**力業過ぎるのでもっとスマートにしたい**んだが・・・ - そのあとだが、肝心の置換(グループマッチ)が今ひとつうまくいかない もう一息だと思うんだけど・・・ --- 191005- # 複数行検索3 - 置換も(グループマッチ)正常に動作してたことがワカタ(¯―¯٥) ここはなかなか難しいところだった いずれにしても複数行検索~置換はうまく行ってる キーボードで操作できるようにした ボタンを配置すると数が増えて煩わしいから 検索は**シンチラ、行単位、パイソン使用**と3種類、でもそれなりに使い分けてる - 置換で動作不良に見えてたのは、最後のマッチ文字列が\rまで含んでいたためだった 「.*」は改行までヒットするのか?? \rは改行じゃないか そこのところを加味して正規表現を書き換えた # エンコードエラー対応 - 文書を保存してもマーカーが消えないので変だなと思ったらエラーが表示されてた こういう仕様にしたんだった、我ながら良いわ( ´∀`) - cp932文書だった、保存できない文字ありのエラー メッセージでエラー文字のバイト位置はわかるけどそれじゃあどの文字かわからん!! 手っ取り早い方法として、inputBoxでバイト位置を手で入力してその位置にカーソルが飛ぶように実装してみたら結構良かった - もともと自動的にエラー文字にカーソルを飛ばすようにする計画だったんだけどうまく実装出来ずそのままになってた 今のように手で入力する方が他にも使えそうなので良いかも ---- 191007 # 文書中のURLをブラウザで開く - この機能は普通に必要だが、カスタムレクサーが前提となるようでなかなか進めなかった。でもないとかなり不便なので個別に実装してみた - Fキーでカーソル位置のURLを取得してChromeに投げる仕組みにした カーソル行文字列を取得、カーソル位置を起点として前後の空白をスキャンして空白で囲まれた文字列をURLと見なす(空白がなければ行頭行末まで) - 結構簡単だった (・∀・)ノ 本当は色表示とか下線、クリッカブルで実装したいところだけど、スクリプトのままのカスタムレクサーは遅すぎて使いものにならない 今はこれで良しとしよう( ´∀`) ``` def gourl(self): # URLを開く F6 l , index = self.getCursorPosition() line = self.text( l ) start,end=0,0 for start in range(index , -1 , -1) : if line[start] == ' ': start += 1 break for end in range(index,len(line)): if line[end] == ' ': break chrome=r'' subprocess.Popen( (chrome , line[0:end] ) ) ``` ---- 191008 # 機能分化 - 目的は起動の高速化だけどうまくいきません┐('д')┌ メイン以外の機能をダイナミックに読み込むようにすれば起動には関係ないし、そもそも使わないことも多い機能もあるし良いかなと 具体的にはシンチラ派生クラスに実装したこまごまとした機能群を外に出す - subprocess.Popen でスクリプトを実行、引数としてシンチラオブジェクトを渡す実験をした iterable じゃないオブジェクトみたいなエラーで進まず オブジェクトを引数に設定した時点でエラーみたいだ 考えたらシンチラオブジェクトのポインタを外部プロセスに渡しても意味ないよな メモリ空間が違うから多分見れないんだと思う - dll のように自分の空間に読み込まなくちゃダメなんだろう - 変わりの手法としてウインドウハンドルを渡そうとしてみたけどこれもエラーで進まなかった **┐('д')┌** ---- 191009 - カットのキーに行カットを追加 - 新規文書をキー割り当て ---- 191010 # 一括置換、起動時間計測など - 一括置換を実装(pythonベース) 面倒かなと思ったが結構簡単に実装出来た でも手作業を自動化しただけでコードとしては無駄が多いような気がしてる 一括置換って不安だから短い文書にしか適用しないような気もするのでこのままで良いかな どうしたものか?? - シンチラの起動時間を計測するようにしてみた モジュールの動的読込を実装する前にまずはこれ メインの頭でtimeだけインポートして時間を取得してウインドウを表示する直前で経過時間をステータスバーに表示してみた キャッシュが効いてる状態で**平均して0.65秒くらい**だった - モジュール化しようと思ってるルーチンをすっぽりコメントアウトしてから起動してみたが、ほぼ起動時間は変わらなかった┐('д')┌ そもそも起動のたびにバラツキもあるので正確ではないけど - 考えたら自分で書いたクラスの読込なんてQtやシンチラそのものと比べたら微々たものだよな あんまり意味なかったかな~ - とはいえとりあえずモジュールの動的読込も実験 単に外部のpyファイルをインポートモジュールで読めば良いと思ったんだが違うみたいだ 要調査 ---- └──> [scieditor2](https://mimemo.io/m/zeXgworpjz4K0Ek)