とりあえず、色々と忘れない内に書き出しておきます。
ibus-skk を NixOS で動かす際の困難
まず、NixOS で ibus-skk
を使う上で苦戦するのは以下の 3 つ:
- そもそも
ibus-skk
のパッケージ定義が存在しない - nixpkgs で
ibus-skk
を定義してコンパイルするだけでは動作しない - SKK 辞書のパスを
/nix/store
に持つとシステムの更新時に面倒
まぁ(3)については自分で任意のディレクトリに SKK 辞書を放り込んだあと、
その SKK 辞書を使うように設定すれば良いだけなんですが、(1)と特に(2)については色々と工夫をしないと、
ibus-skk
のパッケージを定義してソフトウェアをコンパイルするだけでは動作しません。
無論、ibus-skk
に限らず ibus 系の変換エンジンは /etc/nixos/configuration.nix
に設定を書かないと動かないのは勿論なのですが、
ibus-skk
を NixOS で使う場合 NixOS の独特さも合いまってなのか、ソースをそのまま持ってきてコンパイルするだけでは、
- 設定がなぜか一切保存されない
という状態になります。
さらに、ibus-skk
を NixOS の ibus で使う場合、Desktop 環境によっては Gnome3 の GSettings 周りへの対応コードを移植する必要があり、
その辺りを勘定して /etc/nixos/configuration.nix
を書かないと動かないので、その辺りもワリとツラミのある感じになっています。
Gnome3 な Desktop 環境で ibus-skk
を使う
と、御託はまぁこの辺りまでにしておくとして、実際にibus-skk
を NixOS で使うための設定ファイル類は、おおよそ下記の様になります:
ibus-skk.nix
{ stdenv, fetchurl, pkgconfig, intltool, vala, wrapGAppsHook, gobjectIntrospection, glib, dbus-glib, gnome3, ibus, libskk, gtk2, gtk3, python3 }: stdenv.mkDerivation rec { version = "1.4.3"; name = "ibus-skk-${version}"; src = fetchurl { url = "https://github.com/ueno/ibus-skk/releases/download/ibus-skk-1.4.3/ibus-skk-1.4.3.tar.xz"; sha256 = "0pb5766njjsv0cfikm0j5sq0kv07sd5mlxj1c06k5y6p1ffvsqb6"; }; patches = [ (fetchurl { url = "https://github.com/fujiwarat/ibus-skk/commit/0336d99e0987f7a9efa45578674cda7cbda235d5.patch"; sha256 = "0lcvhkfj7fq3nnb4r89l2pkprvqykbq7nayphh5vym2dy4kp79y1"; }) ]; nativeBuildInputs = [ intltool pkgconfig vala python3.pkgs.wrapPython wrapGAppsHook gobjectIntrospection ]; buildInputs = [ glib dbus-glib gtk2 gtk3 libskk gnome3.dconf gnome3.libgee ibus ]; postInstall = '' mkdir -p $out/share/gsettings-schemas/${name}/glib-2.0/schemas/ cp src/org.freedesktop.ibus.engine.skk.gschema.xml $out/share/gsettings-schemas/${name}/glib-2.0/schemas/ ''; postFixup = "wrapPythonPrograms"; meta = { isIbusEngine = true; }; }
/etc/nixos/configuration.nix
{ config, pkgs, ... }: { services.xserver.displayManager.sessionCommands = '' ${pkgs.gnome3.dconf.lib}/libexec/dconf-service & ${config.i18n.inputMethod.package}/bin/ibus-daemon -drx --config=${config.i18n.inputMethod.package}/libexec/ibus-dconf ''; i18n.inputMethod.enabled = "ibus"; i18n.inputMethod.ibus.engines = with pkgs; [ ibus-skk ]; services.dbus.packages = [ config.i18n.inputMethod.package ]; environment.systemPackages = with pkgs; [ skk-dicts skktools ]; services.xserver = { enable = true; autorun = true; displayManager.gdm = { enable = true; wayland = false; }; desktopManager.xterm.enable = false; desktopManager.gnome3 = { enable = true; extraGSettingsOverridePackages = [ config.i18n.inputMethod.package ] ++ (with pkgs; [ gnome3.dconf-editor ]); sessionPath = [ config.i18n.inputMethod.package ] ++ (with pkgs; [ gnome3.dconf-editor gnome3.dconf gnome3.glib.dev dbus-glib ]); }; }; }
設定ファイルを読み解く際のポイント
まず、ibus-skk
について解説すると ibus-skk
については、GitHub 上でオジリナルの開発者の方へ出されてた(2019-04-20 現在)未だ取り込まれていない Pull Request である、
Migrate IBusConfig to GSettings #65
を取り込んだ上、org.freedesktop.ibus.engine.skk.gschema.xml
を所定のディレクトリに配置してパッケージングする必要があります。
そして次にibus
の設定として i18n.inputMethod.ibus.engines
に ibus-skk
を指定したのち、
Gnome3 を Desktop 環境として使っている場合には、
services.xserver.displayManager.gnome3.extraGSettingsOverriddePackages
に config.i18n.inputMethod.package
を追加する必要があります。
なお、ここで Gnome3 を使っていない場合には Gnome3 の nixpkgs の定義が行なっている、
GSettings
周りの設定をまるっと取り込まないと、これまた ibus-skk
は動作しません。
ちなみに、上記のサンプルコードには他にも色々と書かれていますが、これらのコードの中には、
これ本当に(
ibus-skk
の動作に)必要なのか……?
というのも含まれているので、その辺りは各自見極めた上で上記コードをご利用ください。
以上
なお、私が実際に使っている nixpkgs
の定義については、
Naoki OKAMURA / nixos-configurations · GitLab
にほぼすべてブッ込んであるので、もし何か有ればそっちを参考にするもの良いかと思います。はい。