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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top