--- Title: scieditor2 07 Author: yamasyuh68 Web: https://mimemo.io/m/QORbW4qk0Yoda0N --- --- 190908 # 実用化に伴いいろいろ改善 使いながら気になるところから改善 アウトラインを書き直したいけど面倒でのびのびになってる 実用し出すととりあえず今でも動いてる部分は直すのが億劫になるものだなあ・・・ - アウトラインの更新~保存時とメニューにも加えた - アウトラインクリックの動作を修正 上の行をクリックすると落ちるバグ そこら辺は考えて実装したつもりだったんだが?? firstvisible って機能を知ったのでこれで再実装 常に10行目にターゲット行が表示されるようにした - ファイルブラウザからフォルダを開くを実装 - 新規保存時にタブ名と、winタイトルを変更するようにした - お気に入りタブにコンテキストメニューをつけて、リロードとopenfolderを実装 --- 190909 - mainwindow でドラッグ受け付けるようにした --- 190910 # 行内の数字加算機能 gPadでマクロを書いていた機能 シンチラなので普通に実装出来る ``` import re def calcline(self): self.SendScintilla(2314) # SCI_LINEEND = 2314 line , index = self.getCursorPosition() result = re.findall(r'\d{1,}', self.text( line) ) p= sum( [ int(l) for l in result ] ) p='| ' + str( p ) # 挿入文字列 self.insertAt ( p , line , index ) ``` - 最近このサイトを知って眺めてるといろいろな発見がある https://www.riverbankcomputing.com/static/Docs/QScintilla/annotated.html - シンチラの公式ドキュメントに近いのは①QScintillaBaseクラスなのでほぼこれを使ってきたが、その上位の②QScintillaクラスの方が使いやすい、当然だが 1行の文字列を取得するのも、1行の文字列長を取得してバッファを確保してからもらいに行くのが①、でも②だと .text(line)で簡単に取得できることがわかった - でも②も内部では同じ事をやってると思うので、時間は同じか遅いかもしれない 時間的なモノも含めてどっちが良いのか少しづつ調べていくのも良いかなと思った # setutf8 今注釈行にしてるのを解除してみた 変わりなさそう ここらへんはまだ理解が不十分だな # ヘルプ sciのキーバインドを忘れてるのでヘルプを作って既定フォルダに置いた、これでいいな VScodeで便利だった機能を追加したほかsci独自のモノもある 昔調べたのを思いだした、自作ものはこういう部分が自由で良いな # カスタムレクサー - https://qscintilla.com/ ここを参考にそろそろ初めてみた テキスト用、カッコとか罫線に着色する程度で十分なんだけど - ほぼサイトのコピペで実装はできたが、**遅い!!** 今までは組み込みのpythonレクサだったんだけど、それより遅いと思う 組み込みはコンパイル済みで早いのかな? 短い文書なら気にならないけど、長い文書だとストレス感じるレベル - 色分けの仕組み自体はわかったがかなり地道な作業というか、力業だ 時間がかかるのも当然だな・・・ - 特に言葉に区切りが無い日本語は色分けに向いてないのかもしれない 秀丸とか、日本語のエディタはどういう仕組みで実装してるんだろう? もう少し勉強してみるけど、すこし消極になってきた┐('д')┌ - 考えたら**アウトラインの解析がレクサに似ている。**これを同じルーチンでできたら早いかもしれない。カスタムレクサは派生クラスで自作だからここに解析を実装することは可能だ。レクサで行のチェックをするところで解析もすれば良いのか?? ## レクサの判別方法 ① if token[0] in list[ , , ] : これの意味が何となくだけどわかるようでわからなかった ② if hoge in hogetta : これは真だが、前の文字列が後ろの中に含まれているか ①も理屈は同じか?? 文字列じゃ無くてリストベースなんだな まあ文字列もリストだし、結局同じって事か?? ## レクサのトークナイザ - p = re.compile( r"[*]\/ | \/[*] | \s+ | \w+ | \W" ) これで全文を findAll して単語単位に区切ってから色分けする仕組みだ しかし英数文字しか単語にはならないから日本語や記号は一文字づつになる これが時間がかかる理由なのじゃろうか?? - 自分で書き換えれないかな 文書内の全ての文字に対してstyleを設定する仕組みなのが面倒だな **考えよう** ## Cython らしい https://qscintilla.com/superfast-syntax-highlighting/ ここに書いてあった、やっぱりカスタムは遅い 早くするためにはCythonを使うみたい アウトライン解析も早くなるかな --- 190911 # 行単位の検索を実装 - ヒット場所をリストにして飛ぶ、また元に戻るとかしたい searchでネクストしたり戻ったりはできるけど全体像がわからないので - https://codeday.me/jp/qa/20190413/614861.html ここも参考に ----> SciTEBase :: MarkAll()見たけどよくわかんない ┐('д')┌ ``` def searchline( self ) : self.ui.treeWidget.clear() search= self.ui.lineEdit.text() line , index = self.currentSci.getCursorPosition() treeID1 =QTreeWidgetItem([ '< 検索時のポジション >' , str(line) ]) self.ui.treeWidget.addTopLevelItem(treeID1) counter = 0 for i in range( self.currentSci.lines() ) : if search in self.currentSci.text( i ) : string= '[ ' + str(i+1) + ' 行]' + self.currentSci.text( i )[ : 10] treeID1 =QTreeWidgetItem([ string , str(i) ]) self.ui.treeWidget.addTopLevelItem(treeID1) counter += 1 if counter >50 : counter=-1 break ``` - 結構簡単だった(・∀・)ノ - アウトラインビューにヒットした行を表示することにした このビューはもともとクリックした行に飛ぶ仕組みだからそれはそのまま使える - scintilla の検索機能は使わない、1行ずつ取り出して検索文字の包含チェックをして真ならツリーに加えていくだけ ビューは行情報しか持たない作りなので行内の位置までは示さない - ビュー表示は**50行上限、超えたらメッセージを出す予定** - treeViewのつもりだったがwidgetだった、やはりwidgetの方が扱いは簡単だな modelを保持できないのがネック いずれはViewにするつもりなのにこんな機能をつけちゃったので面倒になってきた・・・・・ - **正規表現には未対応、必要あるかな??** # 数値を縦に加算 - カーソル位置から縦に数値を加算して数字が無くなったら結果を表示するように実装した CSVっぽい文書で使える機能なり ``` def calcline2 ( self ) : line , index = self.getCursorPosition() p = re.compile( r'\d+' ) n,sum = 0,0 while( 1 ): res = p.search( self.text( line + n)[index : ] ) if res : sum += int( res[0] ) n += 1 else : break self.insertAt ( str(sum) , line +n+1 , index ) ``` - シンチラのapiで簡単に実装出来た - 最後の結果表示だけど、最終行の最初のカーソル位置(index)に挿入する この場合最終行に空白なりがあれば良いけど、何も無い行だとindexが下の行にズレていくバグあり 一太郎みたいなフリーカーソルはエディタの発想には無いよなあ 最終行のlengthを取得してindex以下なら空白を加える仕様にするか?? --- ---> [scieditor2](https://mimemo.io/m/zeXgworpjz4K0Ek)