Skip to content

Instantly share code, notes, and snippets.

@kuuote
Created March 20, 2025 15:48
Show Gist options
  • Save kuuote/950f29b621c9d67ff8a701e50a8408bf to your computer and use it in GitHub Desktop.
Save kuuote/950f29b621c9d67ff8a701e50a8408bf to your computer and use it in GitHub Desktop.

日報

  • 寒くて体調がクソ悪い
  • 環境変数完全に理解した
    • Linuxの場合 systemctl --user get-environment でほぼ素に近い環境変数取れるので、そこに /etc/profile の結果を足したら大体なんとかなる
      • envコマンドを使うと変数を消した上で新しい物を適用できて便利
    • tmuxのグローバル変数は tmux show-environment -g で取れて tmux set-environment -gu で消せて tmux set-environment -g で足せる
      • のでこれらを組み合わせると全部入れ替えられる
        if [[ -z "${__env__}" ]]; then
            exec env -i $(systemctl --user show-environment) __env__=1 $(command -v bash) $(realpath $0)
        fi
        unset __env__
        source /etc/profile
        
        tmux show-environment -g | while read var; do
            tmux set-environment -gu "${var%%=*}"
        done
        
        env | while read var; do
            tmux set-environment -g "${var%%=*}" "${var#*=}"
        done
                    
        • bashの置換が意味不明すぎてここ参考にした
          • = が複数ある中で先頭だけ除去したいので最短と最長でごにょった
    • なんでこれをやりたいのかというと、home-managerのセッション変数を消したい
      • うちの環境だとhome-managerの支配下のfishをログインシェルにしているので根本に生えてる
  • direnvのキャッシュについて完全に理解した
    direnv_layout_dir() {
        echo /tmp/direnv/$(pwd | base64)
    }
        
  • Pythonのptyモジュールを使って端末で動くキーリマッパーみたいなものを作った
    • 突貫工事クオリティだけどこんなやつ
    • やってることはTrie構築してstdin入力にしてそれ辿ってるだけなんだけど、エスケープシーケンスの扱いだとかptyの内部の動きだとか考えることが多かった
      • ターミナルは特定のエスケープシーケンスへの応答をstdin経由で送ってくることがある
        • readした物の先頭が0x1b(=Esc)だったら処理せず素通しするようにしてる
      • ptyについてはreadできないタイミングでreadするとブロッキングして死ぬとか空の値を返すとstdin閉じた判定されて固まるとそのへん
        • マッピングの途中で入力途切れるケースをどう処理するのかが悩ましかった
    • Trieについてはバイト列を入力にしてるのをいいことにかなり雑に実装してある
      • root = [None] * 257 とやって各値へのバケツと結果を指す部分である256番目の要素を固定で用意している
    • どうやってI/O捌いてるんだと思ってptyモジュールの中身を読んでたけど、selectとかepollってここで出てくるのかあってなった
    • SIGWINCHというシグナルをハンドリングしてmaster側のfdにリサイズ叩き込むとウィンドウリサイズを伝播できる
      • pty.spawn() だとfdもらえないのでHackyなことをしている
      • 最初の描画時にfdメモってついでにリサイズ
  • 補完でスニペットをスニペットエンジンに投げるためのソースを書いた
    • LSP互換を謳うスニペットエンジンが複数あるので差し替え可能で便利
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment