標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

現在の WindowsTerminal の別タブで、ターミナル版 vim を開く

gvim でもいいんだけど、シェルと同じ WindowsTerminal のタブで開いていると、Ctrl-TAB だけでトグルでフォーカスを切り替えられたりして嬉しい (Alt-TAB だと、トグル対象にブラウザとか他のウインドウも含まれるので、ちょっと鬱陶しいのだ)

「WindowsTerminal の別タブで特定のプログラムを起動させる」というのは、以前 nyagos の clone コマンドでやった。その時は内部的に

start "" "%LOCALAPPDATA%\Microsoft\WindowsApps\wt.exe --window 0 new-tab -- \"nyagos.exe\" --chdir \"カレントディレクトリ\" "

的なことをやっていた。これを応用すればいけるか。

newtab.cmd

(2024-01-29 追記) 引数がない場合、タブが無限に増える不具合があります。修正版は GitHub を参照のこと

@echo off
setlocal
if "%CURRENTDIRECTORY%" == "" (
    for /F %%I in ('cd') do set "CURRENTDIRECTORY=%%I"
    for /F %%I in ('where %1') do @"%LOCALAPPDATA%\Microsoft\WindowsApps\wt.exe" --window 0 new-tab -- %~dpnx0 %%I %2 %3 %4 %5 %6 %7 %8 %9
) else (
    cd "%CURRENTDIRECTORY%"
    %1 %2 %3 %4 %5 %6 %7 %8 %9
)
endlocal
exit /b 0

wt.exe を経由すると、プロファイルで指定された初期ディレクトリへカレントディレクトリが変わってしまう。そうすると、カレントディレクトリにあるファイルなどを操作したい場合都合が悪い。 内蔵コマンド clone の場合は nyagos の --chdir というオプションでカレントディレクトリを伝えて、今のディレクトリへ戻るということができたが、任意のコマンドではそうもいかない。

そこで、カレントディレクトリは環境変数 %CURRENTDIRECTORY% に保存し、バッチファイル自身を wt.exe で起動し、その中で %CURRENTDIRECTORY% に移動してから、対象のコマンドを起動させるようにした。

対象のコマンド名だが、wt.exe 起動後だと %PATH% が変わってしまい呼び出せない場合がある。そこで、wt.exe 呼び出し前に where %1 で求めたフルパスに差し替えておく。

また、バッチファイル自身も同様に呼び出せなくなってしまう場合があるので、wt に渡す時は %~dpnx0 でフルパス化しておく。 ( そうしておかないと、...\newtab.cmd vim hoge とかすると、相対パスが狂ってしまう )

バッチファイルは最後に exit /b 0 で終了している。WindowsTerminal は実行したコマンドが 0 以外のエラーコードで終了すると、エラー画面を出して PAUSE してしまう。Ctrl-D を押下すれば閉じられるが、みっともないので明示的に 0 で終わっておいたほうがいいだろう

一応、ここまでした結果、newtab vim hoge とか..\newtab htnblog edit など、ほぼ期待どおり動くようになった。よしよし