標準愚痴出力

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

jujutsu v0.15.1 で、コミットログを gvim.exe で編集できなくなってしまった。

(注意:本件、解決したので、後日、対応方法をまとめます → (解決編) jujutsu v0.15.1 で、コミットログを gvim.exe で編集できなくなってしまった - 標準愚痴出力 )

jj commit を実行すると、gvim.exe がファイルを開かずに起動してしまう。:q で終了すると、jj は次のようにエラーメッセージを表示する。

$ jj commit
Error: Editor 'C:/Users/hymkor/scoop/apps/vim/current/gvim.exe' exited with an error
exit status 1

調査のため、環境変数 JJ_EDITOR に次のバッチファイル foo.cmd を登録してコミット操作を実行する

echo %1,%2,%3,%4,%5,%6
gvim "%1"
$ set JJ_EDITOR=%USERPROFILE%\foo.cmd
$ jj commit

$ echo \\?\C:\Users\hymkor\src\go-minimal-optional\.jj\repo\editor-tifUve.jjdescription,,,,,
\\?\C:\Users\hymkor\src\go-minimal-optional\.jj\repo\editor-tifUve.jjdescription,,,,,

$ gvim "\\?\C:\Users\hymkor\src\go-minimal-optional\.jj\repo\editor-tifUve.jjdescription"
Error: Editor 'C:\Users\hymkor\foo.cmd' exited with an error
exit status 1

コミットログを書く一時ファイルのパスが \\?\C:\... 形式のパス:DOSデバイスパス形式 になっていた。

  • コマンドラインから、同パスを gvim で起動すると症状は再現する
  • だが、メモ帳(notepad.exe)だと、問題なく編集できる

Windows では CON や AUX といったファイル名はディレクトリを問わずデバイスとして扱われるので、下手にアクセスするとアプリケーションがハングアップを起こしてしまう。だが、DOSデバイスパス形式 だと、普通のファイルとみなしてくれる。だから、jj が一時ファイル名の取り扱いを変えたのは理解は出来るし、notepad で開けるファイルであるから gvim で開けない方が悪いといえば悪いんだが…

とりあえず、こういうラッパーを書いて回避した。

jj_edit.cmd:

@ setlocal
@ set "PROMPT=$$ "
set "TARGET=%~1"
set "TARGET=%TARGET:\\?\=%"
"%EDITOR%" "%TARGET%"
@ exit /b %ERRORLEVEL%

環境変数 EDITOR には gvim.exe のフルパスを、環境変数 JJ_EDITOR の方に、このバッチファイルのフルパスを書く。これでコミットログが普通に書けるようになった。

しかし、これDOSデバイスパス形式 は一応まっとうな PATH なので、jj の不具合というわけでもない。かといって、vim にサポートしろというのも無理筋にも思える。どうしたもんかな