ちなみに

火曜日の空は僕を押しつぶした。

トラックボールを傾けた

みなさんはトラックボールを使っていますか。使ってない人はいますぐ Slimbladeを買いましょう。 (個人的には最初に触るのは親指タイプよりフィンガータイプがおすすめです)

ところでさいきん急に思い立って Slimblade を横に傾けたら(Tenting)めちゃくちゃ快適になりました。

最初はこういう感じでDIYしていたのですが、専用の台が売っているらしいので買ってみました。

傾きを微調整できるのでとても快適になったのですが、グリップ力がちょっと足りなくてだんだん落ちてくるのがストレスになっています。 見た目悪くならないように固定出来る方法を探しています。

DIYでも十分快適なのでみなさんもお試しください。

追記

家にこれがあったので Slimblade 側に貼ってみたらグリップ力が上がって快適になりました。

export VSCODE_INJECTION=0

VSCode系のIDEのターミナルを開くと以下のような警告が出て気になっていた。

warning: completion was already initialized before completion module. Will call compinit again. See https://github.com/zimfw/zimfw/wiki/Troubleshooting#completion-is-not-working
warning: compinit being called again after completion module at /Users/<USER>/.config/zim/modules/completion/init.zsh:36

compinit が2回呼ばれていると言われているけど設定をさらっても重複しているところはない。別のターミナルで開いたときは警告は出ないのでやはり設定がおかしい訳ではなさそう。

ところでVSCode系のエディタで Shell Integration を使うために以下のように追加のスクリプトを読み込んでいる。(ちなみにフォークしたエディタでもこのまま動く)

# VSCode shell integration
[[ "$TERM_PROGRAM" == 'vscode' ]] && . "$(code --locate-shell-integration-path zsh)"

よく読むとこの中でもう一度 .zshrc を読み込んでいる。

# Only fix up ZDOTDIR if shell integration was injected (not manually installed) and has not been called yet
if [[ "$VSCODE_INJECTION" == "1" ]]; then
    if [[ $options[norcs] = off  && -f $USER_ZDOTDIR/.zshrc ]]; then
        VSCODE_ZDOTDIR=$ZDOTDIR
        ZDOTDIR=$USER_ZDOTDIR
       # A user's custom HISTFILE location might be set when their .zshrc file is sourced below
     . $USER_ZDOTDIR/.zshrc
    fi
fi

明らかにこれが原因である。

VSCODE_INJECTION をみて判定していそうなので、 export VSCODE_INJECTION=0 って書いておくと解決した。

ところで、コメントをよく読むと Only fix up ZDOTDIR if shell integration was injected (not manually installed) and has not been called yet と書かれている。どうやら手動でスクリプトを読み込まなくても良さそうな書き方に見える。

ドキュメントを見に行くと Automatic script injection と言うのがデフォルトになっているらしい。Shell integration が実験的な機能だったときから使っていたので気付いてなかった。

ということで本質的な原因は自動注入が動いたあとに手動でも読み込んでいるのが悪かったのであった。手動で読み込むのをやめました。

miseからprotoに移行した

moonrepo.dev

各種言語(とか)のバージョン管理に mise を使っていたけど、proto に移行した。

mise はバージョン管理だけでなく、 direnv のような環境管理や、make のようなタスク実行もサポートしていて、少し過剰に感じていた。(し、使ってなかった) 1つのツールが複数の役割を担うのは、「一つのことをうまくやれ」というUNIX哲学に反している気がした。

protoはいまのところバージョン管理だけをやっているのと、WASMベースでプラグインを定義できるのがモダンで、保守性やセキュリティ面でも好印象だった。 OSSで開発されているが実質的に企業としての moonrepo が管理しているので将来はどうなるかは分からない。

インストールはシェルスクリプトを読み込むやつ だけれど、最近はLLMと一緒にレビューしてから実行できるのでちょっと安心。 自分より頭のいい人にうまく隠されると見破れる自信がない。 非公式のFormula はあるみたいなので Homebrew で入れる選択肢も一応ある。

.zshenv に以下のように環境変数を設定すると、XDG_DATA_HOME 以下にインストールできます。

# proto https://github.com/moonrepo/proto
export PROTO_HOME="$XDG_DATA_HOME/proto";
export PATH="$PROTO_HOME/shims:$PROTO_HOME/bin:$PATH";

補完系も生成して配置しておいた。

$ proto completions --shell zsh > ~/.config/zsh/completion/_proto

使い方はよくある感じなので ドキュメント を眺めるとすぐに分かると思います。

しばらく使ってみて様子をみようと思います。 他にも軽量なバージョン管理ツールを知っている人がいたらぜひ教えてください。

Google検索をVimっぽく操作できるChrome拡張を作った

Google Search NavigatorというChrome拡張を作りました。 名前はすごい適当。 Googleの検索結果をVimっぽくキーボードで操作できるやつです。

github.com

元々、似たようなChrome拡張を使ってたんだけど、Chromeの最新の仕様変更に追従しなくなって動かなくなってしまった。めちゃくちゃ使っていたので諦めて自分で作ることにした。 ただ、作ったとはいっても実際はほとんどCursorに作ってもらった感じ。

普段からVimを使っていると、Google検索のときにも手をキーボードから離したくなくなることがある。Vimiumも使っているけど、検索結果の1個1個にj/kでフォーカスして移動したい。広告とかサイトマップとかも飛ばしたい。

折角なので元の拡張より機能を盛っていて、複数選択してまとめて開いたり、URLをコピー出来るようにしておいた。ちょっとだけ便利だと思う。

リポジトリ依存のファイルを自分だけGit管理から外したい

特定のリポジトリのみに存在するファイルで、自分だけGit管理から外したい場合がある。 例えば自分だけ使っているツールの出力とか。

リポジトリ.gitignore にも書きにくいし、global にもあんまり書きたくない。 そういったときは .git/info/exclude が使えるらしい。(doc)

ここに書いておいたら無視できた。

% cat .git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

VSCode (Cursor) のTerminalでもzellijを自動起動したい

zellij.dev

最近、zellij を使ったワークフローが手に馴染んできたので、VSCode (実際は Cursor 使ってる) の Terminal でも自動起動するようにした。

ドキュメント によると eval "$(zellij setup --generate-auto-start zsh)" って書いておけば自動起動できるのだけれど、各リポジトリ毎に別の Session になってほしいので以下のようにした。

# zellij https://github.com/zellij-org/zellij
if [[ "$TERM_PROGRAM" == 'vscode' ]]; then
  if [[ -z "$ZELLIJ" ]]; then
    zellij attach --create "$(basename "$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")")"
    exit
  fi
else
  if [[ -z "$VSCODE_RESOLVING_ENVIRONMENT" ]]; then
    # export ZELLIJ_AUTO_ATTACH=true
    export ZELLIJ_AUTO_EXIT=true
    eval "$(zellij setup --generate-auto-start zsh)"
  fi
fi

補足として、通常のターミナル側の処理で $VSCODE_RESOLVING_ENVIRONMENT を見ているのは、VSCode の起動時にユーザーのシェルの設定を読みに行く処理が失敗してぶっ壊れるので回避策。