1. はじめemacsの仮名漢字変換がおバカで困った

 Xubuntu 24.04 を KINGJIM PORTABOOK XMC10へインストールして、LibreOfficeと Firefoxをいじって遊んだあと、みんな大好きemacsとmozcとfcitx5をインストールしました。

  $ sudo apt install emacs emacs-mozc emacs-mozc-bin fcitx5-mozc

 インストールされた emacs のバージョンは 29.3 (GTK+ Version 3.24.41) でした。とりあえずネットで検索して、mozc fcitx5 で emacs で仮名漢字変換できるようにしました。そのとき .emacs に何をどう書いたのか、試行錯誤している過程で、無くなってしまいましたが、仮名漢字変換非活性状態のときには U:--- 仮名漢字変換活性状態のときには AあU:--- とモードラインの最左端に表示されていました。

 emacs内で「すとれーじ」は「捨とれーじ」、「こんぴゅーた」は「込んぴゅーた」、と変換されました。これは性能とか変換効率というよりも異常だと思います。異常だと思う根拠は、ターミナルのコマンドラインや Xubuntu 24.04 プリインストールのテキストエディタMousepad内で仮名漢字変換する際には、「すとれーじ」は「ストレージ」に、「こんぴゅーた」は「コンピュータ」に一発で変換されるということです。emacs内でだけ異常でした。原因は .emacs の書き方に問題があったからでした。

2. 解決できた方法

.emacsのmozcに関する記述を下記の通りにした処、仮名漢字変換活性状態で  AあU:--- ではなくて  [Mozc]U:**-  と表示されるようになりました。

(add-to-list 'load-path "/usr/share/emacs/site-lisp/emacs-mozc")
(require 'mozc)
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)
(setq default-input-method "japanese-mozc")
(global-set-key [zenkaku-hankaku] 'toggle-input-method)

たぶん関係無いと思いますが .bashrc に下記を書いておきました。

export GTK_IM_MODULE=fcitx

export QT_IM_MODULE=fcitx

export XMODIFIERS="@im=fcitx"

以上で、emacs内でもターミナルのときと同様に「すとれーじ」は「ストレージ」に、「こんぴゅーた」は「コンピュータ」に一発で変換できるようになり解決しました。

 

Emacsでmozcの仮名漢字変換設定

3. 解決できなかった方法

3.1 効果無かった:辞書を追加

 Windows版MOZC?の辞書を入手するため手元にあるWindows11のPCへGoogle日本語入力をインストールしました。辞書が置かれるWindows内のディレクトリは、

  C:\Users\takay\AppData\LocalLow\Google\Google Japanese Input

です。そこにあったファイルは以下のとおりでした。

  boundary.db 80,012バイト

  cform.db 2,060バイト

  config1.db 5,720バイト

  segment.db 320,012バイト

  user_dictionary.db 502バイト 

 これらの .db ファイルを Xubuntu 24.04 環境下にて ~/.mozc ディレクトリを作成し置きました。mozc 及び fcitx5 を一旦停止させてから起動しなおしました。mozc のユーザ辞書編集機能を発動させますと、Windows11側で登録したユーザ辞書の内容が見られたので .mozc 下に置いたユーザ辞書を認識していると考えられます。但し、メイン辞書と思われる segment.db も認識しているのかどうかについては不明。

 emacsの側では、mozc.el を明示的に止めてあるのに、相変わらず、「すとれーじ」は「捨とれーじ」に「こんぴゅーた」は「込んぴゅーた」に変換される挙動はそのままで、変化ありませんでした。
 Copilotの説明によりますと、emacs は独自の mozc 変換エンジン及び独自の辞書を使う実装方法が採られている可能性があるらしい、しかも、エンジンが辞書を内蔵していて、外部ファイルではない可能性もあるらしい。

3.2 解決策にならない:ユーザ辞書への追加登録

 「ストレージ」及び「コンピュータ」を「すとれーじ」及び「こんぴゅーた」を読みとして mozc ユーザ辞書に辞書登録するという方法をCopilotが提案してくれましたが、あらゆる語彙において、このような異常変換が行われる状況では、果てしない登録作業が必要になる可能性が高いので、現実的ではなさそうでした。

4. 補遺1 (mozc.elの修正)

emacs起動時、ミニバッファに ../../usr/share/emacs/site-lisp/emacs-mozc/mozc.el: Warning: 'case' is an obsolete alias (as of 27.1); use 'cl-case' instead. という文言が一瞬現れます。文言は、caseは廃止されるので代わりにcl-caseを使えと言ってますのでcl-caseにしてよいcaseを置換してみました。

 

すると今度は、emacs起動時、ミニバッファに ../../usr/share/emacs/site-lisp/emacs-mozc/mozc.el: Warning: 'incf' is an obsolete alias (as of 27.1); use 'cl-incf' instead. という文言が一瞬現れます。文言は、incfは廃止されるので代わりにcl-incfを使えと言ってますのでcl-incfにしてよいincfを置換してみました。

 

すると今度は、emacs起動時、ミニバッファに ../../usr/share/emacs/site-lisp/emacs-mozc/mozc.el: Warning: Case 'kp-enter will match 'quote'. If that's intended, write (kp-enter quote) instead. Otherwise don't quote 'kp-enter'. という文言が一瞬現れます。文言は、case文において 'kp-enter は引用符で囲んでいるときと同様に扱われるので、それでよければ(kp-enter quote)と書き直せ。さもなくば、引用符で囲まないで 'kp-enter' とせよと言っていますが、なんだか小生には解らないので、Copilot に教えてもらったとおり 'kp-enter から ’ を削除して kp-enter にしました。

 

ちなみにCopilotの説明によりますと:Emacsのcase(または cl-case)では、シンボルを比較する際にクォート(')をつけると、意図しないマッチングが発生する可能性があり、kp-enter が 'kp-enter という形でクォートされている場合には、emacs が 「これは 'quote とも一致するとして処理するかもしれない」 と警告している状態なんだそうです。
 

まぁ、警告が一瞬表示されるだけのことなので、気にしなければいいだけなのですが、ここは、道楽ですから、この警告文言が出ないように mozc.el を修正します。

 

/usr/share/emacs/site-lisp/emacs-mozc/mozc.el を修正しました。

下に diff を記しておきます。

 

394c394
<     (let ((key (case basic-type
---
>     (let ((key (cl-case basic-type
398,428c398,428
<                  ('eisu-toggle 'eisu)
<                  ('hiragana-katakana 'kana)
<                  ('next 'pagedown)
<                  ('prior 'pageup)
<                  ('kp-decimal 'decimal)
<                  ('kp-0 'numpad0)
<                  ('kp-1 'numpad1)
<                  ('kp-2 'numpad2)
<                  ('kp-3 'numpad3)
<                  ('kp-4 'numpad4)
<                  ('kp-5 'numpad5)
<                  ('kp-6 'numpad6)
<                  ('kp-7 'numpad7)
<                  ('kp-8 'numpad8)
<                  ('kp-9 'numpad9)
<                  ('kp-delete 'delete)  ; .
<                  ('kp-insert 'insert)  ; 0
<                  ('kp-end 'end)        ; 1
<                  ('kp-down 'down)      ; 2
<                  ('kp-next 'pagedown)  ; 3
<                  ('kp-left 'left)      ; 4
<                  ('kp-begin 'clear)    ; 5
<                  ('kp-right 'right)    ; 6
<                  ('kp-home 'home)      ; 7
<                  ('kp-up 'up)          ; 8
<                  ('kp-prior 'pageup)   ; 9
<                  ('kp-add 'add)
<                  ('kp-subtract 'subtract)
<                  ('kp-multiply 'multiply)
<                  ('kp-divide 'divide)
<                  ('kp-enter 'enter)
---
>                  (eisu-toggle 'eisu)
>                  (hiragana-katakana 'kana)
>                  (next 'pagedown)
>                  (prior 'pageup)
>                  (kp-decimal 'decimal)
>                  (kp-0 'numpad0)
>                  (kp-1 'numpad1)
>                  (kp-2 'numpad2)
>                  (kp-3 'numpad3)
>                  (kp-4 'numpad4)
>                  (kp-5 'numpad5)
>                  (kp-6 'numpad6)
>                  (kp-7 'numpad7)
>                  (kp-8 'numpad8)
>                  (kp-9 'numpad9)
>                  (kp-delete 'delete)  ; .
>                  (kp-insert 'insert)  ; 0
>                  (kp-end 'end)        ; 1
>                  (kp-down 'down)      ; 2
>                  (kp-next 'pagedown)  ; 3
>                  (kp-left 'left)      ; 4
>                  (kp-begin 'clear)    ; 5
>                  (kp-right 'right)    ; 6
>                  (kp-home 'home)      ; 7
>                  (kp-up 'up)          ; 8
>                  (kp-prior 'pageup)   ; 9
>                  (kp-add 'add)
>                  (kp-subtract 'subtract)
>                  (kp-multiply 'multiply)
>                  (kp-divide 'divide)
>                  (kp-enter 'enter)
826c826
<                    (case (mozc-protobuf-get segment 'annotation)
---
>                    (cl-case (mozc-protobuf-get segment 'annotation)
1257c1257
<               (incf scrolled-lines))
---
>               (cl-incf scrolled-lines))
1643c1643
<     (case (process-status proc)
---
>     (cl-case (process-status proc)

​​​

5. 補遺2 (Package cl is deprecated)

emacs 27.1 以降で cl (シーエル) パッケージ(Common Lisp 互換ライブラリ)が非推奨になったことを示すため、起動時に Package cl is deprecated という文言がミニバッファに表示されるようになったんだそうです。もうわかったから非表示にしたいと思ったところちゃんとオマジナイがあるそうです。このオマジナイを .emacs に書いたら、起動時の Package cl is deprecated は現れなくなりました。小生は .emacs の先頭に書いておきました。


   (eval-when-compile (setq byte-compile-warnings '(cl-functions)))

 

emacsを起動したとき、mozc.el に関する警告も出ませんし、Package cl is deprecated という警告も出なくなり、落ち着きました。

 

補足:

以下の設定を ~/.emacs.d/early-init.el に書いておくのでも同様の効果が得られるそうです。

(setq byte-compile-warnings '(cl-functions))

 

6. 補遺3 (Windows11のWSLでemacs)

Windows11のノートパソコンでも、Microsoft StoreからWSLへUbuntuをダウンロードして使ってます。インストール当時バージョン 22.04 LTS でした。 apt upgrade したので、現在は、バージョン 22.04.5 LTS (Linux 6.6.87.2) になってます。Ubuntu のターミナルで apt install した GUI 版 emacs を使ってます。 emacs のバージョンは 27.1 (GTK+ Version 3.24.33) です。emacsで仮名漢字変換できるように mozc もインストールしてあります。

 

  $ sudo apt install emacs emacs-mozc emacs-mozc-bin

 

そして下記を ~/.emacs に書いてあります。

(load-file "/usr/share/emacs/site-lisp/emacs-mozc/mozc.el")
(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")

 

Ubuntu 22.04.5 LTS WSL2 emacs起動画面

ターミナル Ubuntu@WSL

 

バッファとミニバッファとの間にある1行の帯は、モードラインと呼ばれていますが、その最左端に、英語モードのときには U:**- 仮名漢字変換モードのときには [Mozc]U:**- と表示されます。

 

Emacsの起動画面とヘルプメニュー

 

emacs起動画面@Windows11 (WSL)

 

 

仮名漢字変換は、インラインで行われ、変換候補はカーソルの下にリスト表示というスタイルです。

 

Emacsで仮名漢字変換、「ストレージ容量」の表示

MOZC活性状態
 
Emacsで「ストレージ」と入力された画面
MOZC非活性状態
 
仮名漢字変換が普通に変換してくれるようになりました。