kakko-exと昨日辺りにやっていたこと

 kakko-exと言うのを教えてもらって少し見て色々思った。見た感じだと段落単位で括弧の数を合わせていくという幹事みたい。簡潔にまとまっているので使い易そう。白紙の状態にlispを書いていくときには非常に有効に機能しそう。基本的には(を打ったら)を打つという考えと同じように見えるけど、こちらの方が出来が良さそう。
 とは、言うものの、lispを修正しているときには妙な所で)が入ってしまう恐れがあることは否めないので、編集時は最終的な括弧のチェック以外は辞めざるを得ないかも。とか、その辺が悩ましい。

以下昨日と其の前辺りにやっていたこととか思っていたことのどうでもいい説明。

 これは昨日書いていた時にも、ちょっと思った。妙な場所への)補完だと補完してほしくない時が出てしまうので、難しい*1。例えばifの補完の場合(ifまで打ったら

(if ()
    ())

とか出てくれると白紙に書く場合は便利だけど、既に書いたlispを修正するときだと無駄な括弧が大量に出て邪魔なだけと言う罠。しかも場合によっては

(if hoge hoge)

 と言う感じに使いたいかも知れない。逆に機能を弱めて(ifを打った状態で何か押したら)が入る程度だと、)を直接打ったのと何が違うのか分からないというか。括弧を補うのが予想以上に難しい思ったのは特にその辺で、殆どゴミのような機能しか作らなかったといった中にそういうのも結構入ってます(その辺の奴は役に立つ奴立たないやつ含めて、ここには全然書いてないけど)。

■それ以前にお前は何をしていたのか、ゴチャゴチャ長くて分からん!!という人向け

  1. lisp-paren-complete:直前の文字を調べて登録したものとマッチしたら指定した関数を呼び出す。静的補完見たいな物だけど、文字列じゃなくて、関数を呼び出すので文字列を単純に補う以上の動作が出来るだろうとか、そんな感じの妄想の産物。指定する関数は自分で作らないと駄目だけど。これ自体は少し前に試したけどどのキーで動かすとかが微妙で、放置していた。
  2. my-lisp-indent-complete-symbol:インクリメンタルに補完して、補完した状況に応じて色々する。例えば、補完した後に括弧を閉じるかを判別し、どう考えても閉じた方がいい場合のみ閉じるとか、保管した文字列をlisp-paren-completeで調べさせて見るとか。しかし、出来が悪いので根本的な部分で色々不具合アリ。
  3. letが〜とか書いていた話は、色々動いてlispの中身とかをどれ位見れるのか試していたような感じ。一応昨日になっているのはreplace-letvar:letの変数を変更するときに使う。(let内部ので使われているほかの変数も変更する。変更候補の変数をポップアップするとかそんなくだらない機能。
  4. paren-starter:(を打つとmy-lisp-indent-complete-symbolが動くようにするもの。キー割り当てじゃないよ。
  5. paren-closer:直前のシンボルの引数を調べて引数がない場合は括弧を閉じる。my-lisp-indent-complete-symbolで補完した後とかに動かしている。

 書いていないので試していたのは、my-lisp-indent-complete-symbolで普通の補完後のspaceを打つか打たないかで動作するかを選ぶという感じとか、その辺はlisp-paren-completeにつける関数を自分で変えればいいかなぁとか、先に静的補完をさせるようにして、そちらが実行されれば、補完しないようにしたので問題があるなら自分で静的補完の所を書き換えてしまえば妙は動作はしないだろうかとか、そんな事を考えて試した。が、試してみると結構面倒。*2
注意点*3

■kakko-exを見て思ったこと
 それでkakko-exを見てて色々思ったのは、だったらキャレットより先(画面で言うと右側)の部分を調べて実行を判別するとかって言うのも意外といいかもとか思った。文字があるかないか程度を調べても意味がなさそうだけど、それプラスkakko-exのように括弧の数をチェックすれば書き途中か既に完成されたものを修正しているのかとか、ある程度判断できるんじゃないかと思ってみた。今の所思っただけだけど。

*1:根本的にはある程度何が書いてあるかとかチェックしないと駄目じゃないかと思ったりして、ローカル変数の書き換えをする機能を試してる時に、どれ位読んだり出来そうか試してみた幹事。昨日やって思ったのは、カーソル位置より一つくらい前を読んで調べる程度じゃ微妙な感じだって事。

*2:それは一時的にマウスが利かなくなってしまうので、書いていないけどmy-lisp-indent-complete-symbolとの跡にlisp-paren-completeを実行するようにしておけばそういう動作になる。

*3:取り合えず作っただけで、どれもまともに動かないと思ってまず間違いないです。