Update
普通に対応できる方法が見つかりました。
- 分割されたWindowやTabが残ったときは CTRL+SHIFT+W で閉じれる
- プロファイル>詳細設定にある、「プロファイルの終了動作」を「プロセスの終了、失敗、クラッシュ時に閉じる」にしておけば、そもそも残らない
はじめに
私は Windows環境を CLIで操作するのですが、いまだに cmd.exe1 を使っています。
ただ、Windows Terminalを使っていると exitしたときに Tabが残ってしまうことがあり ちょっと鬱陶しいです。
↓ こんなの
これは exitの、終了コードが指定されないとき、cmd.exeが最後に得ていた終了コードを返すという仕様があるためです。
直前に入力したコマンドがエラー終了していた場合等、このような形で Tabが残留することになります。
このとき Tabの × にマウスカーソルを重ねると 「タブを閉じる(Ctrl+F4)」 と表示されるのですが、単にCtrl+F4押しても閉じません。
Tabのタイトルをクリックしてフォーカスをそこに移すか、設定を入れる事で回避できますがマウスなりキー操作なりの追加操作が必要です。
EXITしたら 普通に消えて欲しいと思ったので、その方法です。
……もっと簡単に出来るんじゃない?って気もしてますので やり方あれば教えてください。
結論から
- Windows Terminal cmd.exeを /k doskey で マクロ設定を入れる
- マクロで EXIT=TYPE NUL & EXIT $* としてパラメータ無しEXITの終了コードを0にする
EXITを終了コード無しで実行したときに 0 で終了させる
やりたいのは、たったこれだけの事なので面倒臭がらずに
exit 0
と打てば良いのではないかと思いますが、
exitを素で叩くのは既に30年身体にしみついてしまった習慣なので変えられません。
「exitするときは exit 0」と、自分ルールを決めたとしても、
exitだけ叩いてしまい、残ったtabを見る度にイラっとするのが目に見えています。
ならバッチファイルでも作れば?と思いますが
@EXIT 0
これも内部コマンド優先なので exit.cmd は呼ばれないですし、
呼ばれたとしても exit.cmd の再帰ループが終わりません。
ではどうするかというと、
doskey
そう、doskeyです。
このコマンド、見る度に DOSかよ!山岡さん2にSM-DOSって叱られるよ!って思っちゃいますが、
素の cmd.exeで aliasを実現しようと思うとこれしかないのです。ksh3 とか無いし。
まずは Windows Terminalの設定で cmd.exe 起動時に doskey で macro を設定するようにします。
{
"commandline": "cmd.exe /k doskey /macrofile=\"%USERPROFILE%\\macros.txt\"",
"hidden": false,
"name": "CMD"
}
マクロで EXIT=EXIT 0
あとは 終了コードを0にして exit すれば良いだけですので、マクロの設定ファイルに一行追加
EXIT=EXIT 0
これで良いといえば良いのですが、これだと逆に エラー終了が出来ないです。
設定入れたのを忘れて exit 1 して「あれ、エラー終了にならない?」とかなる
ありえそうにもない未来を予想してしまいます。
私がやりたいのは パラメータを省略したときの EXIT 0 です。
ERRORLEVELを設定する
バッチファイル等で 終了コードを得るときは %ERRORLEVEL% と、環境変数参照のような書き方をします。
が、これはただの罠です。ERRORLEVELは 環境変数ではありません。
次の様なマクロを書いても目的は達成できません。
EXIT=SET ERRORLEVEL=0 & EXIT $*
それならと、こんな風に書いてみたのですが……
EXIT=CMD /C EXIT 0 & EXIT $*
なんか……これどうなん?
cmd.exe終わらせるために cmd.exeのプロセスを起動するの? 何それ?
と、心がざわつくのでもう少しなんとかしたいです。
そもそも CMD.EXEの内蔵コマンドって終了コード返さない事が結構あるし、
返すにしても 確実に 0 になるオペレーションって何か良い物が無いかな?と
思ってたどり着いたのが 以下です。
EXIT=TYPE NUL & EXIT $*
……TYPEなら内蔵コマンドだし。
この設定で、exitしたときに パラメータ指定をしなければ 0 で、
終了コードやオプションを指定したときは それに従って終了するようになります。
ちなみに文字数的には "CD ." で カレントフォルダへの移動も終了コードが設定されるので、
それでも良いかと思います。
おまけ
chocolatey使って パッケージをインストールするとき等、
いちいち管理者権限得るのに右クリックしてWindows Terminal開きなおすの面倒臭い。
という方は以下のadminマクロみたいなのも一緒に定義しておくと
管理者権限 Windows Terminalをコマンドで開けます。
ADMIN=powershell -command start-process wt -verb runas
-
Power-Shell は Scriptを書くときには強力で良いのですが、普段使うには少し鬱陶しく感じてしまうので……。 ↩
-
某漫画のキャラクター。mac狂信者。 ↩
-
Un*xのkshではありません。正式名称は KI-Shell だったかな?。vectorに残ってないかなと探してみたのですが見つかりませんでした ↩