SVX日記
2007-12-20(Thu) Emacs + IIIMECF + ATOK X3 = 結構シアワセ
と、いうのも、オイラはブラインドタッチを習得すると同時に、カーソルキーやファンクションキー等の特殊キーとは訣別しているからである。思えば、ブラインドタッチを習得したのは、オイラが某務員だった頃、職場で一太郎V4をイヤイヤ使っていた頃だ。つまり、何が言いたいかというと、文節の調整、ひらがなカタカナ変換等、すべてコントロールキーによる操作でなければ、思考の流れが中断されてしまい、ATOKによる少々の変換効率の向上などは、全くの無価値になってしまうほど、生産性が落ちてしまうのである。
IIIMECFではデフォルトでこれらのキーが使えない。しかし、チョイチョイとイジればどうにかなりそうな気配を感じさせつつ、そこはそれLISPの文法を知らないオイラには、その小改造が非常に高い壁となってそびえるのである。
wbel4-co:/root/atok_install/iiimecf # vi lisp/iiimcf.el
wbel4-co:/root/atok_install/iiimecf # diff -c lisp/iiimcf.el.org lisp/iiimcf.el
*** lisp/iiimcf.el.org 2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf.el 2007-12-23 03:33:55.000000000 +0900
***************
*** 284,289 ****
--- 284,302 ----
(defvar iiimcf-keycode-spec-alist
`((13 10 0)
+
+ (11 37 65535) ; Ctrl + k
+ (12 39 65535) ; Ctrl + l
+ (14 40 65535) ; Ctrl + n
+
+ (21 117 65535) ; Ctrl + u
+ (9 118 65535) ; Ctrl + i
+ (15 119 65535) ; Ctrl + o
+ (16 120 65535) ; Ctrl + p
+
+ (2 38 65535) ; Ctrl + b
+ (7 27 65535) ; Ctrl + g
+
(32 32)
,@(mapcar #'(lambda (x) (list x x 0))
(iiimcf-numseq 1 31))
wbel4-co:/root/atok_install/iiimecf # emacs -q --no-site-file -batch -l iiimcf-comp.el; cp lisp/* /usr/share/emacs/site-lisp/iiimecf
結局、これも書いてみれば、なんということはない修正だが、これまたかなり地獄を這いずり回った成果である。本当はCtrl+nは文節確定ではなく、次文節にしたいところだし、Ctrl+gでなくESCで変換状態解除→IME解除という動作、つまりはイヤイヤながら体に染みついてしまったMS-IMEと同じ動作をさせたいところであるが、とりあえず、LISPを読めないオイラには上記の改造が限度である。
だが、上記の設定が成功したトコロで、別の致命的な問題に突き当たってしまった。それは、IMEがオンの状態だと、半角スペースが入力できないという問題である。ここはShift+SpaceでIMEをスルーして半角スペースを入力できなければならない。特に、仕事で書くメールは等幅フォントでの読みやすさに配慮して、基本的に英単語の前後には半角スペースを置くことが慣例となっている。これまた、改善できないようだと、イチイチIMEを上げ下げする必要が生じ、やっぱり使い物にならない。
だが、この問題には心底疲弊させられた。何をやってもウンともスンともいわない。結局、あまりにも地獄から抜け出せないので、心を少々閻魔様に売り渡してしまった。LISP自体について、少々学び始めてしまったのである。オー、マイガー。
しかし、LISPを学んで、如何にコードを読めど、解決できない。Spaceキーは検知するのだが、どうしてもShiftキーと同時に押しているというコトを検知してくれない。せっかく、信念を曲げてまでLISPを学び始めたのに、この問題が解決できないとなれば、LISPの文法をストアしてしまった左脳の一部はどうすればいいんだ。無駄だ。無駄すぎる。歯磨きのCMで覚えてしまった、グリチルリチン酸ジカリウムという物質を覚えている以上に無駄だ。北京原人の本名であるシナントロプスペキネンシスという学名と一緒に単に捨ててしまいたい記憶に成り下がってしまうのか……。
……と、そこでフト気づいた。オイラはTERATERM上から作業をしているが、実際にどんなキーが飛んでいるのか? Shiftを併用しているのだから、大文字のSpace……が飛ぶワケはないッ!! そこで、わざわざssh接続をtelnet接続に切り替えて、tcpdumpを取ってモニタしてみた……変わってねぇ!! そもそも、端末からShiftが飛んでねぇんじゃん!!
こりゃ、まずはTERATERMをどうにかする必要があるってコトだ。TERATERMのマニュアルを読むと、イニシエのVT100互換の動作をさせるためなのか、特殊キーはすべてカスタマイズ可能になっているようだ。TERATERMはWindows上のどのようなキーの組み合わせも(Fnほか一部のキーは無理だが)、変換テーブルを経由して、接続相手に渡すことができる。それならばShift+Spaceを、いったん使用頻度の低い無関係のキーに割り振って、Emacs側でそれを検知すればいいんじゃねぇか?
SUZAKU:/cygdrive/c/Program Files/TTERMPRO $ diff KEYBOARD.CNF.org KEYBOARD.CNF
78,81c78,81
< ;F11 key
< F11=87
< ;F12 key
< F12=88
---
> ;F11 key (Ctrl + Henkan)
> F11=1145
> ;F12 key (Shift + Space)
> F12=569
ついでに、Ctrlキー+変換キーについても定義してみた。先まで、IMEのオンオフに便宜的にCtrl+qを割り当てていたが、やっぱりコレには変換キーを使いたい。んが、MS-IMEとは独立して利用したいので、Ctrl修飾を入れるのだ。これは、Ctrl+XF1でASKをオンオフするX68000とも少し似ているが、当然ながら、それは偶然ではない。なお、使用頻度の低いキーとしては、F11とF12を選択した。パンピーの中には、Shift+←/→で文節変換をしたい人も多いだろうが、これと同じ方法で可能だろう。
wbel4-co:/root/atok_install/iiimecf # diff -c lisp/iiimcf-sc.el.org lisp/iiimcf-sc.el
*** lisp/iiimcf-sc.el.org 2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf-sc.el 2007-12-23 03:33:00.000000000 +0900
***************
*** 148,153 ****
--- 148,154 ----
(define-key map "\C-c\C-\\\C-i" 'iiimcf-server-control-change-input-method)
(define-key map "\C-c\C-\\\C-s" 'iiimcf-server-control-switch-le)
(define-key map "\C-c\C-\\\C-k" 'iiimcf-server-control-switch-keyboard)
+ (define-key map `[f12] 'iiimcf-server-control-keyforward)
map))
;; keymap for preedit state
wbel4-co:/root/atok_install/iiimecf # diff -c lisp/iiimcf.el.org lisp/iiimcf.el
*** lisp/iiimcf.el.org 2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf.el 2007-12-23 03:37:06.000000000 +0900
***************
*** 548,553 ****
--- 561,567 ----
kmod (logior kmod
(or (nth 3 slot) 0))))
(if (and (null kcode) (numberp kchar)) (setq kcode 0))
+ (if (eq kcode 123) (setq kcode 32 kmod 1))
(if (numberp kcode)
(list (cons 0 kcode)
(cons 0 kchar)