gvim 8.2 は、Windows 10 PowerShell で Git コミット メッセージを編集するときに画面を再描画しません。

gvim 8.2 は、Windows 10 PowerShell で Git コミット メッセージを編集するときに画面を再描画しません。

vimWindows 10にインストールしましたchocolateyPowerShell でファイルを編集すると、すべて正常に動作します。コピー&ペーストもできましたしかし、gitコミットメッセージを編集すると、vim画面が正しく再描画されません。画面の再描画を強制する更新したテキストはきちんと表示されますが、それは非常に煩わしいです。

git以下で使用するように設定しましたvim:

git config --global core.editor vim

どうすれば適切に動作させることができますかvim?

答え1

Git for Windows には、ディストリビューションの一部として独自のバージョンの Vim が同梱されています。これは、デフォルトのエディターが必要であり、Git のような Unix プログラムのデフォルトのエディターは通常 であるためですvi

エディターを として指定するとvim、使用されるバージョンは の最初にあるバージョンになりますPATH。カスタム バージョンを使用するように指定していない場合は、おそらく Git for Windows バージョンになります。そのバージョンの Vim では、使用するターミナル タイプを指定するために環境変数を設定する必要があると思われますが、設定されていないため、正しくレンダリングされません。Microsoft ターミナル実装を使用している場合は、環境変数の値として をTERM使用する必要があると思われます。xterm-256colorTERM

Chocolatey によってインストールされたようなカスタム Vim バージョンを使用する場合は、それを前に置くかPATH、フルパスを指定する必要があります。Git はcore.editor構成オプションの値をシェルに渡すため、コマンドは POSIXsh実装の構文に準拠している必要があります。バックスラッシュはエスケープ文字です。したがって、プログラム名をスラッシュまたは一重引用符で囲む必要があります。

Vim のバージョンがグラフィカルである場合は、ターミナルから切り離されないようにするオプションが必要です-f。そうでない場合、Vim は起動してすぐにターミナルから切り離されるため、Git は Vim が生成したプロセスがすぐに終了することを認識します。そのプロセス (エディター) が終了したため、Git は編集が完了したと想定します。しかし、実際には何も編集していないため、Git はコミットを中止します。

答え2

要約

vim 実行ファイルへの直接の完全修飾パスを git に渡すと問題が解決しましたが、その理由はわかりません。

git config --global core.editor "'C:\tools\vim\vim82\vim.exe' -f -i NONE"

パスをシングルクォートで囲むことは重要ですgit。バックスラッシュを含むパスをどう処理するかが分からないからです。設定全体をダブルクォートで囲むことは重要です。そうしないとgitがコマンド-f -f NONEに適用されませんgit config-f -i NONEこの答え、それが何をするのかは分かりませんが、git commitそれがないと動作しませんでした。

フルパスを見つける方法

vimc:\windows\vim.batは、次のように入力するとpowershell起動するファイルを追加します。vimvim

PS C:\Users\heath> Get-Command vim

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     vim.bat                                            0.0.0.0    C:\windows\vim.bat

vim.bat非常に簡単です:

@echo off
rem -- Run Vim --
rem # uninstall key: vim82 #

setlocal
set VIM_EXE_DIR=C:\tools\vim\vim82
if exist "%VIM%\vim82\vim.exe" set VIM_EXE_DIR=%VIM%\vim82
if exist "%VIMRUNTIME%\vim.exe" set VIM_EXE_DIR=%VIMRUNTIME%

if not exist "%VIM_EXE_DIR%\vim.exe" (
    echo "%VIM_EXE_DIR%\vim.exe" not found
    goto :eof
)

"%VIM_EXE_DIR%\vim.exe"  %*

したがって、私の完全なvimパスはC:\tools\vim\vim82\vim.exe

関連情報