オートインデントの実装に対する考察
どうも、小説が書けないのでソースコードを書いていた変態です。
マイルストーンとしてオートインデントの機能を実装できたので書いておきます。
なおこの文章はPythonを前提にしています。
まず「インデント」って何? という話かもしれないですね。
インデントとは字下げのことです、平たく言えば行頭に入れる空白です。
本来であればプログラムのソースコードを読みやすくしたり一部言語ではそれ自体が意味を持っていますが小説にもあると便利だったりします。
段落ごとに行頭に空白を入れるのって億劫じゃないですか? 面倒ですよね!
そこで改行をすると自動で空白を一つ入れてくれると便利だなーと思いました。
思ったは良いが実装は酷いものです、まずKeyPressイベントでキーが押されたときに空白を挿入するという素朴な実装を試しました。
残念ですがコレは失敗、エンターを押すより早く押された時点で空白が先に挿入されるため行末に空白が追加されてしまいました。
しかしめげずにじゃあもうちょっと遅らせてエンターが押された後に空白を入れればいいんじゃないかと感エタのが第二実装です。
こちらではKeyReleaseイベントが起きたら空白を挿入する実装にしました。
この試みは「半分」成功しました。確かに改行後に空白は入ります、しかしこれは日本語を書くためのエディタです。
この安直な実装はキーが離されたときに空白を入れますがIMEでの候補決定時にもエンターが押されたと判断して変換のたびに空白が意図せず入ってしまいました。
日本語の面倒くささと、なぜローカライズが後回しにされることが多いのか少し分かりました。
結局この問題はあまり美しくない、所謂「ダーティーなハック」で対処しました。
解決法の鍵はKeyPressのイベントは漢字変換の確定時には発動しないと言う特性を利用しました。
ソースコードを貼ると怒られそうなのでざっくりと解決法を書くと
1.KeyPressで変換ではなく改行ならフラグnewlineを立てる
2.KeyReleaseでエンターが離されたのを検知
2.もしnewlineフラグが立っていればそれは改行なので空白を挿入
3.newlineフラグをおろす
ざっくりこんな感じで力業の極みでした。
もちろんあまり賢い解決法ではないので改行後エンターから指が離れるわずかなラグを感じます。
吸いませんコレが限界でした。
世の中のできる人はもっと良いやり方をするんでしょうが私には無理でした。
で、このオートインデント機能ですが……割と便利です。
なろうやカクヨム……というかWEB小説を書くなら昔の文豪のようにミッチリ詰めた文章ではないので改行を多用します。
そのたびに行頭に空白を入れるのが地味に手間なのでこの機能を実装したんですね。
と、まあコレが開発裏話でした。