仕事や個人の開発でCursorを使って開発を行っている。Agentモードを使い色々作業をさせているのだが、コマンドの終了をうまく検知できず手動でターミナルを閉じたり、コマンドを終了させたりしていて不便だった。 しかし先日会社のSlackで同僚がこの問題の解決策を共有していて*1、それを参考にしたら解決した! id:doskoi64 ++
解決方法
$__fish_config_dir/config.fish
に以下を追記する。
source $(code --locate-shell-integration-path fish)
追記後にCursorを再起動するとAgentが実行するコマンドの終了を検知できるようになるはず。
詳細
Cursorはコマンドの検知にエスケープシーケンス*2を使っている。 このエスケープシーケンスは、VSCodeのシェルインテグレーションをインストールすることで自動で出力されるようになる。 しかし、WSL環境ではうまくインストールできず結果としてコマンド検知ができていないという状態になっていたようだ。
プロンプトを変える
VSCodeのシェルインテグレーションを入れるとプロンプトが変わってしまう。 デフォルトではログインユーザ名、ホスト名、カレントディレクトリのパス、ブランチ名などが表示されるようになっている。 しかし、これが思ったより長ったらしくAgentが実行するコマンドの視認性が悪くなるのでプロンプトを短くしたい。 単純にfish_promptを定義してしまうとコマンド終了の検知ができなくなってしまうので工夫する必要がある。
VSCodeのシェルインテグレーションを確認すると以下のようになっている。
function fish_prompt __vsc_fish_prompt __vsc_fish_cmd_start end
__vsc_fish_cmd_startがエスケープシーケンスを出力する関数なのでこれだけ呼び出せばよさそうにみえる。 そこで、私は以下のように定義した。
if string match vscode $TERM_PROGRAM > /dev/null source $(code --locate-shell-integration-path fish) function fish_prompt printf '> ' __vsc_fish_cmd_start end end
変更した結果↓みたいになった。
おわりに
CursorのAgentがコマンドの完了検知できるようになって便利になった!最高!