56

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

更新:デビッド が言及した動作の確認

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

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

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

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

これを機能させる方法を知っている人はいますか?

4

13 に答える 13

25

ちょっとしたハックですが、Vim7.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()
于 2010-08-05T21:38:59.793 に答える
17

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

具体的には、

: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 を少しスクリプト化してみました: vim で powershell を使用した system()

于 2011-10-20T03:16:18.917 に答える
3

交換してみてください

"dir \*vim\*"

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

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

于 2008-09-18T17:29:43.803 に答える
2

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

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

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

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

于 2008-09-19T13:19:10.830 に答える
2

最初のサンプル コードは、vimrc でプロットすると問題なく動作します。

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

set encoding=utf8

編集:はい、それはそれを行うようです。とにかく、最近では VIM をデフォルトで Unicode にしたいでしょう...

于 2010-03-29T17:31:22.777 に答える
1

このスレッドと関連するスレッドの回答を組み合わせて、 chocolatey から$profileインストールしたと仮定して以下を追加します。diffutils

Remove-Item Alias:diff -force

そして、あなたのに以下を追加してください~/.vimrc

if (has('win32') || has('gui_win32')) && executable('pwsh')
    set shell=pwsh
    set shellcmdflag=\ -ExecutionPolicy\ RemoteSigned\ -NoProfile\ -Nologo\ -NonInteractive\ -Command
endif

shellcmdflag正確に示されていることを確認してください

これらのソリューションはすべて、それぞれの貢献者の功績によるものです。これは単なる集約投稿です。

于 2020-01-23T01:05:51.977 に答える
0

ハック的な解決策を提案します。問題が本当に解決するわけではありませんが、何とか仕事を成し遂げることができます。

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

于 2009-11-03T21:14:12.707 に答える
-2

私は VIM を使用していませんが、Powershell のデフォルトの出力は Unicode です。メモ帳はユニコードを読み取ることができます。これを使用して、期待どおりの出力が得られているかどうかを確認できます。

于 2008-09-18T18:02:24.787 に答える