Frage
Ich benutze gvim unter Windows.
In meinem _vimrc Ich habe 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ühren (: Test). Ich sehe unsinnige Zeichen (nicht Ziffern / Buchstaben ASCII-Zeichen)
Wenn ich als Shell cmd verwenden, funktioniert es (ohne die -name), so scheint das Problem zu sein mit von Powershell in vim bekommen ausgegeben.
Interessanterweise funktioniert dies sehr gut:
:!dir -name
Wie tut dies:
:r !dir -name
UPDATE: Bestätigung Verhalten von David
Wenn Sie die eingestellten Befehle ausführen oben in der _vimrc erwähnt: Test gibt Unsinn. Allerdings, wenn Sie sie in vim direkt ausführen, anstatt in der _vimrc.,: Test funktioniert wie erwartet
Auch ich habe versucht, den Fall mit iconv war es eine Codierung Problem:
:echo iconv( system("dir -name"), "unicode", &enc )
Aber das machte keinen Unterschied machen. Ich konnte zwar mit den falschen Codierungstypen sein.
Wer weiß, wie diese Arbeit zu machen?
Lösung
Es ist ein bisschen wie ein Hack, aber die folgenden Arbeiten in Vim 7.2. Beachten Sie, ich bin mit Powershell in einer CMD-Sitzung.
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 dem folgenden ...
-
:!dir -name
-
:call Test()
Andere Tipps
Ich lief in ein ähnliches Problem von vielen hier beschrieben.
Insbesondere Aufruf
:set shell=powershell
manuell von innen vim würde dazu führen, Powershell gut zu funktionieren, aber sobald ich hinzugefügt:
set shell=powershell
In meiner vimrc würde ich den Fehler „Kann temporäre Datei öffnen ....“
Das Problem ist, dass standardmäßig als Schale modifiziert wird, Vim stellt automatisch shellxquote zu "was bedeutet, dass Shell-Befehle wie folgt aussehen:
powershell -c "cmd > tmpfile"
Wo, wie dieser Befehl wie folgt aussehen muss, um für vim die temporäre Datei zu lesen:
powershell -c "cmd" > tmpfile
Einstellung shellquote auf "in meiner vimrc und Entschärfen shellxquote (das heißt es auf einem leeren Raum Einstellung) scheinen alle meine Probleme zu beheben:
set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=
Ich habe auch versucht, diese weiter und Scripting vim nehmen ein wenig mit dem System () Aufruf: system () mit Powershell in vim
Ich vermute, dass das Problem ist, dass Powershell die native String-Codierung für .NET verwendet, die UTF-16 plus eine Byte-Reihenfolge-Marke.
Wenn es Keder Objekte zwischen den Befehlen ist, ist es kein Problem. Es ist insgesamt PITA für externe Programme aber.
Sie können die Ausgabe durch out-Datei, die Unterstützung der Codierung tut ändern, aber formatiert noch die Ausgabe für den Terminal, das es standardmäßig in ist (arrgh!), So Dinge wie „Get-Process“ mit Ellipsen gestutzt werden usw. Sie können die Breite des virtuellen Terminal angeben, die Out-File obwohl verwendet.
Nicht sicher, wie nützlich diese Informationen, aber es funktioniert beleuchtet das Problem ein bisschen mehr.
Versuchen Sie ersetzen
"dir \*vim\*"
mit
" -command { dir \*vim\* }"
EDIT: Versuchen Sie cmd.exe als Shell verwenden und setzen "powershell.exe" vor "-Befehl"
Interessante Frage - hier ist etwas anderes zur Verwirrung hinzuzufügen. Ohne Änderungen an meine .vimrc Datei zu machen, wenn ich dann die folgenden Befehle in gvim ausführen:
:set shell=powershell.exe
:set shellcmdflag=-noprofile
:echo system("dir -name")
Es verhält sich wie erwartet!
Wenn ich mache die gleichen Änderungen an meine .vimrc Datei, obwohl (die Schale und shellcmdflag Optionen), Laufen: echo-System ( „dir -name“) gibt die unsinnigen Zeichen
Der erste Beispielcode funktioniert gut für mich, wenn ich es in vimrc plumpsen.
So, jetzt versuche ich, um herauszufinden, was in meinem vimrc ist es Funktion zu machen. Möglich:
set encoding=utf8
Bearbeiten : Ja, das scheint es zu tun. Sie wollen wahrscheinlich VIM haben säumige sowieso Unicode, in diesen Tagen ...
Keine der Antworten auf dieser Seite für mich arbeiten, bis ich diesen Hinweis von https : //github.com/dougireton/mirror_pond/blob/master/vimrc - set shellxquote = [Leerzeichen] war das fehlende Stück
.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
Ich schlage vor, eine hackish Lösung. Es ist nicht wirklich das Problem zu lösen, aber es die Aufgabe irgendwie getan.
Die Vim-Plugin die Erstellung einer temporären Skriptdatei automatisieren , Power Anruf durch cmd.exe und Einfügen des Ergebnisses. Es ist nicht so schön wie eine richtige Powershell von vim Handhabung, aber es funktioniert.
Versuchen Sie stattdessen
set shellcmdflag=\ -c
Erklärung:
Vim verwendet tempname () eine temporäre Datei Pfad, dieses System zu erzeugen () liest.
Wenn & Shell enthält 'sh' und & shellcmdflag beginnt mit '-' dann erzeugt Pfad eine temporäre Datei tempname () mit Schrägstrichen.
Wenn also
set shell=powershell
set shellcmdflag=-c
dann wird Vim versuchen, eine temporäre Datei zu lesen, mit Slashes dass
kann nicht gefunden werden.
Eine Abhilfe ist, anstatt zu setzen
set shellcmdflag=\ -c
das heißt, fügen Sie ein Leerzeichen shellcmdflag auf & so dass das erste Zeichen
ist nicht mehr ‚-‘ und tempname () erzeugt einen temporären Dateipfad mit Rückwärts
Schrägstriche, die von System gefunden werden () können.
Ich bemerkte auf der vim_dev Mailingliste ( https://groups.google. com / forum / #! Thema / vim_dev / vTR05EZyfE0 ), dass diese Dokumentation besser verdient.
ACTF Antwort funktioniert für mich, aber wegen der Powershell in DIFF gebaut (die aus dem Linux ist anders) Sie muss diese Zeile in Ihrem Profil hinzufügen Powershell diff haben funktioniert wieder in VIM:
Remove-Item Alias:diff -force
Ich benutze keine VIM aber Powershell-Standardausgabe ist Unicode. Notepad kann Unicode lesen, können Sie es verwenden könnte, um zu sehen, ob Sie die Ausgabe bekommen Sie erwarten.