2010.06.02 Wed. 日本語を含む文字列を表示させた場合の Vty のふるまいについて。 cursor の位置等。 Vty に patch をあてた。 次は画面のスクロールだ。 2010.06.03 Thr. 上手くいっている。 この memo 自体も yjedit で書いている。 ただ、ひとつ問題なのが esc の後に間髪入れずに他の key を押した時に、 esc が cancel されてしまうこと、か。 一番下の行を status bar にしようかな。 次は Editor module を、EditorCore module とし、 Main module を Main module と Editor module に分けよう。 そして、Main - Editor - EditorCore という依存関係にしよう。 回数指定あたりに問題がある。 これは、回数指定が有効な action と無効な action を分けることで解決されそうに思う。 そのためには、keybinding の設定の時にもうすこし抽象化された data 構造を 使用する必要があるのではないかと思われる。 それと、G でも実装しておこうかな。 2010.06.04 Fri. 複数の buffer での copy - paste を実現したいのだが、 2つの考え方がある。 ひとつは、Editor のなかに、複数の buffer を持つようにすること。 もうひとつは、buffer ごとに Editor を用意するというやり方。 後者のほうが良さそうに思うが。 o, や '\n' でも scroll するようにする。 また、times の実装のしかたを変え途中。 2010.06.07 Mon. 今のところ、\t はうまくあつかえない。 2010.06.10 Thr. いい感じだ。 無限 undo も implement したし。 ただ、\t や、Ctrl-Char の表示に問題がある。 つまり、.zshrc が編集できない。 いくつかのことを根本的に考えてみる必要がある。 そのうちのひとつが、行末にカーソルが存在するということについて、である。 行末にカーソルが存在できるのは、insert mode 等の場合のみであり、 normal mode においては許されないものとしたほうが良いのかもしれない。 2010.06.11 Fri. 'A' が buggy な動きをするので修正する必要がある。 また、'b' については、backward な移動についても、 more 的動きが必要ということかもしれない。 '$' によって行末を keep するようにする。 そのためには、cursXX を Maybe Int にする必要があるだろう。 2010.06.12 Sat. searchStr を実装できるように moveInline を書き直した。 速度的には大きな改善が見られたが、 next search の実装がまだ。 また、moveInline についても no wrap がうまく動かないという問題がある。 no wrap は無理に実装する必要はないと思われるが、できたら作っときたい。 速度が犠牲になる可能性があるが、以下の行すべてが、Nothing であるかどうか、 調べるというのがひとつの方法である。 速度に問題があるとしても、no wrap を有効にした場合のみであることと、 O(n) の速度低下であるので、問題ないかもしれない。 とりあえず no wrap はいらないかな。 いや、これが無いと無限 loop になってしまうので、すくなくとも内部的には必要。 下の行を調べて、全て Nothing だったら動かない、 という処理を実装したほうが良い。 次は、cursorNextSearch を。 2010.06.13 Sun. 次は、'nL' の実装。 2010.06.14 Mon. '\t' と、日本語の組み合わせはまだうまくいかない。 edit another file と undo の組み合わせが buggy 。 inlineYanked も yankedLine 同様に、EditorCore.hs 内にもどす必要がある。 2010.06.16 Wed. :today command はそのうちに消す。 そのときに、cabal file の old-locale と time の dependence を一緒に消すこと。 2010.06.17 Thu. いくつかのやることがある。 気が散ってしまっているので、すこし整理する。 あとで TODO に copy しておいてもいいかも。 * refactoring を続ける。 特に EditorCore.hs の code や interfase をもうすこし整理したほうがいいかも。 * '.' の実装 同じ command をくりかえすことが必要になることは多いので。 ただし、これは、もうすこし refactoring してからのほうが良いかも。 * usr レベルでの compile により、設定可能にする。 * library 化を進める。 機能追加や keybind の変更等を分かりやすい interface で行えるようにする。 * Vty との切り分け。 Vty との癒着を弱くする。同時に x11 版も作成する。 とりあえず、keybind を、Keybind module に分けよう。 次にするべきことは、まず、Keybind module 中で、 data Event を定義してしまい、 それを、qualified as で import する。 Vty 中での data Event からの変換関数を書く。 こうしておけば、Main.hs 以外では Vty との癒着は無くなるはずだ。 Vty を必要とする処理をひとつの module にまとめる。 で、Main.hs は単純な形にして、user が簡単に書ける程度のものにしておく。 そのためには file 操作関数を別 module にする必要があるかもしれない。 import Yavi import Yavi.Vty main = runYaviMain getEventVty outputVty defaultYaviConf くらいの Main.hs で動くようにしておけばいいのかもしれない。 また、Vty を必要としない version を作っておいてもいいかも。 はじめは、Yavie.Vty 内に vtyMain を作り、main から呼び出す形にしよう。 それから、x11Main を作り、同様に呼び出すようにしよう。 これは、command line argument で切り替えれば良いだろう。 で、その後は、vtyMain と x11Main に共通の関数を作成していき、 それを main から使うようにする。 Yavie.Vty と Yavie.X11 とで同じ interface を使うようにして、 単純に import Yavie.Vty と、import Yavie.X11 をさしかえることで両者の 変更が可能なようにする。 で、これから X11 版を作成するわけだが、その前に、view 的な mode を作っちゃおう。 これは、変更用の keybind を mask してしまえばいい。 具体的には、i, I, a, A, r, R, d, D, c, C, s, S, o, O あたりを、 何もしない動作で上書きしてしまい、他は delegate としてしまえばいい。 2010.06.25 Fri. IO たとえば、save to file や load file などの IO も、 Editor 構造のなかに入れてしまおうかな。 次にやることは、それの前に、gtk での日本語入力、かな。 それと、gtk での cursor の表示かな。 2010.06.28 Mon. 一通りできることはできるようにしたと思う。 次は、interfase の整理、だ。 Haskell programmer のために、 簡単に設定や機能拡張ができるようにする。 つまり、library として洗練させること、だ。 そのためには、とりあえず、2つのことが簡単に設定できるように しなくちゃいけない。 ひとつは、Keybind。 もうひとつは、使用する interphase 、 つまり、たとえば Vty、HsCurses、X11、Gtk 等。 このふたつが簡単に設定できるような作りになっていれば、 とりあえずの release をしてしまえる。 そうすれば、誰かが yavie という名前を先に使ってしまうということ におびえる必要が無くなる。 もちろん、そのようなときには別の名前をでっちあげればいい、 ということではあるけれど。 そうだな。 設定とは main を、自作することである、とする。 しかも、cabal 形式で作るようにしよう。 そうすれば、必要な package の不足を簡単に検出することができる。 そろそろ package 名を yjedit から yavie にする時期だ。 Cabal package を利用する。 defaultMainArgs を使おう。 getHomeDirectory --prefix=[home]/.yavie/ を使って、.yavie 以下に install して、どうの、という話。 その前に library 化を進めるか。 けっこう難しいところがある。 どこから始めるかという問題もある。 もうすこし capsule 化が必要だろう。 そして、event-driven の interface を clean にしなければならないな。 一時的に MainTools.hs を作成し、runWithFileCursor をそこに移す。 それによって、Main.hs の refactoring を進める。 2010.06.29 Tue. 次にするべきことは、runWithFileCursor の名前を変えて、 FilePath を引数に取るようにする。 withCursorPos :: FilePath -> ( Pos -> IO Editor ) -> IO () としよう。 また ~ をちゃんと展開するようにしたい。 <- もうできてた、というか、shell がやってくれるみたいだ。 さて、次にやるべきことは。 ひとつは、runLoop の wrapper を作ること、だ。 これに関しては、引数をばらばらに取るべきか、 あるいは構造体としてまとめてから渡すべきか、考える必要がある。 それと、それぞれの UI ごとに必要な前処理をも、構造体にまとめてしまうのも ひとつの手だ。 そして、もうひとつは、 linesForDisplay が何を返すべきか、という問題がある。 カラー表示等を考えると、今のデータ形式では貧弱な気もする。 ひとつ考えられるのは、 ( Bool, ( Int, Int ), [ [ ( Attribute, String ) ] ] ) といった形式。 で、 data Attribute = Attribute String といった感じか。 あるいは、もっと明確なフィールドを持つように、data で作るべきか。 おそらく最終的には後者のやりかたを採るべきだと思われる。 で、そこらへんを何とかしたら、 次には Keybind のカスタマイズについて考える必要がある。 answerbind はいらないかもしれない。 Config や、runYavie を IO でなく Monad m => m としたい。 そのためには、Config に withInitialEditor field を追加して、 filename と contents を取るようにするべきかもしれない。 2010.06.30 Wed. RefMonad あたりで苦心したが、なかなかいい感じに仕上がったと思う。 次は runYavie と runYavie2_ をひとつにまとめることを考えよう。 event-driven package をいじる必要もありそう。 2010.07.02 Fri. 次は、複数の Editor を扱えるようにすること、か。 その前に、module の構成を整理する。 Yavie 以下に配置する、等。 Yavie.Examples ではなく Examples にしたほうが良いかもしれない。 file 名によって keybind を変更するために使える interfase を定義する。 source code を color で表示する機能と auto indent 機能について考える。 両者とも多少めんどくさいところがある。 それと、選択が今のところ行単位でしかできない点は、 実用上、そんなに問題はないが、すこしかっこ悪いように思う。 次は DisplayLines を type から data にして抽象化する。 そうしておけば将来の type change に伴う痛みを軽減できるだろう。 次は行の途中から、および行の途中までの選択について、か。 その前に、getContainer を使わないようにしようかな。 書いている text を定期的に保存するような機能が必要だな。 とりあえずは単純に、何回かの key stroke 後に自動的に、.yavie.[filename] に buffer の内容を copy するようにしよう。 2010.07.08 Thu. keybind とともに、それが必要とする save data を指定できるようにする。 具体的には、その data type を指定してやると保存、取得ができるような物をつくる。 とりあえず、Editor 以外にも保存が可能なようにしよう。 2010.07.09 Fri. できるかどうかはわからないが、setIOAction に代わるものとして、 EventMonad を取れる関数を作りたい。 そうすれば、たとえば、runEvent ( EvKey ( KASCII 'o' ) [ ] ) とか、できる。 ただ、本当にそれが正しいのかどうか。 つまり、ex mode 上での command として作成しておいて、 それへの shortcut として、1文字 command を定義するというやりかたをする場合に、 このやりかたはうまくいくだろうか。 2010.07.14 Wed. 一応、home directory 以下の main を実行できるようにはなった。 code が乱れているので、refactoring が必要。 また、./yavie でも、home directory 以下の main を使うようにしよう。 その後、徐々に本体の depend を減らしていけるだろう。 また、interfase をもうすこし練る必要がある。 次は、default 以外も選べるようにする。 とりあえず、vty, x11, gtk directory を作成し、 中身を copy するようにしよう。 .yavie/vty や、.yavie/x11 などを reset する機能が必要か。 2010.07.15 Thu. たとえば、~/.yavie/main_default 等で、default で使う main directory を指定する、等。 2010.08.10 Tue. 次は、(!!) をもうすこし error がわかりやすいように書き換える。 2010.08.13 Fri. -R flag が効かなくなっているのを直すこと。 2010.09.13 Mon. 暗号化テキストを扱えるようなバージョンを作ろうか。 そうだな、暗号化と復号化をオプションで指定する等のやりかたが考えられる。