Question

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), des caractères sans signification (caractères ASCII non numériques) sont affichés.

Si j'utilise cmd en tant que shell, cela fonctionne (sans le nom -name), le problème semble donc être d'obtenir la sortie de powershell dans vim.

Fait intéressant, cela fonctionne très bien:

:!dir -name

Comme cela:

:r !dir -name

UPDATE: confirmant le comportement mentionné par David

Si vous exécutez les commandes définies mentionnées ci-dessus dans _vimrc,: Test génère un non-sens. Cependant, si vous les exécutez directement dans vim au lieu de _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 ne faisait aucune différence. Je pourrais utiliser les mauvais types d'encodage, cependant.

Quelqu'un sait comment faire ce travail?

Était-ce utile?

La solution

C’est un peu un bidouillage, mais ce qui suit fonctionne dans Vim 7.2. Notez que je lance Powershell au sein d’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 éléments suivants ...

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

Autres conseils

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

Plus précisément, appeler

:set shell=powershell

manuellement à partir de vim ferait fonctionner correctement PowerShell, mais dès que j'ai ajouté:

set shell=powershell

dans mon fichier vimrc, l'erreur "Impossible d'ouvrir le fichier temporaire ...."

Le problème est que par défaut, lorsque shell est modifié, vim définit automatiquement shellxquote sur " ce qui signifie que les commandes du shell vont ressembler à ceci:

 powershell -c "cmd > tmpfile"

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

 powershell -c "cmd" > tmpfile

Définition de shellquote sur " dans mon fichier vimrc et la suppression de shellxquote (c'est-à-dire le mettre dans un espace vide) semblent 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 d'écrire un peu de script vim en utilisant l'appel system (): system () avec powershell dans vim

Je soupçonne que le problème est que Powershell utilise le codage natif String pour .NET, qui est UTF-16 plus une marque d'ordre d'octets.

Quand il s'agit de canaliser des objets entre des commandes, ce n'est pas un problème. Cependant, il s’agit d’un PITA total pour les programmes externes.

Vous pouvez diriger la sortie via out-file, qui prend en charge la modification de l'encodage, mais continue à formater la sortie pour le terminal dans lequel il se trouve par défaut (arrgh!), par exemple, "Get-Process". tronquera avec des points de suspension, etc. Vous pouvez spécifier la largeur du terminal virtuel utilisé par Out-File.

Vous n'êtes pas sûr de l'utilité de ces informations, mais elles éclairent un peu plus le problème.

Essayez de remplacer

"dir \*vim\*"

avec

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

MODIFIER: essayez d'utiliser cmd.exe en tant que shell et ajoutez "powershell.exe". avant la "commande"

Question intéressante - voici quelque chose à ajouter à la confusion. Sans apporter de modifications à 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!

Si j'apporte les mêmes modifications à mon fichier .vimrc, cependant (les options shell et shellcmdflag), exécuter: echo system ("quot-dir") renvoie les caractères absurdes!

L'exemple de code initial fonctionne correctement pour moi lorsque je le plop dans vimrc.

Alors maintenant, j'essaie de comprendre ce qui le rend fonctionnel dans mon vimrc. Éventuellement:

set encoding=utf8

Modifier : Oui, cela semble le faire. Vous voulez probablement que VIM soit par défaut sur Unicode de toute façon, ces jours-ci ...

Aucune des réponses sur cette page ne fonctionnait pour moi tant que je n'avais pas trouvé cet indice de https : //github.com/dougireton/mirror_pond/blob/master/vimrc - set shellxquote = [caractère espace] était la pièce manquante.

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 

Je propose une solution bidon. Cela ne résout pas vraiment le problème, mais le travail est fait d'une manière ou d'une autre.

Ce plug-in Vim automatise la création d'un fichier de script temporaire. , appel de pouvoirs via cmd.exe et coller du résultat. Ce n’est pas aussi beau qu’un vrai PowerShell manipulé par vim, mais ça marche.

Essayez plutôt set shellcmdflag = \ -c

Explication:

Vim utilise tempname () pour générer un chemin de fichier temporaire lu par system ().

Si & amp shell contient 'sh' et & shellcmdflag commence par '-' puis tempname () génère un chemin de fichier temporaire avec des barres obliques.

Ainsi, si définir shell = PowerShell set shellcmdflag = -c alors Vim va essayer de lire un fichier temporaire avec des barres obliques qui introuvable.

Un remède consiste à définir à la place set shellcmdflag = \ -c c’est-à-dire ajouter un espace à & shellcmdflag pour que le premier caractère n'est plus '-' et tempname () produit un chemin de fichier temporaire avec retour barres obliques pouvant être trouvées par system ().

J'ai remarqué la liste de diffusion vim_dev ( https://groups.google. com / forum / #! topic / vim_dev / vTR05EZyfE0 ) cela mérite une meilleure documentation.

La

actf réponse fonctionne pour moi, mais grâce à Powershell construit en DIFF (différent de celui de Linux), vous devez ajouter cette ligne à votre profil Powershell pour que diff fonctionne à nouveau dans VIM:

Remove-Item Alias:diff -force

Je n'utilise pas de VIM, mais la sortie par défaut de Powershell est Unicode. Le Bloc-notes peut lire le code Unicode. Vous pouvez l'utiliser pour voir si vous obtenez le résultat attendu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top