canna.el
に代わり、かん
なの日本語入力を input method として行うための canna-im.el
の
配布を始めました。よければお試しください。
廣瀬さんの「 Canna for GNU Emacs 29」への僅かな修正点を公開します。
emacs 29.2 のソースを入手したら、
「Canna
for GNU Emacs 29」で公開されている
emacs29.1-canna-20230730.diff.xz
を適用します(29.2 にもそ
のまま適用できます)。そうしたら、
configure を実行する前に
Download:
additional-patch-29.2.xz
(6580 bytes) [2024, 1/21]
のパッチを当ててください。
その後で普通に configure, make で基本的にいいのですが、その前にちょっ とコメントを加えておきます。
loadup.el
に対する
修正が含まれているのですが、そのうち後半はかんなに対する autoload の追
加処理です。私のパッチでより正統的な方法で実現する修正を
canna.el
に追加しましたので、loadup.el
に対す
るその部分の修正については、削除しても差し支えないはずです。canna.c
の KKCP 用互換関数は不要だと
思います(自分で意識して利用されてる方以外はこれに該当するはずです)。
そういう方は、configure 後 src/config.h
(あるいは
src/canna.c
そのもの)に #define WITHOUT_KKCP
を追加してから make してもよいでしょう。私の独自パッチの効能は以下の通りです。
canna-finalize
でかんなを終了する際の返り
値の処理に不備があり、warning があっても一切無視されていたのを修正
しました。返り値も、ドキュメント通りのものが正しく返るように修正し
てあります。nil
でないとき)が、C-u C-SPC などで
pop-buffer
系のコマンドが実行されていた場合はその動作は適切ではない
と思われるため、その場合は再変換領域を設定しないようにしました。(global-set-key [delete] 'delete-backward-char)
のようにして、その時点で有効な他の keymap に delete が
直接定義されていた場合は、 function key map によるそのキーの置換は
無効になってしまうため、delete がかんなで処理されなくなっ
てしまっていました。なお、これは実は delete に限った話
ではなく、tab や return などの、「文字端末上
だったら ASCII の control code を発するキー」はほぼすべて共通で、
これらが active keymap 上に直接定義されていた場合は、かんなでの処
理をすり抜けてしまっていました) [2012,
6/19] …と書きましたが、現状の canna.el
をよく
見てみると、canna-functional-insert-command
内の例外
処理によって、実はその問題はカバーされていたようにも見えます。この
件は私の早とちりだったかもしれません。After 0 kbd macro iterations: canna:functional-insert-command2: Keyboard macro terminated by a command ringing the bellという warning が出て しまっていたのを修正。(これは、C-SPC を押したときに、 keyboard macro として C-@ を実行するという動作だったた め。なお、backspace も keyboard macro で C-h を実行する動作だったので、潜在的には同じ問題がありましたが、かんな を普通に使っている場合は、C-h でかんなのエラーになる場 合というのはほとんど存在しないので、事実上 C-SPC に限ら れる問題でした)※ ひょっとしたら、この warning は昔の emacs では 出ていなかったのかも…。
set-mark-command
が出す)動的メッセー
ジに修正。characters.el
への修正も追加
しましたが、これはできあがった emacs の動作には影響を与えません
(これもかんなとは無関係な、emacs 本体の修正)。xmodmap
コマンドで適当なキーに割り当て
てください)。.canna
で設定しているその他の普通のキー
も)、単に日本語入力モードをオンにするだけでは働かなくって、フェ
ンスモードに入ったときだけしか有効になりません。フェンスモード
に入る前に有効化するのは難しいですし、Emacs のもともとのキー操作とぶ
つかってしまって困ると思います。がんばればその辺りも何とかなるかもしれませ
んが、それほど需要が高いとも思えませんし、そのために努力を傾けるよりも
別のことに注力した方がよいでしょう。.emacs
のかんなの初期化を行った後の所で、
のようにして、フェンスモードでのエスケープキーへのキーバインドを解除 しておく必要があります(そうすることによって、 function-key-map が有効となり、ファンクションキーの発生 するエスケープシークエンスが特殊キーとして再解釈されるようになる)。 このため、文字端末上では特殊キーとエスケープキーの両方にかんなの 機能を割り当てることはできません。二者択一となります(なので、例 えば ATOK の動作を kterm 上で忠実に再現することはできませ ん)。※ エスケープキーの処理をうんと特殊にすれば、両立も可能となるかもし れませんが…。[2012, 5/18] また、Emacs 23 からは、1つの Emacs が文字端末上でも window system 上でも同時に動くこ とも可能になったので、こういうwindow-system の値にもとづく 使い分けは厳密にはできなくなっている…という新たな問題があります。(when (not window-system) (define-key canna-mode-map "\e" nil) (define-key canna-minibuffer-mode-map "\e" nil))
ファンクションキーが有効になった結果の副作用として、かんなの日本語入
力処理が止まり、何を入力してもウンともスンとも言わなくなってしまうことが
あります。解決法は後述しますが、具体的な症状は「.canna
で
romaji-yuusen が t
になっている場合、ローマ字入
力の段階で "n" が未確定の状態のとき、『無変換』キー
をうっかり押してしまうと、"n" が『ん』に変化した状
態で表示が固まってしまい、以後その emacs セッション内ではかんなが無反応
となる(canna lib に処理を渡すような、通常キーの入力は全滅)」というもの
です。
この状態になってしまった場合は、M-x canna-reset を実行すれ ば復旧できます(X window 下では、大抵 Alt キーが Meta キーとして使えるの で、Meta-x は emacs に渡すことができ入力可能。文字端末(tty) 環境下では、ESC が canna に渡ってしまう場合は強制終了するしか 手がないかもしれません…)。
これはかんな側のバグらしく、開発元に連絡した所、 修正パッチを作って頂けました(ただ、これはまだ暫定的な修正だったらし く、その後 CVS に投入された変更はもっと多岐に渡っているようです。きちん と直したい方は CVS から開発版を導入してください)。
なお、数年前から私は emcws の canna.el
はまったく使っ
ておりません。Emacs Lisp 側のインターフェースは、canna.el
を改造してかんな/Emacs を input method 化したものを使っていま
す(未公開
[2012, 5/18]
試験的に公開を始めてみました)。
ですので、上記の canna.el
には何か重大なバグがあるかもしれません。ご了承ください。
かんなの標準では、日本語入力モードのオン・オフは C-o に 割り当てられています。が、もともと Emacs では C-o は空行を 発生させるキー操作で私はよく使いますし、か んなの前は最初は Tamago を使っていたということもあって、Tamago と同 じ C-\ を日本語入力モードのオン・オフに割り当てています。
同じことを感じる人も多いらしく、web page にはよくその方法の説明があ るのですが、ほとんどは
というアドバイスになっているようです(例えば FreeBSD Q&A 578 など)。.emacs
に
(global-set-key "\C-\\" 'canna-toggle-japanese-mode)
と書け
しかし、これでは C-o が相変わらず日本語入力の切り替えに乗っ
取られたままで、それを元に戻す設定を付け加えなくてはなりません。また、
日本語入力の切り替えキーが他のかんなクライアントと違ってしまうことにな
り、「かんなのキー操作の統一性」(下記参照)からすると望ましいとは言え
ません。ここは、かんな/Emacs の info(注)
(mule 2.3 には最初からついているはずです。
Emacs 20 以降は、emcws と同じ所から mule-2.3-19.34-info.tar.gz が取れ
るでしょう)に従って、かんな側の設定として
のがよいでしょう。こうすれば、かんな/Emacs を起動して cannaserver との 接続が行われたときに、自動的に C-\ の方に日本語入力モードの オン・オフが設定されます(なお、.canna
に(global-unbind-key-function 'japanese-mode) (global-set-key "\C-\" 'japanese-mode)と書いておく
.emacs
(Emacs Lisp)では
C-\ のことを "\C-\\"
で表しますが、
.canna
(canlisp)では "\C-\"
で表します。
これが明記してある文書は、私には
Canlispマニュア
ル以外には見つけられませんでした)。
Mule 2.3 付属のものや、mule-2.3-19.34-info.tar.gz に含まれているも のは(なぜか)ちょっとバージョンが古いようです。 mule-2.3-19.34-man.tar.gz に含まれている texinfo ファイルから info ファイルを生成し直した方がよいでしょう。
生成するには、texinfo ファイルを emacs で読み込んで、M-x texinfo-format-buffer…だったかな?
上述の info 中では、「マルやテンなど、確定文字列が1文字だけのときは アンドゥ(再変換)の対象にせず、その直前に確定した(もっと長い)文字列を アンドゥ(再変換)の対象に保ったままにする」ために、 canna-save-undo-text-predicate を利用したカスタマイズのやり方 が紹介されています。が、そこの記述は、NEmacs 時代の、日本語が内部コード で 2 バイトで表現されている時代のもので、「確定文字列の長さ(バイト数) が 2 よりも大きいか否か」で判断を行っていたため、現状では意図する動作と 若干違ってきてしまっています。
emacs 20 の途中から、length 関数は「バイト数」ではなく「文字数」を返 すようになった(日本語などの多バイト文字でも、1文字は1文字とカウントす る)ので、現状ではここは
(setq canna-save-undo-text-predicate
(lambda (s)
(> (length (car s)) 1) ))
のように、「確定文字列の長さ(文字数)が 1 よりも大きいか否か」で判断するのが正しいカスタマイズとなります(2 の ままだと、マルやテンだけでなく、ちょうど2文字の文字列を確定させたと きも、アンドゥ(再変換)の対象にならなくなる)。
なお、現状では lambda の先頭に「'
」を付ける必要はなくなっ
ているので、それも取り除いてあります。
私はプログラミングについてはずぶの素人ですから、まずい点、 アホな点が一杯あるかもしれません。このページの内容は完全に無保 証です。くれぐれも、鵜呑みになさらないようお気をつけください。