58 Stimmen

Vim mit Powershell

Ich verwende gvim unter Windows.

In meiner _vimrc habe ich hinzugefügt:

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

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

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

Wenn ich diese Funktion ausführe (:Test), sehe ich unsinnige Zeichen (Nicht-Zahlen/Buchstaben-ASCII-Zeichen).

Wenn ich cmd als Shell verwende, funktioniert es (ohne -name), also scheint das Problem darin zu liegen, die Ausgabe von powershell in vim zu bekommen.

Interessanterweise funktioniert das hervorragend:

:!dir -name

Das gilt auch hier:

:r !dir -name

UPDATE: Bestätigung des Verhaltens, das von David

Wenn Sie die oben genannten set-Befehle in der _vimrc ausführen, gibt :Test Unsinn aus. Wenn Sie sie jedoch direkt in vim statt in der _vimrc ausführen, funktioniert :Test wie erwartet.

Ich habe auch versucht, iconv zu verwenden, falls es ein Kodierungsproblem war:

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

Aber das machte keinen Unterschied. Ich könnte allerdings die falschen Kodierungstypen verwenden.

Weiß jemand, wie das funktionieren kann?

26voto

Nathan Hartley Punkte 3713

Es ist ein bisschen ein Hack, aber das Folgende funktioniert in Vim 7.2. Beachten Sie, dass ich Powershell innerhalb einer CMD-Sitzung ausführe.

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

Getestet mit den folgenden...

  • :!dir -name
  • :call Test()

18voto

actf Punkte 519

Ich bin auf ein ähnliches Problem gestoßen, das von vielen hier beschrieben wurde.

Konkret heißt das, dass

:set shell=powershell

manuell aus vim heraus würde die Powershell gut funktionieren, aber sobald ich:

set shell=powershell

zu meiner vimrc-Datei hinzufügen, würde ich die Fehlermeldung "Unable to open temp file ...." erhalten. "

Das Problem ist, dass vim standardmäßig, wenn die Shell modifiziert wird, automatisch shellxquote auf " setzt, was bedeutet, dass die Shell-Befehle wie die folgenden aussehen werden:

 powershell -c "cmd > tmpfile"

Wobei dieser Befehl wie folgt aussehen muss, damit vim die temp-Datei lesen kann:

 powershell -c "cmd" > tmpfile

Das Setzen von shellquote auf " in meiner vimrc-Datei und das Zurücksetzen von shellxquote (d.h. das Setzen auf ein Leerzeichen) scheinen alle meine Probleme zu lösen:

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

Ich habe auch versucht, dies weiter zu verfolgen und vim mit dem system()-Aufruf ein wenig zu skripten: system() mit powershell in vim

4voto

Adrian Punkte 2136

Ich vermute, dass das Problem darin besteht, dass Powershell die systemeigene String-Kodierung für .NET verwendet, d. h. UTF-16 plus eine Byte-Order-Markierung.

Wenn es sich um die Weiterleitung von Objekten zwischen Befehlen handelt, ist das kein Problem. Für externe Programme ist es jedoch ein totales Ärgernis.

Sie können die Ausgabe durch out-file leiten, das zwar die Änderung der Kodierung unterstützt, aber die Ausgabe immer noch für das Terminal formatiert, in dem es sich standardmäßig befindet (arrgh!), so dass Dinge wie "Get-Process" mit Ellipsen usw. abgeschnitten werden. Sie können jedoch die Breite des virtuellen Terminals angeben, das Out-File verwendet.

Ich bin mir nicht sicher, wie nützlich diese Information ist, aber sie beleuchtet das Problem ein wenig mehr.

3voto

Mark Schill Punkte 2078

Versuchen Sie zu ersetzen

"dir \*vim\*"

mit

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

EDIT: Versuchen Sie cmd.exe als Shell zu verwenden und geben Sie "powershell.exe" vor "-command" ein.

2voto

Dan Fitch Punkte 2430

Der ursprüngliche Beispielcode funktioniert für mich gut, wenn ich ihn in vimrc einfüge.

Also versuche ich jetzt herauszufinden, was in meiner vimrc dafür sorgt, dass es funktioniert. Möglicherweise:

set encoding=utf8

Editar : Ja, das scheint zu klappen. Heutzutage wollen Sie wahrscheinlich sowieso, dass VIM standardmäßig auf Unicode eingestellt ist...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X