[Mac][Emacs] EmacsでMacのライブ変換とMozcをトグル切り替えて利用する
Macでは "El Capitan" 以降からライブ変換が利用できるようになりました。慣れの問題もあって使っていませんでしたが一度使い込んでみようかと思い有効にしてみました。まだ慣れが必要ですがぼちぼち利用開始した所です。
せっかく有効にしたので 「Emacsでもライブ変換を使ってみるか。。。」 というわけでEmacs環境にもライブ変換を組み込んでみました。この記事ではその辺りについての諸々です。
目次
概要
これまで、というか現在もEmacsではMozcを利用しています。今回はそのMozc利用環境に「Macのライブ変換」を組み込んでみます。具体的にはトグルで「IME OFF (英語入力)」-> 「Mozc 日本語入力ON」-> 「ライブ変換ON」という順序で切り替えます。
なおEmacsはMacport版を利用しておりバージョンは25.3.1です。
ライブ変換デモ
デモ動画を記録してみました。実際どんな感じで動くかというイメージです。
EmacsでMacの入力ソースリストを取得する
EmacsからMacの入力ソースのリストを取得するには "mac-input-source-list" function を利用します。例えばこんな感じです。
<span style="color: #FF516D;">(</span>mac-input-source-list<span style="color: #FF516D;">)</span> <span style="color: #FF516D; text-decoration: underline;">(</span><span style="color: #C2E982;">"com.apple.inputmethod.Kotoeri"</span> <span style="color: #C2E982;">"com.google.inputmethod.Japanese.base"</span> <span style="color: #C2E982;">"com.google.inputmethod.Japanese"</span> <span style="color: #C2E982;">"com.apple.inputmethod.Kotoeri.Roman"</span> <span style="color: #C2E982;">"com.apple.inputmethod.Kotoeri.Japanese"</span> <span style="color: #C2E982;">"com.apple.50onPaletteIM"</span> <span style="color: #C2E982;">"com.apple.KeyboardViewer"</span> <span style="color: #C2E982;">"com.apple.CharacterPaletteIM"</span> <span style="color: #C2E982;">"com.parallels.inputmethod.ParallelsIM"</span><span style="color: #FF516D;">)</span>
ことえりの英語入力が "com.apple.inputmethod.Kotoeri.Roman"
ことえりの日本語入力(ライブ変換)が "com.apple.inputmethod.Kotoeri.Japanese" です。
※ Macの日本語入力の現在の名称がよくわかりませんが、過去の流れで「ことえり」とします
ちなみにGoogle日本語入力はそれぞれ
"com.google.inputmethod.Japanese.Roman" "com.google.inputmethod.Japanese.base" です。
EmacsからMac側で現在選択されている入力ソースを取得する
EmacsからMac側で現在選択されている入力ソースを取得するには "mac-input-source" function を利用します。例えばMac側でライブ変換が有効になっている場合はこんな感じです。
<span style="color: #FF516D;">(</span>mac-input-source<span style="color: #FF516D;">)</span> <span style="color: #C2E982;">"com.apple.inputmethod.Kotoeri.Japanese"</span>
EmacsからMac側のIME状態を切り替える
EmacsからMac側のIME状態を切り替えるには "mac-select-input-source" function を利用します。例えば現在ことえりが英語入力だとして日本語入力(ライブ変換)に切り替えるにはこうします。
<span style="color: #FF516D;">(</span>mac-select-input-source <span style="color: #C2E982;">"com.apple.inputmethod.Kotoeri.Japanese"</span><span style="color: #FF516D;">)</span>
Emacs-Mozcに関しての情報
EmacsでMozcを利用している場合の情報をまとめます。
- toggle-input-methodが動作
- mac-input-sourceとは連動しない
M-x toggle-input-method (C-\)
Emacsでtoggle-input-methodを利用するには下記の条件が必要です。
- default-input-methodが定義されていて
- current-input-methodなどの値が取れれば
逆に取れなければ基本的には使えません。
mac-input-sourceとは連動しない
MozcはEmacs内で制御されており、OS側では制御されていません。その為 mac-input-source などとは連動しませんし制御できません。なお関連記事として以下があります。
EmacsでMozcとOS側のIMEの2つを制御する必要
というわけで感覚としては別個の2つのIMEが使えるイメージです。ただ2つそれぞれをうまく制御しないと入力エラーが頻発します。その為Mozcとライブ変換をトグルさせるには、OS側のIMEの切り替えとMozcの状態の2つをよしなに制御する必要があります。
my/toggle-input-method ()
ここまでの情報を元に、my/toggle-input-method を定義してみました。"C-\" で「IME OFF (英語入力)」-> 「Mozc 日本語入力ON」-> 「ライブ変換ON」の順にトグルします。アドバイスでデフォルトの "toggle-input-method" を置き換えていますが置き換えたくない場合はどこかのキーにバインドすれば良いかと思います。
<span style="color: #8c8c8c;">(</span><span style="color: #96CBFE;">defun</span> <span style="color: #FFD2A7;">my/toggle-input-method</span> <span style="color: #93a8c6;">()</span> <span style="color: #93a8c6;">(</span><span style="color: #96CBFE;">interactive</span><span style="color: #93a8c6;">)</span> <span style="color: #93a8c6;">(</span><span style="color: #96CBFE;">if</span> <span style="color: #b0b1a3;">(</span><span style="color: #96CBFE;">and</span> <span style="color: #97b098;">(</span>string-match <span style="color: #8AE234;">"\\.Roman$"</span> <span style="color: #aebed8;">(</span>mac-input-source<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span> <span style="color: #97b098;">(</span>not current-input-method<span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span> <span style="color: #7C7C7C;">;; </span><span style="color: #7C7C7C;">MacとEmacsのIMEが両方OFFならMOZC日本語へ </span> <span style="color: #7C7C7C;">;; </span><span style="color: #7C7C7C;">Mozc japancese </span> <span style="color: #b0b1a3;">(</span><span style="color: #96CBFE;">progn</span> <span style="color: #97b098;">(</span>mac-select-input-source <span style="color: #8AE234;">"com.google.inputmethod.Japanese.Roman"</span><span style="color: #97b098;">)</span> <span style="color: #97b098;">(</span>activate-input-method 'japanese-mozc<span style="color: #97b098;">)</span> <span style="color: #97b098;">(</span><span style="color: #96CBFE;">setq</span> curchg-default-cursor-color <span style="color: #8AE234;">"firebrick2"</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span> <span style="color: #b0b1a3;">(</span><span style="color: #96CBFE;">progn</span> <span style="color: #97b098;">(</span><span style="color: #96CBFE;">if</span> current-input-method <span style="color: #7C7C7C;">;; </span><span style="color: #7C7C7C;">Mac側はROMANでmozcがONの場合 </span> <span style="color: #7C7C7C;">;; </span><span style="color: #7C7C7C;">ライブ変換 </span> <span style="color: #aebed8;">(</span><span style="color: #96CBFE;">progn</span> <span style="color: #b0b0b3;">(</span>deactivate-input-method<span style="color: #b0b0b3;">)</span> <span style="color: #b0b0b3;">(</span>mac-select-input-source <span style="color: #8AE234;">"com.apple.inputmethod.Kotoeri.Japanese"</span><span style="color: #b0b0b3;">)</span> <span style="color: #b0b0b3;">(</span><span style="color: #96CBFE;">setq</span> curchg-default-cursor-color <span style="color: #8AE234;">"yellow"</span><span style="color: #b0b0b3;">)</span><span style="color: #aebed8;">)</span> <span style="color: #7C7C7C;">;; </span><span style="color: #7C7C7C;">Mozc roman </span> <span style="color: #aebed8;">(</span><span style="color: #96CBFE;">progn</span> <span style="color: #b0b0b3;">(</span>mac-select-input-source <span style="color: #8AE234;">"com.google.inputmethod.Japanese.Roman"</span><span style="color: #b0b0b3;">)</span> <span style="color: #b0b0b3;">(</span>deactivate-input-method<span style="color: #b0b0b3;">)</span> <span style="color: #b0b0b3;">(</span><span style="color: #96CBFE;">setq</span> curchg-default-cursor-color <span style="color: #8AE234;">"green3"</span><span style="color: #b0b0b3;">)</span> <span style="color: #b0b0b3;">(</span>set-cursor-color <span style="color: #8AE234;">"green3"</span><span style="color: #b0b0b3;">)</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span> <span style="color: #93a8c6;">)</span> <span style="color: #8c8c8c;">)</span>
追記: ことえりのローマ字入力では "C-'" のキーバインドが拾えないなどの問題があった為、Google日本語入力をmacOS側で使うように変更。
ライブ変換時のカーソル色を変える
上記でトグル切り替えはできるようになりました。しかし現在どのモードにいるか判別しづらいのでカーソル色で判別できるようにします。カーソル色はとりあえずこんな感じで。
- IME OFF -> 緑系
- MOZC ON -> 赤系
- ライブ変換ON -> 黄色
<s><span style="color: #546D7A;">;; </span><span style="color: #546D7A;">ライブ変換時のカーソル色を追加設定 </span><span style="color: #FF516D;">(</span><span style="color: #C792EA;">defun</span> <span style="color: #FF516D;">my/cursor-color-chg</span> <span style="color: #C792EA;">()</span> <span style="color: #C792EA;">(</span>set-cursor-color <span style="color: #D9F5DD;">(</span><span style="color: #C792EA;">if</span> <span style="color: #74CBC4;">(</span>string-match <span style="color: #C2E982;">"\\.Japanese$"</span> <span style="color: #FF516D;">(</span>mac-input-source<span style="color: #FF516D;">)</span><span style="color: #74CBC4;">)</span> <span style="color: #C2E982;">"Yellow"</span> <span style="color: #C2E982;">"deep sky blue"</span><span style="color: #D9F5DD;">)</span><span style="color: #C792EA;">)</span><span style="color: #FF516D;">)</span> <span style="color: #FF516D;">(</span>add-hook 'mac-selected-keyboard-input-source-change-hook 'my/cursor-color-chg<span style="color: #FF516D;">)</span> <span style="color: #FF516D;">(</span>add-hook 'input-method-activate-hook '<span style="color: #C792EA;">(</span>lambda <span style="color: #D9F5DD;">()</span> <span style="color: #D9F5DD;">(</span>set-cursor-color <span style="color: #C2E982;">"firebrick2"</span><span style="color: #D9F5DD;">)</span><span style="color: #C792EA;">)</span><span style="color: #FF516D;">)</span></s>
追記: カーソル色の変更処理は my/toggle-input-method に組み込みました。
minibufferに入る時はライブ変換を無効にする
M-x等でminibufferに入った時はライブ変換を無効にした方が良いかと思います。無効にしないと "M-x へlm−" といったタイプミスが起こる可能性があります。
<span style="color: #546D7A;">;; </span><span style="color: #546D7A;">minibufferに入る時はライブ変換は無効に </span><span style="color: #FF516D;">(</span><span style="color: #C792EA;">defun</span> <span style="color: #FF516D;">my/minibuffer-setup-hook</span> <span style="color: #C792EA;">()</span> <span style="color: #C792EA;">(</span>mac-select-input-source <span style="color: #C2E982;">"com.google.inputmethod.Japanese.Roman"</span><span style="color: #C792EA;">)</span><span style="color: #FF516D;">)</span>(add-hook 'minibuffer-setup-hook 'my/minibuffer-setup-hook)
cursor-color-chg.el を利用している場合
"cursor-color-chg.el" はカーソル色やカーソルの形状などをモードに合わせ切り替えられるパッケージです。もしこれを利用している場合は下記の設定も必要です。cursor-color-chg.el 側でのカーソル色の制御のみ無効にします。
<span style="color: #546D7A;">;; </span><span style="color: #546D7A;">カーソル色は制御しない </span><span style="color: #FF516D;">(</span><span style="color: #C792EA;">setq</span> curchg-change-cursor-on-input-method-flag nil<span style="color: #FF516D;">)</span>
Mac側の設定
最後に補足としてMac側の設定を箇条書きで記載しておきます。
入力ソースの設定
- [キーボード] -> [入力ソース] で日本語(ことえり)を追加
- 英語入力が重複するのでGoogle日本語入力の英語を削除
3.[キーボード] -> [ショートカット] -> [入力ソース]でIMEトグル切り替えのキーを設定。
ことえりの設定
- 「ライブ変換」にチェック
- 「Shiftキーの動作」を「ローマ字入力」に変更
- 「"¥"キーで入力する文字」を「\ (バックスラッシュ)」に変更
2と3はお好みで。
追記
この後ライブ変換はマイナーモード化して、必要に応じて切り替える形にしました。詳細は下記記事にて。