web-dev-qa-db-ja.com

PowerShellを使用したVim

Windowsでgvimを使用しています。

私の_vimrcに私は追加しました:

set Shell=powershell.exe
set shellcmdflag=-c
set shellpipe=>
set shellredir=>

function! Test()
  echo system("dir -name")
endfunction

command! -nargs=0 Test :call Test()

この関数(:Test)を実行すると、意味のない文字(非数字/文字ASCII文字))が表示されます。

シェルとしてcmdを使用すると、(-nameなしで)機能するため、Powershellからvimへの出力の取得に問題があるようです。

興味深いことに、これは素晴らしい働きをします:

:!dir -name

これもそうです:

:r !dir -name

UPDATE:David によって言及された動作を確認しています

_vimrcで上記のsetコマンドを実行すると、:Testはナンセンスを出力します。ただし、_vimrcではなくvimで直接実行すると、:Testは期待どおりに動作します。

また、エンコーディングの問題である場合に備えて、iconvを使用してみました。

:echo iconv( system("dir -name"), "unicode", &enc )

しかし、これは何の違いもありませんでした。ただし、間違ったエンコードタイプを使用している可能性があります。

誰でもこれを機能させる方法を知っていますか?

54
Kevin Berridge

少しハックですが、以下はVim 7.2で動作します。 CMDセッション内でPowershellを実行しています。

_if has("win32")
    set Shell=cmd.exe
    set shellcmdflag=/c\ powershell.exe\ -NoLogo\ -NoProfile\ -NonInteractive\ -ExecutionPolicy\ RemoteSigned
    set shellpipe=|
    set shellredir=>
endif

function! Test()
  echo system("dir -name")
endfunction
_

以下でテスト...

  • _:!dir -name_
  • :call Test()
24
Nathan Hartley

ここで多くの人が説明した同様の問題に遭遇しました。

具体的には、

:set Shell=powershell

vim内から手動でpowershellを正常に動作させることができますが、追加するとすぐに:

set Shell=powershell

vimrcファイルに「一時ファイルを開けません...」というエラーが表示されます。

問題は、シェルが変更されると、デフォルトでvimが自動的にshellxquoteを "に設定することです。つまり、シェルコマンドは次のようになります。

 powershell -c "cmd > tmpfile"

Vimが一時ファイルを読み取るために、このコマンドは次のようにする必要があります。

 powershell -c "cmd" > tmpfile

Vimrcファイルでshellquoteを "に設定し、shellxquoteを設定解除(つまり、空白に設定)すると、すべての問題が解決するようです。

set Shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=

私はこれをさらに試し、system()呼び出しを使用してvimを少しスクリプト化しました: system()with powershell with vim

15
actf

問題は、Powershellが.NETのネイティブの文字列エンコーディングを使用していることだと思います。これは、UTF-16とバイトオーダーマークです。

コマンド間でオブジェクトをパイピングする場合は問題ありません。ただし、これは外部プログラムの総PITAです。

エンコードの変更をサポートしているout-fileを介して出力をパイプすることができますが、デフォルトであるターミナルの出力はフォーマットされます(arrgh!)。 Out-Fileが使用する仮想端末の幅を指定できます。

この情報がどれほど役立つかはわかりませんが、問題をさらに明らかにします。

5
Adrian

交換してみてください

"dir \*vim\*"

 " -command { dir \*vim\* }"

編集: cmd.exeをシェルとして使用して、 "-command"の前に "powershell.exe"を配置してみてください

3
Mark Schill

興味深い質問-混乱に追加する他の何かがあります。 .vimrcファイルに変更を加えずに、gvimで次のコマンドを実行した場合:

:set Shell=powershell.exe
:set shellcmdflag=-noprofile
:echo system("dir -name")

期待どおりに動作します!

ただし、.vimrcファイルに同じ変更を加えた場合(Shellおよびshellcmdflagオプション)、: echo system( "dir -name")を実行すると、意味のない文字が返されます。

2
David Mohundro

https://github.com/dougireton/mirror_pond/blob/master/vimrc からこのヒントを見つけるまで、このページの回答はどれも機能しませんでした。= set shellxquote = [space character] was行方不明の作品。

if has("win32") || has("gui_win32") 
     if executable("PowerShell") 
        " Set PowerShell as the Shell for running external ! commands 
        " http://stackoverflow.com/questions/7605917/system-with-powershell-in-vim      
        set Shell=PowerShell 
        set shellcmdflag=-ExecutionPolicy\ RemoteSigned\ -Command 
        set shellquote=\" 
        " shellxquote must be a literal space character. 
        set shellxquote=  
   endif 
endif 
2
Mark Stanfill

Vimrcでそれをプロップすると、最初のサンプルコードはうまく機能します。

だから今私は私のvimrcで何が機能しているのかを理解しようとしています。おそらく:

set encoding=utf8

編集:はい、そうです。おそらく、とにかくVIMとにかくデフォルトでユニコードにしたい、最近...

2
Dan Fitch

ハックな解決策を提案します。それは本当に問題を解決するわけではありませんが、何とか仕事を終わらせます。

これは Vimプラグイン 一時的なスクリプトファイルの作成を自動化し、cmd.exeを介してpowershellを呼び出して結果を貼り付けます。 vimによる適切なpowershell処理ほどナイスではありませんが、動作します。

0

actf 答えは私には有効ですが、Powershellに組み込まれたDIFF(Linuxとは異なる)のため、VIMでdiffが再び機能するように、Powershellプロファイルに次の行を追加する必要があります。

Remove-Item Alias:diff -force
0
Lobo

代わりに試してくださいset shellcmdflag=\ -c


説明:

Vimはtempname()を使用して、system()が読み取る一時ファイルパスを生成します。

&Shellに「sh」が含まれ、&shellcmdflagが「-」で始まる場合、tempname()はスラッシュを含む一時ファイルのパスを生成します。

したがって、set Shell=powershell set shellcmdflag=-cの場合、Vimは、見つからないスラッシュを含む一時ファイルを読み取ろうとします。

解決策は、代わりにset shellcmdflag=\ -cを設定することです。つまり、&shellcmdflagに空白を追加して、最初の文字が「-」でなくなり、tempname()がsystem()で検出できるバックスラッシュ付きの一時ファイルパスを生成します。


Vim_devメーリングリスト( https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE )で、これはより優れたドキュメントに値すると述べました。

0
Enno