- natsukiumさんから
nix repl
でソースファイルの位置を辿る方法を聞いて、どうやっているんだろうと思いながら調べていたら気付いたらnixpkgsのtop level mattributeを辿るdduソースを作っていた- 今の所Nixでソースファイルの位置を取得する方法は3つある
__curPos
を参照すると__curPos
の位置を指すAttrSetが取れる- なんとこれ文法規則レベルでやっている
builtins.unsafeGetAttrPos
を叩くとAttrSetのattributeが定義された場所が取得できる- 返ってくるのはattributeの中身ではなくattributeそのものの場所なので、後付けで使うのには向いていない
- こちらは
stdenv.mkDerivation
の中でmeta.position
の中身を埋めるのに使われている- ソースはここ
- 関数は宣言した時に位置を保存しているらしく、replに打ち込んだりtraceしたりすると位置が表示されるものの、文字列にしたりはできない
- 後、nixpkgsにはAttrSetで関数をwrapするやつがあって、一部それになってるのでこれもどうにかする必要がある
{pkg}.__functor {pkg}
みたいなことをしてやったら元の関数が見えたのでこれで行くことにした- partial applicationなので与える値はなんでもいいけど
- 関数がどうにもならないので、仕方なくreplをstdin流し込んで叩くことにした
- エラーが出ても無視できるので雑に上に書いたことをやってる
- 最終的にこうなった
- 今の所Nixでソースファイルの位置を取得する方法は3つある
- Nixのセミコロン忘れがあまりに激しいのでlexima.vimとnvim-insxで
=<Space>
のパターンが末尾に来たらセミコロンを補完するように仕込んでみた- 延々とhrsh7thさん(nvim-insxの作者の方)Kento Ogataさんとこのへんの話で盛り上がってたけど楽しかった
- 私は素朴にやってたけど、hrsh7thさんが出してくれたsubstituteパターンの方がすっきりして見えるのでこっちにした
- Emacsでもinsxみたいなの欲しいので明日無いか聞いてみたい
- 話の流れでスニペットの強制マッピングしんどい話から補完の話になって(Vimの組み込み補完にはマッピングを突き抜ける強制キーバインドが存在する)、補完の確定の際にキーワード単位で置換すると便利という話を聞いたのでこれも仕込んでみた
call search('\%#\k*\zs')
を補完の確定動作の前に挟んでみた
Created
February 12, 2025 18:20
-
-
Save kuuote/73aba2a4ad0f5eba166741df146ef967 to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment