🎉

skkeletonへのJISYO.LをNixで管理する

2024/07/27に公開

TL;DR

このコミットを見ろ…。そこに全ての財宝が眠っている…。

何をしたか

Neovimのプラグインである、skkeletonへのJISYO.LファイルをNixで管理した。home-managerには、Neovimのinit.luaを書く事の出来る機能があり(programs.neovim.extraLuaConfig)、そこへlib.strings.concatStrings関数を使用して、Nix側で書いたPATH付きの文字列と、元々あったinit.luaファイルの中身の文字列をガッチャンコした。

使用した関数のリストを掲示する…。

{ lib, pkgs, ... }:

let
  skkeleton-jisyo = ''
    -- SKKELETON's JISYO
    vim.api.nvim_exec(
      [[
      call skkeleton#config({
        \   'globalDictionaries': ['${pkgs.skk-dicts}/share/SKK-JISYO.L'],
        \   'eggLikeNewline': v:true,
        \ })
    ]],
      false
    )
  '';
in
{
  programs.neovim.extraLuaConfig = lib.strings.concatStrings [
    (builtins.readFile ./init.lua)
    skkeleton-jisyo
  ];
}

関数の説明

  1. lib.strings.concatStrings
    一つのリストを引数に取り、そのリスト内の文字列を繋げる関数。このリストには複数の文字列を含ませる事が可能。例を挙げると、以下の通り。この要領で、skkeleton-jisyoへのパスが含まれた文字列とinit.luaをガッチャンコした。
lib.strings.concatStrings [
  "foo"
  "bar"
]
# Result: "foobar"
  1. builtins.readFile
    一つのPATHを引数に取り、ファイルを読み込む関数。当たり前だが、プロジェクト外のディレクトリを指定すると、nix-flakes上では純粋ではなくなってしまい、--impureオプションが必要になってしまう。
builtins.readFile ./init.lua
# Result: "init.lua"の中身

使用例

以下の例では、test.txtというファイルの中身を読み込み、それにfooという文字列を繋げたものを/nix/store/{nix-path}-hogeとして書き出している。なお、ここで出てきたwriteTextFileという関数は、nixpkgsに含まれている関数であり、単順に/nix/store/{nix-path}-{name}として書き出す関数である。

{ pkgs ? import <nixpkgs> { }
, lib ? pkgs.lib
, writeTextFile ? pkgs.writeTextFile
}:

writeTextFile {
  name = "hoge";
  text = lib.strings.concatStrings [
    (builtins.readFile ./test.txt)
    "foo"
  ];

Home-Managerでの使用例

{ lib, pkgs, ... }:
let
  skkeleton-jisyo = ''
    -- SKKELETON's JISYO
    vim.api.nvim_exec(
      [[
      call skkeleton#config({
        \   'globalDictionaries': ['${pkgs.skk-dicts}/share/SKK-JISYO.L'],
        \   'eggLikeNewline': v:true,
        \ })
    ]],
      false
    )
  '';
in
{

  # ~~ home.packagesなどの記述 ~~

  programs.neovim = {
    enable = true;
    extraLuaConfig = lib.strings.concatStrings [
      (builtins.readFile ./init.lua)
      skkeleton-jisyo
    ];
  };
}

注意点

今回の例だと、Lua用のフォーマッターやリンターは適用されない。なぜならば、Nix上でのただの文字列だからだ。しかし、PATHをパースする事はNixでしか出来ない事である。この点が、この方法の問題点であろう。

追記
今回使用したパッケージである、skk-dictsというパッケージは、近いうちにPATHが変わるらしい…。
https://github.com/NixOS/nixpkgs/pull/266144/

GitHubで編集を提案

Discussion