basyura's blog

あしたになったらほんきだす。

wezterm : title 判定

wezterm で分割した pane で Vim を表示している判定が家 Mac だと動いていたのに、会社 Windows + Git Bash では動かなくて再調査。

$ wezterm cli list --format json | \
      jq -r '.[] | "\(.pane_id)\ttitle=\(.title // "")"'

2       title=zsh
3       title=Vim
6       title=Vim

家 Mac では title で判定できていたけど、Git Bash では title が取れていなかった。

if has('unix')
  set title
  set titlestring = "vim"
endif

と定義することで解決。title が取れなくて vim ではなく sh と判断されていた。

最近の AI (codex) を使った開発

※ このエントリーは AI を使用していません (って書くのが流行りそう)

近況

wezterm で画面分割して左に codex、右に vim を開いている。terminal に引きこもろうかと思ってたけど、慣れなのかどうしても gvim の方が使い勝手がよく感じてしまうので引きこもりはやめた。

SNS のタイムラインを見ていると Claude の評判が良いように感じるので Claude Pro を再契約。が、codex の方が賢く感じるので Claude はまた辞める予定 (Opus でぶん回し続けられると違う??)。

Claude を久しぶりに触っていて良いなと思ったのが Plan モード。Plan のマークダウンファイルを生成する場所がどうなのはあるけど、やろうとしてることを事前に把握できるので良い。以前は直接編集が始まって diff 見せられて ok するだけになっていて修正に納得感があまりなかった。今は Plan を作って読んで、気になるところを指摘したり、編集を始めてる際にも気になる場合は Plan に反映させて見直したりといったことをしている。今の仕事もこんな感じなので、進め方が馴染んでるのかも。

codex でもまずは計画を立てるように AGENTS.md に記載している。

- 修正を始める前に計画をマークダウンファイルで .plans フォルダ配下に生成してください。
- 計画のファイル名は連番とし、1つ目を 001 始まりとして修正にあった適切なファイル名としてください。
- 計画のフォーマットは `001-windows-makefile-conditional.md` を参照すること。
- 具体的なファイル編集をする前に、修正案を提示すること。

フォーマットはいい感じにできたなと思うものに随時書き換えているけど、なにか良いフォーマットがないかなぁとは思う。Mac で codex で動かしてた場合は具体的なコードについても出力されていたのだけど、Windows + GitBash + codex の場合はかなり簡易的な内容になってるのも気になる。いい感じのフォーマットを見つけていきたい。

プロンプトは直したいことを書き、最後に 計画を立ててください を加えて送信する。 .plans フォルダ配下にファイルが生成されるので、それを見ながら自分の理解を深める。

仕事でプロダクトのコードを書くことがほぼなくなり、仕事に関する補助的なツールを作ったり、個人的な便利ツールを作ったりで息抜きをしている。Plan をまず作成する運用をしている中でちょっとした改善ものを以下に記載する。

分割 Pane の同期

プロジェクトを複数行き来していることが多いので、ターミナルを分割して表示している Vim の Pane がシェルで移動した結果のディレクトリが一致しなくなることが多い。Vim から辿るのは苦でないけどひと手間かかるのを改善。

sync-cwd() {
  local cwd vpath
  cwd=$(pwd)

  # Vim の "..." 文字列向けにエスケープ
  vpath=${cwd//\\/\\\\}   # \ -> \\
  vpath=${vpath//\"/\\\"} # " -> \"

  wezterm cli list --format json \
  | jq -r '.[] | "\(.pane_id)\t\(.title // "")"' \
  | while IFS=$'\t' read -r pane_id title; do
      if [[ "$title" == Vim* || "$title" == *vim* || "$title" == *nvim* ]]; then
        printf '\x03\x1b\x1b:execute "edit " . fnameescape("%s")\r' "$vpath" \
        | wezterm cli send-text --no-paste --pane-id "$pane_id"
      else
        printf 'cd %q\r' "$cwd" \
        | wezterm cli send-text --no-paste --pane-id "$pane_id"
      fi
    done
}

シェルで移動後に sync-cwd を実行することで、他の Pane のカレントディレクトリを変更する。Vim を開いていた場合は、該当ディレクトリのファイルリストを表示する。僕は vimfiler を使っているので、vimfiler でファイルのリストが表示される。

vim-right

wezterm の画面分割で左にシェルを右に vim をなので、そんな名前 (適当)。

function vim-right() {
  local target="$1"
  [[ -z "$target" ]] && return 1

  local abspath
  abspath="$(realpath "$target")" || return 1

  local pane_id
  pane_id="$(
    wezterm cli list --format json \
    | jq -r '
      (map(select(.is_active))[0].tab_id) as $tid
      | map(select(.tab_id==$tid and (.title|test("vi|vim|nvim"; "i"))))
      | .[0].pane_id // empty
    '
  )"
  [[ -z "$pane_id" ]] && return 1

  # ESC x2 で Normal に戻す → :e を実行(改行込み)。paste 制御を付けない
  wezterm cli send-text --pane-id "$pane_id" --no-paste $'\x1b\x1b:e '"${abspath}"$'\n'

  wezterm cli activate-pane --pane-id "$pane_id"
}

Plan ファイルを Vim ですぐ開けるように、シェル側から vim-right {paht} を実行していたりしたけど、codex を開始すると連携がイマイチなので (できないことはないけど) 、たまにしか使ってない。sync-cwd でディレクトリを合わせてから codex を開始すればいいのでファイルを開くまでの手間は許容範囲。

※ codex コマンドを実行する前に sync-cwd が実行されるようにしておけば、さらに便利じゃないかと今思ったので後で試す。

Shiba.app

vim でマークダウンを見るのもいいけど、html でレンダリングした結果の方が読みやすい。いい感じのマークダウンビューアがないかと探した結果、久々に見に行った Shiba が条件にぴったりだった。typora は編集できる点もよかったけど vim ライクなキーバインドができないのであきらめ。

条件

  • アウトラインが表示される
  • vim ライクなキーバインドが使える
  • できるだけ軽量

とはいえ、気になるところがちょろちょろあるので fork して追加実装してみた。codex で Plan ファイルを作る運用で。

追加機能

  • j/k/C-d/C-u のスクロール量を可変にできる
  • ファイルパスを指定してアプリ起動、再読み込みできる
  • ファイルが切り替わった場合はスクロール位置を先頭にする

合わせて Vim でマークダウンファイルを開いている際に :Shiba を実行すると、Shiba.app で見れるようにコマンドを定義した。

command! Shiba call s:open_with_shiba()

function! s:open_with_shiba() abort
  let file = expand('%:p')
  if empty(file)
    echoerr 'no file'
    return
  endif

  if has('mac')
    silent execute '!open -a "Shiba.app" ' . shellescape(file)
  else
    let shiba = 'shiba.exe'
    call job_start([shiba, file])
    return
  endif

  redraw!
endfunction

まとめ

けっこう、満足している。

2026

例年は年末に振り返りして年始に今年はどうしようかと書くのだけど、そういうの全くやる気が出ない程度にだらだらしてた。まずは安静を取り戻す。

ついでに直近にやってたあれこれ。

dropbox plus を解約

  • 昔ノルマ達成で追加された容量が残っていて 10G 使える

Codex によるコーディング?がいまいち楽しくないと感じるので Claude に戻ってみた

  • ついでに Chat GPT の plus プランを解約したら、一ヶ月無料で plus を継続できると出たので無料継続しといた
  • Claude は使用制限があっという間にくるっていう別の不安感がある。もうちょい緩和されないものか。

ドラクエ7 先行プレイ版クリア

  • リメイク系は毎回途中で飽きるので始めるか悩み中だったけど。ドラクエシリーズのリメイクで費用を捻出しつ検証とスキルアップを踏まえて最新作につなげようとしてるのかなぁという感想。

スト6

  • マネモン(Master)と戦ってる方が楽しいと思う程度にランクマで勝てずに相変わらずプラチナとゴールドを行ったり来たりしてる。スティックぐりぐりしてる左手よりボタン押すだけのはずの右手(特に手首)が痛い。Switch2 のプロコンのせいなのか。強ボタンがちょっと辛い。GL に大パンチ当てたらコンボ出やすくなったけど。インパクトは返せないし返される。

Inkdrop v6.0.0-canary

  • 動くけど、色々カスタマイズしたりだ何だあるから現状で使うのまだまだ。とりあえずテーマが変えられないのはなんだろ。

fyop+

  • なんとかなれー (切実)