56 votes

Vim avec Powershell

J'utilise gvim sous Windows.

Dans mon _vimrc j'ai ajouté :

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

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

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

Si j'exécute cette fonction (:Test), je vois des caractères absurdes (caractères ASCII autres que des chiffres ou des lettres).

Si j'utilise cmd comme interpréteur de commandes, cela fonctionne (sans le -name), donc le problème semble être d'obtenir la sortie de powershell dans vim.

Il est intéressant de noter que cela fonctionne très bien :

:!dir -name

Tout comme ceci :

:r !dir -name

UPDATE : confirmant le comportement mentionné par David

Si vous exécutez les commandes set mentionnées ci-dessus dans le fichier _vimrc, :Test produit des résultats absurdes. En revanche, si vous les exécutez directement dans vim et non dans _vimrc, :Test fonctionne comme prévu.

J'ai également essayé d'utiliser iconv au cas où il s'agirait d'un problème d'encodage :

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

Mais cela n'a pas fait de différence. Il se peut que j'utilise les mauvais types d'encodage.

Quelqu'un sait comment faire pour que cela fonctionne ?

1 votes

J'ai juste pensé que ce serait tellement cool. Imaginez la puissance/flexibilité !

1 votes

Serait-ce un problème d'encodage ? Powershell utilise Unicode s'il pense que la cible est un fichier. Essayez -encoding ASCII comme commutateur pour Powershell.

0 votes

Une idée de comment je peux faire passer ce commutateur dans Vim ?

25voto

Nathan Hartley Points 1115

C'est un peu une pirouette, mais ce qui suit fonctionne dans Vim 7.2. Remarquez que j'exécute Powershell dans une session CMD.

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

Testé avec les...

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

17voto

actf Points 303

J'ai rencontré un problème similaire à celui décrit par de nombreuses personnes ici.

Plus précisément, l'appel

:set shell=powershell

manuellement à partir de vim permettait à powershell de fonctionner correctement, mais dès que j'ajoutais :

set shell=powershell

à mon fichier vimrc, j'obtiendrais l'erreur "Impossible d'ouvrir le fichier temporaire ....". "

Le problème est que par défaut, lorsque le shell est modifié, vim définit automatiquement shellxquote à ", ce qui signifie que les commandes du shell ressembleront à ce qui suit :

 powershell -c "cmd > tmpfile"

Alors que cette commande doit ressembler à ceci, pour que vim puisse lire le fichier temporaire :

 powershell -c "cmd" > tmpfile

Le fait de mettre shellquote à " dans mon fichier vimrc et de désactiver shellxquote (c'est-à-dire de le mettre à un espace vide) semble résoudre tous mes problèmes :

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

J'ai également essayé d'aller plus loin et de créer un script pour vim en utilisant l'appel system() : system() avec powershell dans vim

4voto

Adrian Points 1505

Je pense que le problème est que Powershell utilise l'encodage natif des chaînes de caractères pour .NET, qui est UTF-16 plus une marque d'ordre des octets.

Lorsqu'il s'agit de transférer des objets entre les commandes, ce n'est pas un problème. En revanche, c'est un véritable casse-tête pour les programmes externes.

Vous pouvez faire passer la sortie par out-file, qui prend en charge le changement d'encodage, mais qui formate toujours la sortie pour le terminal dans lequel il se trouve par défaut (arrgh !), donc des choses comme "Get-Process" seront tronquées avec des ellipses, etc. Vous pouvez cependant spécifier la largeur du terminal virtuel utilisé par Out-File.

Je ne suis pas sûr de l'utilité de cette information, mais elle éclaire un peu plus le problème.

3voto

Mark Schill Points 816

Essayez de remplacer

"dir \*vim\*"

avec

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

EDITAR: Essayez d'utiliser cmd.exe comme shell et mettez "powershell.exe" avant "-command".

2voto

David Mohundro Points 5158

Question intéressante - voici autre chose pour ajouter à la confusion. Sans modifier mon fichier .vimrc, si j'exécute ensuite les commandes suivantes dans gvim :

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

Il se comporte comme prévu !

Cependant, si je fais les mêmes changements dans mon fichier .vimrc (les options shell et shellcmdflag), l'exécution de :echo system("dir -name") renvoie les caractères absurdes !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X