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