Tvi Online Help

# 開発者向け情報

というほどのもんじゃなかったりしますが... Tvi をいじってみようとお考えの方のお役に立てば幸いです．

1. まずはちょっと歴史から...

   Tvi のもともとは，LaTeX の数式を入力する Tk アプリを自作したところから始まりました． 「ω」というボタンを押せば，「\omega」と入力されるようなものです． 入力したテキストは Text ウイジェットに入り， 最後にそれを X のセレクションに叩き込んで vi で編集中のところに中クリックで入れてやるというわけです． またそれとは別に(おそらく多くの方が作ってらっしゃるのではないかと思いますが)ボタンを押すとLaTeXソースファイルがコンパイルされたり，Xdvi を起動したりという，ちょっとした Tk アプリも作ったりしていました． そのうち，いっそ数式入力アプリ上で慣れた vi のようなこと(h, j, k, l による移動や i による入力など)ができれば便利だな...と思い始めました． ただ，vi は文字入力時と文字移動時にはキーの動作が異なるエディタです． (余談ですが，私はこれを「モード」と呼ぶのがあまり好きではありません． 文字の挿入は " i [挿入文字列] [Escape] " の一連の動作が一つのコマンドなのだと考えています．そちらの方がすっきりしますので．) これをどう Tcl/Tk 上で実装するかを考えました． そこで思い付いたのが，現在の Tvi でも使われている，普段は .virtual という仮想の(画面上に無い)ウイジェットに focus させておくという手段です． 例えば，h を押せばカーソルが左に行く，という動作を， .virtual 上で h が押されれば，メインの Text ウイジェット(.textという名前です)上のカーソルが左に動く，と表現しています．そして i や a の文字入力時には，i や a の入力とともに focus が .text に移り，[Escape] とともに .virtual に戻る，とすれば良いわけです．

   この方法を思い付いてから，いくつかの移動，編集コマンド(自分が良く使う必要最小限のものだけですが)を実装して Tvi の原型ができました． ボタンを押せばコンパイルする機能も付けると，今までの vi による編集より便利に感じるようになり， 自分の LaTeX ソース編集は， このプログラム上でおこなうようになってしまいました． ただ最初のバージョン(0.1)では，アンドゥが，元のテキスト全体を保存しておいてごっそり戻すという強引なことをしていたため，重いという欠点がありました． 次のバージョン(0.2)では，どのような編集動作をしたかを記憶しておき， アンドゥ時にはそれを読みだし逆のことをおこなうようにしていました． しかし，これだと編集コマンド一つ一つに付き， 対応するアンドゥ部分をつくらねばならず， ソースも汚くなってだんだん嫌になってきました． そこで現在のバージョンでも使われている， 編集動作を統一的に記憶しておく方法に変更しました． (詳細は下をご覧ください) この方法にしてから，ソースも(いくぶん)すっきりし， 新たな編集コマンドを実装していくのが苦でなくなりました．

   そしてその他のこまごまとした機能(ispellによる英文スペルチェック， コマンド・環境名タイプミスチェック，Tab による補完など)が 追加されて現在の Tvi となりました．

2. どこからいじればいいの？

   Tvi の構造について説明する必要がありますね． 上でも述べたように， Tvi は，デフォルトの状態ではすべてのキー入力は .virtual が受け取ります． なので，もしあるキーを押した時の動作を知りたい場合には， まず main_bind を見てください． このファイルにすべてのキー入力に対する動作が書かれています． main_bind を見るとわかるように， 多くのキー入力ではプロシージャを呼ぶようになっていますが， ほとんどのプロシージャは main_tcl にあります． また LaTeX 関係のいくつかのプロシージャは latex_tcl にあります． また，初期起動時には，main_ini_value (初期値の設定) と main_ini (初期実行スクリプト)が実行されます． main_tk にはほとんどすべてのボタン類の配置などの画面の情報が定義されています． これらの TCL ファイルの読み込み順を知りたい場合は， メインルーチンである tvi を見てください．

   また，Tvi のコントロールボタンのイメージは， img_* という TCL ファイルによって作成されます． これらの TCL ファイルは， Xpaint で書いた XPM 形式の画像を同梱の maketviicon.tcl を使って変換しています． 実はこのボタンのイメージの読み込みに結構時間がかかるのですが， 背景が透明になるので，このやり方が気に入っています．

3. 編集コマンドについて

   i, a, x などの編集コマンドは， アンドゥ(u)およびリドゥ(.)を統一的におこなうために， 以下のような変数に値を格納していくようになっています．

   - csi
     コマンド開始時の index
   - go_csi_dsi
     削除位置に移動するコマンド
   - dsi
     削除開始位置の index
   - dei
     (削除前の)削除終了時の index
   - delete_command
     削除コマンド(deiを求める)
   - dchars
     削除した文字列
   - go_dsi_pisi
     削除開始時からプレ挿入開始の index への移動コマンド
   - pisi
     プレ挿入開始 index
   - pichars
     プレ挿入文字列
   - piei
     プレ挿入終了 index
   - go_piei_isi
     プレ挿入から(真の)挿入開始の index への移動コマンド
   - isi
     挿入開始 index
   - insert_command
     挿入コマンド(icharsを求める)
   - ichars
     挿入文字列
   - iei
     挿入終了時の index
   - go_iei_cei
     挿入終了時からコマンド終了時のindex への移動コマンド
   - cei
     コマンド終了時の index

   プレ挿入とは大抵改行コードなどの挿入です． すべての編集動作をこれらに当てはまるようにしさえすれば， アンドゥ，リドゥなどがおこなえることになるわけです．

   インデックスに戻る