Skip to content

実装 (2010 8 13 現在)

tyru edited this page Aug 12, 2010 · 1 revision

http://lingr.com/room/vim/archives/2010/08/11#message-614099

特定のキーのみ特別な関数で処理 それ以外はフェーズごとにわかれた関数で処理

マッピング

call eskk#filter('t') => "t"
call eskk#filter('t') => "\<BS>っ\<Plug>(eskk:filter:t)"
<Plug>(eskk:filter:t) は eskk#filter('t') を呼び出す。

説明のために簡略化してます。 実際の返す値は違うので注意。(各自確認してください)

ここは<Plug>を使わずに一回のeskk#filter()の中で処理を完結させたいところ。(速度改善のため)

「カーソルが後ろにハネる」という現象はおそらくこのため。

buftable (autoload/eskk/buftable.vim)

現在入力している文字列を管理しているオブジェクト

"t"

という入力の次に「t」という入力が来たら

"\<BS>っ"

という文字列を返す、など。(s:buftable.rewrite())

送り仮名はeskk#filter()の方で付け足している。

たまに「t」みたいな「現在入力されてる文字列」を勘違いすると、多めに"<BS>"を生成してしまい 直前の文字が消される、といったことが起こる。(バグ) このへんは「勘違いできない」構造にする、というのが目下のTODO。 ただし具体的な設計は思い付いていない。

イベント処理

GTKのようなシンプルなイベント処理

  • モードが切り替わった時に行う処理

  • 送り仮名のためにもう一回eskk#filter()呼び出す

  • eskk#register_event()

    • イベントハンドラ(とその引数)の登録
  • eskk#register_temp_event()

    • 上と同じだがイベントハンドラが起動されるのは最初の一回きり
  • eskk#throw_event() -イベント実行

eskkのインスタンス

cf. eskk#get_current_instance(), eskk#create_new_instance(), eskk#destroy_current_instance()

s:eskkがそのインスタンスのひな形。 この中に保存される状態はインスタンスごとに違う状態を表す。 他のスクリプトローカル変数などはインスタンス間で共有される。

SKKの「再帰的な辞書登録」を実現するためにこうする必要がある。 インスタンスはコマンドラインで再帰的に新しい編集領域が設けられるたびに作られる。 (Copy on Write方式にするかもしれない。 またインスタンス生成のオーバーヘッドをなくすために事前にいくつかインスタンスを作っておく、という方法もとるかもしれない。 なので生成されるタイミングについてはいろいろ変わるかもしれない予定)