
この記事で分かること
- SKKとは何か
- AquaSKKのインストールと設定方法
- Doom EmacsでのSKK(ddskk)の導入方法
- SKK導入における障壁とその解決方法
- SKKを長期間使用した感想と評価
SKKとは
SKK(Simple Kana to Kanji conversion program)は、日本語入力システムの一種です。 一般的なIMEとは異なり、入力モードの切り替えが明示的で、変換候補を選ぶ際にも独特の操作方法を持っています。 特徴として:
- 変換時に送り仮名を明示的に指定する
- 辞書が自己学習し、使うほど自分専用の辞書になっていく
- キーボードから手を離さずに日本語入力ができる
が挙げられます。
SKKとわたし
- 昨年8月に参加した東京Emacs勉強会 サマーフェスティバル2024 でSKKの存在を知り、そこでSKKをちょっと使ってみるも、何が良いのかわからず、いつのまにか存在を忘れる
- 約2ヶ月後の東京Emacs勉強会 オクトーバーフェスティバル2024 で再度SKKの話題になる。 参加者の過半数がSKKを使用しており、その空間ではSKKを使っていない方がマイノリティであることを知り、すぐにSKKを導入。全然思うように使えず、生産性が爆下がりする
- しかし、日本のEmacser多くの方々が使っているからには、何かしら良いところがあるはずだと考え、キーボード自体の設定を変えたりしながら、徐々にSKKに適応していく
- 使い始めてから5ヶ月ほど経ち、SKK関連の設定も安定。試行錯誤の結果の設定を共有したいと思いこの記事を書くに至る
AquaSKKの導入
-
インストール
Homebrewを使って簡単にインストールできます:
brew install --cask aquaskk
です。
nix&flake&home-managerを使っている方は、以下を適切にimportするとインストールできます:
homebrew.casks = [ "aquaskk" ];
-
基本設定
こういうのは基本的にデフォルトのままで使いたい派の自分ですが、日本語入力の切り替えキーだけは変えました。
AquaSKK/keymap.conf
:- SKK_JMODE ctrl::j + SKK_JMODE ctrl::shift::j
(理由は後述します)
-
設定の同期
複数のデバイス間で辞書やキーマップの設定を同期させるために、AquaSKKのディレクトリをDropboxに配置し、
~/Library/Application Support/
内にシンボリックリンクを作成しました:ln -s ~/Dropbox/AquaSKK ~/Library/Application\ Support/AquaSKK
-
Macのデフォルト入力切替キー無効化
以下の記事で解説されているように、MacのデフォルトのIME切り替えキーを無効化することを強くお勧めします。 SKKを使う上で非常に重要な設定です: Mac で AquaSKK を Ctrl+Space で切り替えなくても良くする方法
なぜCtrl+Shift+J にしたのか
-
Ctrl+j: デフォルトの設定ですが、Doom Emacsのミニバッファでのカーソル移動と競合してしまうため、変更が必要でした。 また、修飾キーが一つだけだと、他のアプリケーションとの競合も多いです。 この問題については、Kazuhiro NISHIYAMA さんの記事にも詳しく書かれています。
-
Control+Cmd+j: しばらくこの組み合わせを使用していましたが、一部のアプリケーション(Signal, Kitty)で機能せず、 さらにNotion Calendarをバックグラウンドで起動していると、すべての場所で使えなくなるという問題がありました。 Macでは、
Command+キー
の組み合わせが多くのアプリで既に登録されているため、SKKの日本語切り替えキーにCommandを使うのは避けた方が良いという結論に至りました。 -
Ctrl+Shift+j:
Ctrl+j
に比べて修飾キーが一つ増えた分、競合が少なくなります。 設定後は問題なく使えているので、現時点ではこれがベストだと考えています1。
Doom Emacs への ddskk 導入
-
基本設定
Doom EmacsでDDSKKを使うためには、
init.el
でjapanese
モジュールを有効にします:(doom! :input ;;bidi ; (tfel ot) thgir etirw uoy gnipleh ;;chinese - ;;japanese + japanese
-
キーバインディングの競合解決
Doom Emacs/Evilを使用している場合、デフォルトの日本語切替キー
C-j
がEvilのキーバインディングと競合するため、追加の設定が必要になります:- 競合しないキーに変更する
- 既存のキーマップを上書きする
私の場合、最終的に両方の対応を行いました。いろいろな試行錯誤の末に到達した設定は以下の通りです:
(use-package! skk :config (setq skk-get-jisyo-directory "~/.config/emacs/skk-get-jisyo/" skk-tut-file "~/.config/emacs/.local/straight/repos/ddskk/etc/SKK.tut" skk-jisyo "~/Dropbox/.skk-jisyo") (global-set-key (kbd "C-S-j") #'skk-kakutei) (evil-global-set-key 'insert (kbd "C-S-j") #'skk-kakutei) (map! :map minibuffer-mode-map "C-S-j" #'skk-kakutei)) (after! evil-org (evil-define-key 'insert evil-org-mode-map (kbd "C-S-j") #'skk-kakutei))
-
Emacsキーバインディングの理解
Emacsに詳しくない方は、「なぜ
#'skk-kakutei
を何度も設定する必要があるのか」と疑問に思うかもしれません。 私も最初は(global-set-key (kbd "C-S-j") #'skk-kakutei)
だけで十分だと考えていましたが、 実際にはこれだけでは機能しませんでした。理由はEmacsのキーバインディングの優先順位によるものです。GNU Emacs Lisp Reference Manualには以下のような記述があります:
Usually, the active keymaps are: (i) the keymap specified by the keymap property, (ii) the keymaps of enabled minor modes, (iii) the current buffer’s local keymap, and (iv) the global keymap, in that order. Emacs searches for each input key sequence in all these keymaps.
つまり、Emacsでは次の優先順位でキーバインディングが適用されます:
- キーマッププロパティで指定されたキーマップ
- 有効なマイナーモードのキーマップ
- 現在のバッファのローカルキーマップ
- グローバルキーマップ
この優先順位のため、“C-S-j"をグローバルに設定しても、他のキーマップで上書きされてしまうことがあるのです。 私はこの知識がなかったため、解決に時間がかかりました。
特に、org-modeでの設定が大変でした。 うまくいかなかった例としては、以下のようなものがあります。(LLM、ウソをつくな!!)
(after! org (map! :map evil-insert-state-map :i "C-S-j" #'skk-kakutei) (map! :map evil-org-mode-map :i "C-S-j" #'skk-kakutei)) (after! org (define-key evil-org-mode-map (kbd "C-S-j") #'skk-kakutei)) (after! evil (evil-define-key 'insert evil-org-mode-map (kbd "C-S-j") #'skk-kakutei)) (after! org (evil-define-key 'insert evil-org-mode-map (kbd "C-S-j") #'skk-kakutei))
最終的には、org-mode 内で
M-x describe-key
を実行して、衝突している関数がどこでkeymapされているのかを調べて、そのパッケージを調べて、設定を変更するという方法で解決しました:(after! evil-org (evil-define-key 'insert evil-org-mode-map (kbd "C-S-j") #'skk-kakutei))
大変でしたが、emacsのキーバインディングの仕組みを理解する良い機会になりました。
SKKを4ヶ月使用してみた感想
SKKを4ヶ月間使用した感想をメリットとデメリットに分けて紹介します。 書いていて、「あれ、デメリットの方が多くないか?」と思ってしまいましたが、SKKなしでは日本語入力ができない体になってしまった私にとってはそんなことは関係ありません。
-
デメリット
-
慣れるまで時間がかかる(学習コスト)
SKKを使っている方なら共感していただけると思いますが、学習曲線がかなり急です。 今まで無意識にできていた日本語入力が、意識的な操作が必要になるため、最初はストレスを感じるでしょう。 ただ、私の場合はタイピングがゲームのような感覚になって楽しく感じられるようになりました。
おもしろきこともなき世をおもしろく
― 高杉晋作
-
タイピング速度は(特に最初は)低下する
- 当然ながら、最初は入力速度が大幅に低下します
- 漢字と仮名の切り替えにShiftキーを押す操作が慣れないうえ、指にも負担がかかります
- この問題を軽減するために、home row modsを導入したり、親指キーにShiftを割り当てたりと工夫しました (Macの内蔵キーボードはkanataを使ってカスタマイズしています)
- キー操作に慣れても、送り仮名を意識しながら入力する必要があるため、速度向上には時間がかかると思われます
-
macOSの高機能IME機能が使えなくなる
macOSの標準IMEでは「きょう」と入力すると今日の日付が変換候補に出てきますが、SKKにはそのような機能はありません。
-
他人のPCを使うときに違和感がある
SKKに慣れると、従来のIMEの使用感が奇妙に感じられるようになります。他の人のPCを借りて作業するときに戸惑うことがあります。
-
-
メリット
-
辞書が自分専用に進化していく
macOSでは設定アプリからユーザー辞書/Text Replacementsを手動で登録する必要がありますが、SKKは変換と同時に辞書が更新されるため、使い続けるほど自分に最適化されていきます。例えば:
- 「たかひろ」→「崇宏」と「貴裕」のどちらが先に出るかが自分の使用パターンで変わる
- 専門用語が一発で変換できるようになる
- 名前や住所などの個人情報も学習される
-
タイピングミスが減る 送り仮名を明示的に指定するため、変換ミスが減少するという意見があります。私の場合は軽度の効果しか感じていませんが、長期的に見れば確かにミスは減少傾向にあります。
-
skk使ってない人に対してマウントが取れる
(一番重要?)
-
おまけ: tmux 内でSKKを使うための設定
terminal emulatorとしてKittyを使用している場合、kittyの設定ファイルに以下を追加することで、tmux内でもSKKが使えるようになりました:
programs.kitty.keybindings = {
"ctrl+shift+j" = "discard_event";
};
まとめ
SKKは最初の学習障壁が高いものの、一度習得すれば非常に効率的な日本語入力システムです。 特にEmacs/Vimユーザーにとっては、キーボード中心の操作感と相性が良く、長期的に見て作業効率の向上につながると考えています。
この記事がSKKに興味を持った方々の導入の一助となれば幸いです。 また、よりよい設定やTipsがありましたら、ぜひ教えてください。 読んでいただきありがとうございました。
追記 (2025/05/02)
Ctrl+Shift+j
は思わぬところで競合してしまい、 SKK_JMODE/skk-kakutei
は Ctrl+Shift+'
➡️ Ctrl+Shift+;
(現在の設定) に移る結果になりました。
これからも変更したらここに追記していこうと思います。
キー | 競合内容 |
---|---|
Ctrl+Shift+j |
ブラウザ版 Grok “Swicthc to Private Chat (Cmd Shift j)” |
Ctrl+Shift+' |
Discord “プライベートメッセージまたはグループで通話を開始 (Ctrl ‘)” |
-
2025/05/02 現在は
Ctrl+Shift+;
を使ってます。理由は追記 (2025/05/02)を参照してください。 ↩︎