SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|

2008-07-23(Wed) Fedora9、iiimecfチューン

  つーわけで、emacsである。オイラのemacsとの付き合いは電脳倶楽部から始まった……と、一見意味不明ながら、これでピンときてしまう、オイラと同じ「その筋」な人は決して少なくないに違いないと思うので、あえて説明は略す。

  言うまでもなく、emacsは至高の環境である。んが、ガンガンと日本語を打つには、チューンが必須である。そもそも、ATOKを導入しておきながら、emacsからロクに使えないのは罪である。

  そりゃ、別にemacs上でフツーにATOKを起動したって日本語は打てる。んが、その場合、2ストロークキーを使う際、イチイチATOKをオフにする必要が生じ、実質、使い物にならない。キーボードの上に何層にもバラ撒いてある大量の機能を体で使いこなしてこそemacsを使う価値がある。決してマウスなんかでメニューを触わってはイカんのである。

  ここは、emacsに備わっているIMインタフェイスに、直接ATOKを接続しなくてはならない。そして、そのためのiiimecfである。

  iiimecfに関しては、以前にTERATERM環境から快適に使えるよう、いろいろチューンした経緯がある。今回はそれを下敷きにしつつ、もう少し向こう側まで、細かいチューンを進める。

  まずは、iiimecfをダウンロード。前回は0.73を導入し、その環境は現在も現役であるが、今回は、いくつかの不具合が修正されている0.75を利用させてもらう。まずは展開。

# tar xvfz IIIMECF-0.75.tar.gz
# cd iiimecf

  先のチューンの成果を導入する。

diff -c lisp.org/iiimcf.el lisp/iiimcf.el
*** lisp.org/iiimcf.el	2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf.el	2008-06-05 12:54:41.000000000 +0900
***************
*** 284,289 ****
--- 284,305 ----
  
  (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
+ 	(6 32 65535)	; Ctrl + f
+ 	(7 27 65535)	; Ctrl + g
+ 
+ 	(1 36 65535)	; Ctrl + a
+ 
      (32 32)
      ,@(mapcar #'(lambda (x) (list x x 0))
  	      (iiimcf-numseq 1 31))

  前回よりちょっとだけ増えている気がするのは、気のせいではない。では、改めてバイトコンパイルする。

# emacs -q --no-site-file -batch -l iiimcf-comp.el

  emacs-22.2-4.fc9だと、多少、コンパイルエラーが出るが、私が使った限りでは、特に問題は出ていない。そのままインストール。

# mkdir /usr/share/emacs/site-lisp/iiimecf
# cp lisp/* /usr/share/emacs/site-lisp/iiimecf

  個人設定である「.emacs」に設定を加える。

;; .emacs
 
;;; uncomment this line to disable loading of "default.el" at startup
;; (setq inhibit-default-init t)
 
;; enable visual feedback on selections
;(setq transient-mark-mode t)
 
;; default to better frame titles
(setq frame-title-format
      (concat  "%b - emacs@" (system-name)))
 
;; default to unified diffs
(setq diff-switches "-u")
 
;; always end a file with a newline
;(setq require-final-newline 'query)
 
;;; uncomment for CJK utf-8 support for non-Asian users
;; (require 'un-define)
 
(global-set-key "\C-h" 'delete-backward-char)
(global-set-key "\C-z" 'scroll-down)
(global-set-key "\C-u" 'undo)
(global-set-key "\C-]" 'call-last-kbd-macro)
 
(menu-bar-mode nil)
(column-number-mode t)
(setq blink-matching-paren nil)
 
(setq default-tab-width 4)
(setq default-fill-column 64)
(setq text-mode-hook 'turn-on-auto-fill)
 
(setq make-backup-files nil)
(setq auto-save-default nil)
 
;; ATOK X3 for Linux
(setq iiimcf-server-control-hostlist '("unix:/tmp/.iiim-mitsu/:0.0"))
(require 'iiimcf-sc)
(setq iiimcf-server-control-default-language "ja")
(setq iiimcf-server-control-default-input-method "atokx3")
(setq default-input-method 'iiim-server-control)
(define-key global-map "\C-j" (lambda ()
    (interactive)
    (if current-input-method (inactivate-input-method))
    (toggle-input-method)))
(define-key global-map "\C-o" (lambda ()
    (interactive)
    (inactivate-input-method)))
(setq iiimcf-UI-input-method-title-format "<ATOK:%s>")
(setq iiimcf-UI-preedit-use-face-p "window-system")

  前回との差は、IMの起動キーを「Ctrl+J」でオン「Ctrl+O」でオフに変更したこと。結局「変換」で通常のATOKのオン/オフ、「Ctrl+変換」でemacsのATOKのオン/オフ、などとやってると、なまじ操作が近い分、混乱を招くだけであった。そこで、思い切って、オンとオフのキーを分離し、指の方を慣らすことにした。

  それと、TCPでなく、既存のunixドメインソケット経由でiiimdに接続するようにした。これで、別途iiimdを立ち上げる必要がなくなった。

  また、preedit-use-face-pにwindow-systemを与えた。これをすると、変換中の状態が色で表示されるようになり、断然見やすい。これはTERATERM経由でも有効だ。

  んが、イザ使い始めると問題発生。全角の記号である「■★…」等が半角扱いになって表示が乱れてしまう。表示上の問題だけであれば、何とか我慢できないこともないが、この文字を出そうとするとiiimecfがコケてしまうからキツい……■だぁって使いたいぃ〜、●もぉ出したいぃ〜、きらっ★ 流星にぃ〜♪……てな感じで打てなければ戦争が終わらない。

  どうも、emacs22からはMule-UCSというUTF8を扱うモジュールが不要になり、代わりに内蔵のutf-translate-cjkというモジュールを使うようになっており、それで起動が速くなった反面、微妙な動作の違いが問題として表面化しているということらしい。

  結論から言うと、以下の設定を.emacsに追加すればいいらしい。出典はココ

(utf-translate-cjk-set-unicode-range
   '((#x00a2 . #x00a3) ; 
     (#x00a7 . #x00a8) ; 
     (#x00ac . #x00ac) ; 
     (#x00b0 . #x00b1) ; 
     (#x00b4 . #x00b4) ; 
     (#x00b6 . #x00b6) ; 
     (#x00d7 . #x00d7) ; 
     (#X00f7 . #x00f7) ; 
     (#x0370 . #x03ff) ; Greek and Coptic
     (#x0400 . #x04FF) ; Cyrillic
     (#x2000 . #x206F) ; General Punctuation
     (#x2100 . #x214F) ; Letterlike Symbols
     (#x2190 . #x21FF) ; Arrows
     (#x2200 . #x22FF) ; Mathematical Operators
     (#x2300 . #x23FF) ; Miscellaneous Technical
     (#x2500 . #x257F) ; Box Drawing
     (#x25A0 . #x25FF) ; Geometric Shapes
     (#x2600 . #x26FF) ; Miscellaneous Symbols
     (#x2e80 . #xd7a3) (#xff00 . #xffef)))

  これでほとんどの記号が問題なく扱えるようになる。一部ダメだった記号があったような気もするが、忘れた。忘れる程度の記号ということなので問題ない。たぶん。

  と、記号の問題が片づいたところで、ラスボスの登場である。それは、IMがオンの状態だと、Shift+Spaceで半角スペースが打てないという問題。

  ブログ等、ブラウザでは基本的にプロポーショナルなフォントで文章を読むので大きな問題はないが、メール等では閲覧環境が等幅であることも少なくなく(我がmaveもそうだ)、その場合の読みやすさに配慮して、オイラは半角英単語の左右には半角スペースを入れることにしている。んが、IMをオフにしないと半角スペースが打てない環境だとすると、これはやってられないほど面倒である。個人的には大問題だ。

  前回はTERATERMとiiimecfの両方の改造によって、どうにかこの動作を実現したが、今回はどうしてもダメ。相当の時間、iiimecfのソースをイジっては、試行錯誤を繰り返したのだが、ニッチもサッチもどころか、ヨッチもゴッチも(以下略)いかないったらない。

  結局、またもやオープンソースの強みを発動してしまった。やや、究極の手段だが「作者の方に相談する」である。状況を説明し、どうにかヒントだけでも、とお願いしたところ、結局、ズバリの修正方法を教えてもらってしまった。方法は以下。

diff -c lisp.org/iiimcf.el lisp/iiimcf.el
*** lisp.org/iiimcf.el	2007-12-09 08:54:54.000000000 +0900
--- lisp/iiimcf.el	2008-06-05 12:54:41.000000000 +0900
***************
*** 565,570 ****
--- 581,587 ----
  	 (char (logior (lsh (car kchar) 16)
  		       (cdr kchar)))
  	 key)
+     (if (and (= 1 mod) (= char 32)) (setq kmod '(0 . 0)))
      (cond ((/= (car kcode) 0) nil)
  	  ((setq key (iiimcf-iiim-keycode-pre-translate
  		      (cdr kcode)))

  でもって、.emacsに以下を追加。

(global-set-key [?\S- ] 'iiimcf-server-control-keyforward)

  作者の方によると、実装方法としてあまり美しくないということで、本家の開発ツリーにはこのパッチは取り込まれない可能性があるそうだ。いうなれば「iiimecf先生のパッチが読めるのはSVX日記だけ!!」という状態といえよう。うっしっし。

  ただし、これにはまだ続きがある。言ってなかったが、オイラはemacsを-nw付きで常用している。つまり「別にGUIウィンドウを開く」のではなく「端末画面内にそのまま表示」させているのである。これで何か問題があるかというと、実はかなりの問題があって……

  Shiftキーが押されていることがemacsに伝わりゃしねぇ

  ……のであった。これでは、如何にiiimecf側で対処してもらっても、どうすることもできない。当初は、どうにかShiftの押下を伝える方法があるのではないか、と軽く考えていたのだが、どうやらどうにも無理らしい。

  こーなると、emacs -nwを使うのをアキらめるしかない。これに関して言えば、決して「GUIウィンドウで使う」にヤブサカでないのだが……

  なんじゃこのまるっちいフォントは!?

  ……やっぱ、ヤブサカっすわ。フォントが複数使えるエディタは「マルチフォントエディタ」だが、これじゃ「まるっちいフォントエディタ」である。そもそもオイラは、アンチエイリアスフォントが今ほど一般的でなかった頃からの、筋金入りのOsakaアンチエイリアンである。今さら、ビットマッピンガーには戻れないのだ。決して。

  emacsの「伝統を大事にした実装」は素晴らしいと思うが、反面、UTF8といい、フォントといい、取り込むタイミングがちょっと後手に回っている感じだよなぁ……

  ……などと、ボヤくヒマがあったら、情報収集だ。同じコトを考えているヤツは大抵いるハズなのだ……と、あったッ!! XftGnuEmacsだ。

  というわけで、次回はFedora9、××チューン最終回である。