🎉
skkeletonへのJISYO.LをNixで管理する
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
];
}
関数の説明
-
lib.strings.concatStrings
一つのリストを引数に取り、そのリスト内の文字列を繋げる関数。このリストには複数の文字列を含ませる事が可能。例を挙げると、以下の通り。この要領で、skkeleton-jisyoへのパスが含まれた文字列とinit.lua
をガッチャンコした。
lib.strings.concatStrings [
"foo"
"bar"
]
# Result: "foobar"
-
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が変わるらしい…。
Discussion