2005年6月23日の日記の1番目の記事へのコメント
■Emacsのvertical-motion
平日はいじらないぜヘイヘイとか言っておきながら,気になって仕方がなかったのでついいじっちゃいました.んで,先日書いた関数に早速バグ発見.ウィンドウの一番右端の半角幅のところにカーソル持ってって,そこで入力を開始し,プリエディットが全角になると禁則処理が発生してプリエディットの先頭が次の行に移ったりするわけですが,なぜか変換候補は画面の右の方に出てしまいます.手で計算する分には間違ったところに表示されるはずが無いのですが・・・.
全然わからないので関数の中身を少しずつばらして試していく内に,vertical-motion関数の動きがおかしいことがわかりました.で,さっそくググってみたら,この関数,Emacs-21系だとタブや行末の全角文字なんかがあるとちゃんと動かないみたいな話が・・・(;´Д`).あんじゃそりゃー.
確かに間にタブとか入ってると,(vertical-motion 0)で行頭に移動してくれなかったり,前の行の行頭に移動しちゃったりと,わけわからんです.で,何とかこれを回避する方法は無いかと探してみたところ,physical-line-modeなるのを発見.primeの小松さんが書いてるみたいです.入れて動かしてみたところ,すごいちゃんと動きます.超すげえ.
一体どんな秘密が!?と思ってソースを眺めてみたんですが,いまいちよくわかりませ・・・と思ったらコメントに
;; Emacs21 の vertical-motion は WIDE 文字とタブに未対応
;; Emacs21 で信頼できるのは「行頭での vertical-motion arg (> 0)」 のみ
なんて記述がッ!そうだったのかー.というわけで,いったん(beginning-of-line)で真の行頭に移動して,真の行頭から今のカーソル位置までの行数を数え,その上で真の行頭から引数の値大きくした(vertical-align)を発行するような自前vertical-alignを用意して無事解決.はじっこの方で候補出しても,おかしなことにならなくなりました.いやー,よかったよかった.とか思ってたらタイミングよくtkngさんに捕捉されてるし(;´Д`).これ,便利なのかもしれませんが,今の実装だとすさまじく重いので,あんま実用的じゃないです・・・.もっとチューニングしないと・・・.あとoverlayだかなんだかがまだうまく処理できてません.
[コメントを書く]
2005年6月23日の日記の1番目の記事へのコメント
[コメントを書く]