trr.el のwrapper

稲村さんと加藤さんバージョンのtrr.elを使用している。 新しいEmacs用とかスコアアップデートを確実にとか、ちょこちょこ 修正して使っているのだが、今年からX環境のEmacsでtrrをやらせたところ、 間違ってスペースの隣の変換キーやら片仮名キーをおしたときに (read-char) がエラーを起こしてそのまま trr 関数の評価が 途絶えてしまうという問題が頻発するようになった。 去年まではWindowsでTeraterm経由でemacs -nwしてたのでそもそも変換キーとか が (read-char) に渡らなくて問題が出なかった。

うむ、どないしょ。最近ならパッチを作るより、defadvice だよなあと、 manをみて、こんな感じかな。

trrwrap.el

(defun TRR:read-char (&rest args)
  (let ((ch (apply 'read-event args)))
    (cond
     ((char-valid-p ch) nil)
     ((eq 'return ch) (setq ch ?\C-m))
     (t (setq ch ? )))
    ch))

(defadvice trr (around trr-advice)
  "Skip non-character event.  Replace them to space."
  (let ((rf (symbol-function 'read-char)))
    (unwind-protect
	(progn
	  (fset 'read-char 'TRR:read-char)
	  ad-do-it)
      (fset 'read-char rf))))

(ad-activate 'trr)
(load "trr" t)

startupファイルの方(うちでは $EMACS/site-lisp/site-start.el) に

;;(autoload 'trr "trr" "Type Trainer" t)
(autoload 'trr "trrwrap" "Type Trainer" t)

で完了。おお、これで突然trrが終わっちゃう問題が消えた。そして、 スペースを押すべき時に、SHIFTを押したままにしてS-SPCに なっちゃったのが、この修正でSPCとして入って行くから快適になった。 もっと早くこうすればよかったねぇ。やっぱEmacs-Lisp楽だ。