ujimushiの日記: T-code's night 第四夜 「いつでも君だけを(たとえ二番目や三番目がいても)」 疑惑のtc-complete
tc.elにはtc-completeという補完機能があるのですが,不満に思うところもあって最近は使っていません。
自分が思う不満点は次の通りです。
- 補完用辞書に先頭の部分が重複しているフレーズを登録していると上側にあるものしか表示されない。
- よく分からないが,何故か変なタイミングでお亡くなりになっている。
例えば次のような感じで
ダメよ~
ダメダメ
と辞書(complete.dic)に登録しておいて「ダメ」まで入力すると,
ダメ>よ~<
しか表示されません。本当ならtcode-complete-max-candidate-countの数(デフォルトでは3) までは表示されてもおかしくないと思うのですが。 ここで「M-RET」を入力して「ダメよ~」と補完するのは可能となっています。 つまり,先頭の重複登録が無ければ今のままでも十分動作します。
ここでヘルプに「二つ目の候補を選択するには,M-2 M-RETを入力」とあるので,二つ目の候補の 表示はないものの強引に入力してみると
ダメダメダメダメ
ギャー となって,ダメ感が四倍。tc-completeの正常動作がどんなものかよく分からないので 本当はどうなのかよく分からないのですが,「ダメダメ」って表示されて欲しいですよね。
まがいなりにも「ダメダメ」っぽいものが,とある捜査操作によって出力されるということは, 言ってみれば裏では第二第三の候補がいる浮気状態。 他にも候補がいるなら男らしく(?)はっきりさせて欲しいですよね。
そこで浮気調査…いやいや,少しtc-complete.elを探索してみます。
まず,tc-complete.elがロードされると 一番下の方のprovideする直前に,post-command-hookにtcode-complete-display-functionをhookしている ようです。 Emacsの内部で何らかのコマンドが実行された後に毎回tcode-complete-display-function が呼び出されているようです。
tcode-complete-display-functionはtcode入力がONならほにゃららしてから tcode-complete-delay秒待った後tcode-complete-displayが呼ばれるみたいです。
tcode-complete-displayは何をやっているかというと, candidates に(tcode-complete-search-candidate(tcode-complete-scan-backward)) の結果を入れてほにゃらら,補完の候補に関する情報をtcode-complete-candidate-listに入れてるらしい。 途中のほにゃららでは,tcode-complete-max-candidate-countや, tcode-complete-min-context-lengthの値でtcode-complete-candidate-listに 入れるかどうか制限をかけてるっぽいです。
そして,候補があったら(あとミニバッファじゃなかったら),tcode-overlay-message関数で (tcode-complete-make-candidate-list-string prefix real-candidate-list) した文字列を表示しているらしい。
まとめると,
- 候補を見つけるのは(tcode-complete-search-candidate(tcode-complete-scan-backward))
- 表示する文字列を作るのは(tcode-complete-make-candidate-list-string prefix real-candidate-list)
- 表示するのは(tcode-overlay-message 表示文字列)
でおかしくなる条件を文字列を色々入力して探ってみると,
- tcode-complete-mazegaki-prefix-lengthやtcode-complete-min-context-lengthを短めに設定し,
- 「どうぞ」と入力する
とエラーが再現することが分かりました。 M-x describe-variablesなどで,tcode-complete-candidate-list を確認すると
((255 . “どうぞ”) “銅像”)
のような感じとなり,mazegaki.dicから「どうぞ(う)→銅像」の候補を拾ってきたけれど, prefix(どうぞ)よりも候補(銅像)の長さが短い時に頻発するらしい。
なお,前述のダメダメな例で,tcode-complete-candidate-listの内容を確認すると
((333 . “ダメ”) “ダメよ~” “ダメダメ”)
となっていて,complete.dicから候補を見つけるところまではうまくいっているらしいです。
色々直らないか試してみようと思ったけれど,あまり悩んでも仕方が無いので表示だけ何か別の方法を考えてみることにします。(実際は色々直らないか試してみた)
そこで見つけたのは,auto-complete-mode。今風な見た目で,候補が多くても表示の方は 対応できそうです。
これを使って表示できるよう,茨の道に進んでみたいと思います。
そう。美しいものには刺がある(!?)
T-code's night 第四夜 「いつでも君だけを(たとえ二番目や三番目がいても)」 疑惑のtc-complete More ログイン