WSL2 + Emacs pgtk + mozc.el で日本語入力する

お久しぶりです、masm11 です。

前回は、WSL2 に ArchLinux を入れる記事を書きました。

blog.ingage.jp

今回は、その Emacs で日本語入力します。

Emacs pgtk での日本語入力

pgtk で日本語入力するには、大きく2つのやり方があります。

  • input method framework を使う方法

    デフォルトではこちらになっています。Fcitx5 (または IBus 等) が必要になります。

  • input method framework を使わない方法

    mozc.el という emacs lisp が mozc_emacs_helper を経由して Mozc を使います。Fcitx5 等は使いません。

今回は、後者の方法を使います。前者は既に世の中に記事がたくさんありますので、参考にしてみてください。 私は、mode-line に [Mozc] と表示される、後者の方が好きです。

ArchLinux のインストール

ArchLinux のインストール・設定までは、前回の記事を参考にしてください。 リンクを再掲しておきます。

blog.ingage.jp

ただ、いくつか不足している点がありますので、補足しておきます。

  • wheel に自分を追加
  vi /etc/group

これで、wheel グループに自分自身を追加します。これがないと sudo が使えません。

なお、wsl コマンドに -u root を指定すると、root 権限のシェルを起動できます。

  • ホームディレクトリを作成
  sudo mkdir /home/masm
  sudo chown masm:masm /home/masm

では進めましょう。

Mozc のインストール

Mozc のインストールには、mozc-with-jp-dict という AUR パッケージをインストールします。

とりあえず wget をインストールします。

sudo pacman -S wget

mozc-with-jp-dict パッケージをダウンロード、展開します。

wget https://aur.archlinux.org/cgit/aur.git/snapshot/mozc-with-jp-dict.tar.gz
tar zxf mozc-with-jp-dict.tar.gz
cd mozc-with-jp-dict

私の環境では、少し手を加える必要がありました。

vi PKGBUILD

で、2行ある bazel build ... を両方とも bazel build --jobs 1 ... に書き換えます (--jobs 1 を追加します)。

こうしないと、bazel が Connection reset by peer を吐いて、ビルドが中断してしまいました。 並列ビルドに何か問題がありそうですね。まぁ単純にメモリ不足の可能性もありますが。

では、ビルドしていきます。

makepkg -s

かなり時間がかかります。

終わったら、*.pkg.tar.zst ファイルがいくつか生成されていますので、インストールします。

sudo pacman -U fcitx5-mozc-with-jp-dict-2.29.5374.102-1-x86_64.pkg.tar.zst emacs-mozc-with-jp-dict-2.29.5374.102-1-x86_64.pkg.tar.zst

fcitx5 が付いたものは、fcitx5 に対応しています。今後、気が変わって fcitx5 を使うかもしれませんので、これを使うと良いでしょう。 emacs が付いたものは、mozc.el と mozc_emacs_helper が含まれています。

Windows に PowerToys をインストール・設定する

ここまでで、たぶん、C-\ (Ctrl+\) で日本語入力がトグルできるのでは、と思います。

が、ここで色気を出します。 右 Windows キーでトグルするようにしたいと思います。 あなたのキーボードを見ても、右 Windows キーなんてたぶんないですよね。 私の HHKB では右◇キーが右 Windows キーになっているのです。 このキー単体でトグルしたい、というわけです。

  • まず Windows に PowerToys をインストールします
  • PowerToys のダッシュボードで、Keyboard Manager が無効なモジュールになっていますので、ON にします
  • そして PowerToys の Keyboard Manager に以下のように設定します
    • キーの再マップ
      • Win(Right) → Alt(Left) + IME Kanji
      • OK をクリックすると警告が出ますが、「それでも続行する」で設定できます
    • ショートカット
      • Alt(Left) + IME Kanji → F12
      • アプリは msrdc.exe

こう設定することで、右 Windows キーを押すと、Alt(Left) + IME Kanji に変換され、 通常の Windows アプリではこれで日本語入力ができます (原神の場合を含みますが、あのゲームは管理者権限で動いていますので、 PowerToys も管理者権限で動かす必要があります)。 そして、WSL2 の場合は、実体は msrdc.exe だそうですので、更にショートカットが機能し、 F12 になります。

どうも、Keyboard Manager と WSLg の組み合わせだと、Alt キーがうまく機能しないみたいで、 かと言って再マップに半角全角キーを単体で設定すると、キーボード配列を 101/102 にした時に 反応しなくなります。また、ショートカットの変換元は修飾キーが必須です。 こういういろいろな条件をくぐり抜ける設定を模索した結果、こうなりなした。

ちなみに、WSLg というのは、WSL2 で GUI アプリを使えるようにするものです。WSL2 を起動すると 自動で起動します。これも Linux ですので、中身に興味があるなら wsl --system でそっちのシェルが起動します。

Emacs を設定する

~/.emacs に以下のように設定します。

(let ((key "<f12>"))
  (require 'mozc)
  (global-set-key (kbd key) 'toggle-input-method)
  (define-key mozc-mode-map (kbd key) 'toggle-input-method))
(setq pgtk-use-im-context-on-new-connection nil)
(setq default-input-method 'japanese-mozc)

これで F12 でトグルします。

最後から2行目の setq は、fcitx5 を使わない設定です。 デフォルトでは使う設定になっていますので、使わないように設定しています。

まとめ

以上で、HHKB 右◇で Windows アプリと WSL2 内 Emacs pgtk の日本語入力がトグルできました。

おまけ

日本語入力とは直接関係ありませんが、コピー/ペーストについての設定を紹介します。 私は、コピー/ペーストは ~/.emacs に以下のように設定して使っています。

(defun masm11:paste (p)
  (interactive "P")
  (let* ((sel (if p 'PRIMARY 'CLIPBOARD))
     (types '(UTF8_STRING COMPOUND_TEXT text/plain\;charset=utf-8 STRING))
     str)
    (while (and (null str) types)
      (setq str (gui-get-selection sel (car types)))
      (setq types (cdr types)))
    (if (not str)
    (message "Nothing pasted.")
      (insert str)
      (message "Pasted."))
    ))

(defun masm11:copy (start end)
  (interactive "r")
  (let ((str (buffer-substring-no-properties start end)))
    (gui-set-selection 'CLIPBOARD str)
    ;;(gui-set-selection 'PRIMARY str)
    (setq deactivate-mark t)
    (message "Copied.")
    ))

(global-set-key "\M-c" 'masm11:copy)
(global-set-key "\M-v" 'masm11:paste)
(setq select-enable-clipboard nil)

Emacs は通常、kill ring と clipboard を統合した動きになりますが、私はそれが嫌いなので、 両者を切り離し、clipboard を使う時には Alt+c/Alt+v でコピー/ペーストしています。

Windows の clipboard とやりとりする際には mime type? が text/plain;charset=utf-8 になるようなので、 その設定をしてあります。この辺は、WSL2 内で wl-paste コマンドを使うとわかります。

ではまた!