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?

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...

1voto

Enno Punkte 238

Versuchen Sie stattdessen set shellcmdflag=\ -c


Erläuterung:

Vim benutzt tempname(), um einen Pfad für eine temporäre Datei zu erzeugen, den system() liest.

Wenn &shell 'sh' enthält und &shellcmdflag mit '-' beginnt beginnt, erzeugt tempname() einen Pfad für eine temporäre Datei mit Schrägstrichen.

Wenn also set shell=powershell set shellcmdflag=-c dann wird Vim versuchen, eine temporäre Datei mit Schrägstrichen zu lesen, die nicht gefunden werden kann.

Abhilfe kann man schaffen, indem man stattdessen set shellcmdflag=\ -c das heißt, fügen Sie ein Leerzeichen zu &shellcmdflag hinzu, so dass das erste Zeichen nicht mehr '-' ist und tempname() einen temporären Dateipfad mit rückwärts gerichteten Schrägstrichen erzeugt, der von system() gefunden werden kann.


Ich bemerkte auf der vim_dev-Mailingliste ( https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0 ), dass dies eine bessere Dokumentation verdient.

1voto

Mark Stanfill Punkte 36

Keine der Antworten auf dieser Seite hat mir geholfen, 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

1voto

Rafael Kitover Punkte 877

Kombinieren Sie die Antworten in diesem und dem zugehörigen Thread und fügen Sie Folgendes zu Ihrem $profile vorausgesetzt, Sie haben diffutils von chocolatey:

Remove-Item Alias:diff -force

Und fügen Sie Folgendes zu Ihrem ~/.vimrc :

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

sich vergewissern shellcmdflag ist genau wie abgebildet

Alle Beiträge zu diesen Lösungen stammen von den jeweiligen Autoren, dies ist lediglich ein Sammelbeitrag.

0voto

Raoul Supercopter Punkte 5046

Ich schlage eine hakelige Lösung vor. Sie löst das Problem nicht wirklich, aber sie erledigt die Aufgabe irgendwie.

Diese Vim-Plugin die Erstellung einer temporären Skriptdatei, den Aufruf der Powershell über cmd.exe und das Einfügen des Ergebnisses automatisieren. Es ist nicht so schön wie eine richtige Powershell-Behandlung von Vim, aber es funktioniert.

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