ibus-skk を NixOS で使えるようにがんばった話

とりあえず、色々と忘れない内に書き出しておきます。

ibus-skk を NixOS で動かす際の困難

まず、NixOS で ibus-skk を使う上で苦戦するのは以下の3つ:

  1. そもそも ibus-skk のパッケージ定義が存在しない
  2. nixpkgs で ibus-skk を定義してコンパイルするだけでは動作しない
  3. 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 である、

を取り込んだ上、org.freedesktop.ibus.engine.skk.gschema.xml を所定のディレクトリに配置してパッケージングする必要があります。

そして次にibus の設定として i18n.inputMethod.ibus.enginesibus-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

My configuration.nix and dotfiles for NixOS or nixpkgs

https://gitlab.com/nyarla/nixos-configurations

にほぼすべてブッ込んであるので、もし何か有ればそっちを参考にするもの良いかと思います。はい。

nyarlaが大体

Scrapbox.io でコメントや意見を書く