続・PowerShellのdiff

今日は、PowerShellからVimを起動する、ではなく、
VimからPowerShellを使う時のお話です。


コマンドプロンプトではなく、PowerShellを使うときは、
みなさん、大体こんな設定をしているのではないか、と思います。

set shell=powershell
set shellcmdflag=-c
set shellpipe=>
set shellredir=>


しかし、この設定だけでは問題があります。


具体的に、問題だと思う点は、Vimで差分を取る機能が動作しなくなる点です。
上の設定でPowerShellを使うと、例えば、次のコマンドがエラーになります。

:vertical diffsplit cmd.txt




何故エラーになるか。
それは、「about_Command_Search」のヘルプを見ていただければわかりますが、

man about_Command_Search


PowerShellでのコマンドの検索順が

1. 現在定義されているエイリアス
2. 現在定義されている関数
3. path 環境変数に指定されている任意のディレクトリに置かれているコマンド

と定義されているので、


「diff.exe」ではなく、エイリアス「diff」に割り当てられている「Compare-Object」が使われ、
結果の形式が違うため、エラーになるのです。
(似たような機能だが、PowerShellはオブジェクトを結果として返す。)

alias diff

#> CommandType Name Definition
#> ----------- ---- ----------
#> Alias       diff Compare-Object




他にも危なそうなエイリアスが多数定義されていて、
外部コマンドを使うVimエディタプラグインでは問題が発生するものもあるでしょう。


かといって、エイリアスを単純に外すこともできません。
そうしたら、普段の操作が不便になってしまいます。


ではどうするか?
それは、また、今度。

おまけ

問題になりそうなエイリアスは、これらです。
結果が返ってくるコマンドが危ない!!(プラグイン作者にとって)

CommandType Name    Definition
----------- ----    ----------
Alias       diff    Compare-Object
Alias       cat     Get-Content
Alias       ls      Get-ChildItem
Alias       pwd     Get-Location
Alias       echo    Write-Output