Domanda

Sto usando gvim su Windows.

Nel mio _vimrc ho aggiunto:

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

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

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

Se l'esecuzione di questa funzione:Test) vedo una sciocchezza caratteri (non di numero/lettera di caratteri ASCII).

Se uso il cmd come la shell, funziona (senza nome), quindi il problema sembra essere con recupero di output da powershell in vim.

È interessante notare che, questo funziona alla grande:

:!dir -name

Come fa questo:

:r !dir -name

AGGIORNAMENTO: a conferma di comportamento riportato da David

Se si esegue il set di comandi di cui sopra, nel _vimrc, :uscite di Test sciocchezze.Tuttavia, se si esegue direttamente in vim invece che in _vimrc, :Test funziona come previsto.

Inoltre, ho provato con iconv nel caso fosse un problema di codifica:

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

Ma questo non fa alcuna differenza.Potrei essere un errato tipi di codifica, però.

Qualcuno sa come fare questo lavoro?

È stato utile?

Soluzione

È un po ' un hack, ma le seguenti opere in Vim 7.2.Avviso, sono in esecuzione Powershell all'interno di una sessione di 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

Testato con i seguenti...

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

Altri suggerimenti

Mi sono imbattuto in un problema simile descritto da molti qui.

In particolare, la chiamata

:set shell=powershell

manualmente dall'interno di vim causerebbe powershell per funzionare bene, ma non appena ho aggiunto:

set shell=powershell

a mio file vimrc ricevo l'errore "Impossibile aprire il file temp ...."

Il problema è che per impostazione predefinita quando la shell è modificato, vim imposta automaticamente shellxquote per " il che significa che i comandi di shell il seguente aspetto:

 powershell -c "cmd > tmpfile"

Dove questo comando ha bisogno di guardare come questo, in ordine per vim per leggere i file temp:

 powershell -c "cmd" > tmpfile

Impostazione shellquote di " in my file vimrc e disattivare shellxquote (es.impostazione di uno spazio vuoto) sembrano risolvere tutti i miei problemi:

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

Ho anche provato a prendere questo ulteriore e script vim un po ' utilizzando la chiamata a system ():system() con powershell in vim

Ho il sospetto che il problema è che Powershell utilizza il nativo Stringa di codifica per .NET, che è UTF-16 più un byte-order-mark.

Quando tubazioni di oggetti tra i comandi non è un problema.Si tratta di un totale PITA per programmi esterni però.

È possibile reindirizzare l'output attraverso l'file, che supporta la modifica della codifica, ma ancora formati di output per il terminale che è in default (arrgh!), quindi le cose come "Get-Process" tronca con i puntini di sospensione, etc.È possibile specificare la larghezza del terminale virtuale che Out-File usa però.

Non sono sicuro di quanto sia utile questa informazione è, ma non si illumina il problema un po ' di più.

Provare a sostituire

"dir \*vim\*"

con

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

EDIT: Provare a utilizzare cmd.exe come la shell e mettere "powershell.exe" prima di "comando"

Domanda interessante - qui è qualcos'altro da aggiungere alla confusione.Senza apportare modifiche al mio .file vimrc, se poi eseguire i seguenti comandi in gvim:

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

Si comporta come previsto!

Se faccio le stesse modifiche al mio .file vimrc, anche se (la shell e shellcmdflag opzioni), esecuzione :eco system("dir-name") restituisce i caratteri alterati!

Il primo esempio di codice funziona bene per me quando ho plop in vimrc.

Così ora sto cercando di capire che cosa, nel mio vimrc sta rendendo funzione.Possibilmente:

set encoding=utf8

Modifica:Yep, che sembra fare.Probabilmente si desidera avere VIM inadempiente unicode, comunque, in questi giorni...

Nessuna delle risposte su questa pagina sono stati a lavorare per me fino a quando ho trovato questo suggerimento da https://github.com/dougireton/mirror_pond/blob/master/vimrc - impostare shellxquote= [carattere di spazio] era il pezzo mancante.

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 

Vi propongo un hackish soluzione.In realtà non risolve il problema, ma non ottenere il lavoro fatto in qualche modo.

Questo Vim plugin automatizzare la creazione di una temporanea file di script powershell chiamata tramite cmd.exe e incolla del risultato.Non è così bello come un vero e proprio powershell la manipolazione da parte di vim, ma funziona.

Provare invece set shellcmdflag=\ -c


Spiegazione:

Vim utilizza tempname() per generare un file temp percorso di sistema() legge.

Se &shell contiene 'sh' e &shellcmdflag inizia con '-' quindi tempname() genera un file temp percorso con barre.

Quindi, se set shell=powershell set shellcmdflag=-c poi Vim cerca di leggere un file temp con barre che non può essere trovato.

Un rimedio è quello di impostare invece set shellcmdflag=\ -c che è, aggiungere uno spazio di &shellcmdflag in modo che il primo carattere non è più '-' e tempname() produce un file temp percorso a ritroso le barre che può essere trovato da sistema().


Ho commentato la vim_dev mailing list ( https://groups.google.com/forum/#!argomento/vim_dev/vTR05EZyfE0 che questo merita di meglio di documentazione.

actf la risposta per me funziona, ma a causa di Powershell costruito nel DIFF (che è diverso da e per Linux) è necessario aggiungere questa riga al tuo Powershell profilo diff a lavorare di nuovo in VIM:

Remove-Item Alias:diff -force

Io non uso VIM, ma Powershell output predefinito è Unicode.Notepad in grado di leggere unicode, è possibile utilizzarlo per vedere se si stanno ottenendo il risultato che si aspetta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top