Emacsを使っているとき、IMEを切り替え忘れて、C-x C-o をしたいのに、C-x C-おと入力することがある。
この問題を解決するために、Emacs 内部で動作する DDSKK を導入した。
この記事では、macOS を前提に、DDSKK の設定と OS の IME との共存環境を構築する方法を紹介する。
DDSKKとは
Emacs の内部で動作するマイナーモードだ。Emacs はまずキーバインドの解決を行い、マッチしなかった入力だけがテキスト挿入として処理される。DDSKK が変換を行うのはこのテキスト挿入の段階だけだ。
つまり、DDSKK が日本語モードであっても、C-x C-o や C-x C-f はそのまま Emacs のコマンドとして動作する。
セットアップ
まずは DDSKK のパッケージをインストールする。
(use-package ddskk
:ensure t
:bind ("C-x C-j" . skk-mode))
サンプルコードでは、C-x C-j で SKK が起動する。
辞書の準備
DDSKK は辞書がないとほぼ機能しない。標準辞書である L 辞書(SKK-JISYO.L)を skk-dev/dict から取得し、Emacs から参照する場所(例: ~/.emacs.d/dict/)に置く。
mkdir -p ~/.emacs.d/dict
curl -o ~/.emacs.d/dict/SKK-JISYO.L \
https://raw.githubusercontent.com/skk-dev/dict/master/SKK-JISYO.L
置いたパスは、次の設定で skk-large-jisyo に指定する。
設定
先ほど use-package ddskk した箇所に、L 辞書のパスを追記する。
サンプルコードでは、あわせて他の設定も追記している。
(use-package ddskk
:ensure t
:bind ("C-x C-j" . skk-mode)
:custom
;; L辞書のパス
(skk-large-jisyo "~/.emacs.d/dict/SKK-JISYO.L")
;; StickyShift を ; に設定
(skk-sticky-key ";")
;; 変換候補をカーソル位置にインライン表示
(skk-show-inline t)
;; 入力中に過去の変換履歴から候補を先読み表示
(skk-dcomp-activate t)
;; Enterで確定と改行を同時に行う
(skk-egg-like-newline t)
;; isearch中もSKKを使えるようにする
(skk-isearch-mode-enable 'always))
各設定の補足:
-
skk-sticky-key:;を StickyShift キーにする。;aで▽あになる。セミコロン自体は;;で入力できる。Shift の多用で指に負担がかかるキーボードと相性が良い -
skk-show-inline: 変換候補がカーソル直後にオーバーレイ表示される。ミニバッファに視線を移す必要がなくなる -
skk-dcomp-activate: ▽ モードで入力中に候補を灰色で先読み表示する。TAB で補完を受け入れられる -
skk-egg-like-newline: デフォルトでは ▼ 変換中に Enter を押すと確定だけされ改行されない。この設定で確定と改行が同時に行われる -
skk-isearch-mode-enable:C-sの isearch 中でも日本語検索ができるようになる。OS の IME では不安定になりがちな箇所だ
補足:MELPA 経由でインストールした場合の isearch 設定
use-package ... :ensure t(MELPA インストール)では、make でインストールしたときに付属する skk-setup.el が読み込まれない。このため skk-isearch-mode-enable を設定するだけでは、isearch 中の日本語検索が有効にならないことがある。その場合は次のフックを追加する。
(add-hook 'isearch-mode-hook #'skk-isearch-setup-maybe)
(add-hook 'isearch-mode-end-hook #'skk-isearch-cleanup-maybe)
OS の IME との共存
Emacs 内で DDSKK を使う場合、OS の IME が同時に動くと変換が二重にかかってしまう。
そのため、Emacs にフォーカスが移ったときに、im-select を使って IME の入力ソースを強制的に英数にすることで解決した。
以下は macOS を前提としたコードだ。
(defun my/force-ascii-input-source ()
(start-process "input-source" nil
"/opt/homebrew/bin/im-select"
"com.apple.keylayout.ABC"))
(defun my/after-focus-change ()
(when (frame-focus-state)
(my/force-ascii-input-source)))
(add-function :after after-focus-change-function #'my/after-focus-change)
これにより、Emacs にウィンドウをフォーカスするたびに、OS の入力ソースが英数に切り替わる。
基本操作
OS の IME と操作体系は同じだ。StickyShift を ; に設定している前提で記載する。
モード切り替え
| キー | 動作 |
|---|---|
C-x C-j |
SKK モードのオン/オフ |
C-j |
かなモードに戻る |
q |
かな ⇄ カナを切り替え |
l |
ASCII モードに切り替え |
;l |
全角英数モードに切り替え |
漢字変換
「漢字」と入力する場合:
;kanji → ▽かんじ → SPC → ▼漢字 → C-j(確定)
-
;kで変換開始点をマーク。▽が表示される -
anjiで残りのよみを入力。▽かんじになる -
SPCで変換実行。▼漢字になる - 目的の候補でなければ
SPCで次候補へ -
C-jで確定。次の入力を始めれば自動確定もされる
送りがなのある変換
「動く」と入力する場合:
;ugo;ku → ▼動く
-
;uで変換開始 -
goで語幹を入力 -
;kで送りがなの開始点をマーク -
uで送りがなを入力。自動的に変換が走る
カタカナ入力
2つの方法がある。
モード切り替え方式: q でカナモードに入り、入力後に q で戻る。
変換中に変換する方式: ▽ モードで q を押すと、入力中のひらがなをカタカナに変換して確定する。一時的なカタカナ入力にはこちらが便利だ。
;katakana → ▽かたかな → q → カタカナ
英単語の挿入
かなモードのまま / を押すとアスキーモードに入る。英字を入力して Enter で確定するとかなモードに戻る。
/Emacs<Enter> → Emacs がバッファに挿入される
操作一覧
| やりたいこと | 操作 |
|---|---|
| 漢字変換 |
; + よみ + SPC
|
| 送りがな付き変換 |
; + 語幹 + ; + 送りがな |
| カタカナに変換 |
▽ モードで q
|
| 英単語を挿入 |
/ + 英字 + Enter
|
| 変換キャンセル | C-g |
| 確定 |
C-j または次の入力開始 |
コードを書くときの使い方
SKK は起動したまま、内部モードの切り替えだけで運用する。
-
lで ASCII モードに入ればそのまま普通にコードが書ける - コメントや文字列で日本語が必要になったら
C-jでかなモードに戻る -
C-x C-jで SKK 自体をオフにする必要はない
ASCII モードと SKK オフの違い に注意したい。l の ASCII モードは SKK が起動したまま英字入力になるだけで、C-j ですぐかなモードに戻れる。C-x C-j は SKK 自体を無効にするので、再度 C-x C-j しないと日本語入力に戻れない。日常的には l と C-j の切り替えだけで十分だ。
まとめ
DDSKK を導入することで得られるもの:
-
キーバインドが壊れない — 日本語モード中でも
C-x C-oのような Emacs コマンドがそのまま動く -
isearch で日本語検索 —
C-sで日本語をそのまま検索できる -
先読み補完が効く —
skk-dcompで入力中に変換候補が先読み表示される - OS の IME と同じ操作体系 — 学習コストがほぼゼロ
自分の設定は以下のPR:
DDSKK はいいぞ!