2011-09-30 5 views
5

Estoy intentando escribir una función simple en Vim para devolver los resultados de un comando powershell. Sin embargo, sigo recibiendo un galimatías en los resultados.sistema() con powershell en vim

Creo que esto puede ser un problema de codificación, pero como verá, el problema es extraño ya que "funciona de algún modo". Aunque no tengo ninguna solución al problema.

Con las siguientes opciones de shell no predeterminados establecidos en vim:

set shell=powershell 
set shellcmdflag=-c 

Dada la siguiente función:

function! Test() 
    let result = system("ls") 
    call setline(1, result) 
endfunction 

Cuando corro (de C: \ Windows):

:call Test() 

Lo siguiente se escribe en mi búfer:

^@^@ Directory: C:\Windows^@^@^@ Mode   LastWriteTime Length Name ^@------- 
....continues 

Sin embargo, cuando ejecuto el comando siguiente:

:r!ls 

le regreso exactamente lo que se espera (es decir, los resultados de PowerShell LS) Aún más interesante es cuando funciono con el comando:

:echo system("ls") 

Los resultados parecen correctos

He intentado modificar mi función original de la siguiente manera:

function! Test() 
    let result = system("ls") 
    echo result 
    call setline(1, result) 
endfunction 

y el valor echo de salida es exactamente lo que esperaría, pero todavía veo galimatías

También he intentado la siguiente modificación a m función y:

function! Test() 
    let result = system("ls") 
    let conv = iconv(result, "utf-8", &enc) 
    call setline(1, conv) 
endfunction 

Pero los resultados son exactamente los mismos (es decir incluyen los símbolos^@^@ y otros galimatías)

Supongo que lo que está sucediendo es que los cmds de powershell que se redirigen utilizando> producen salida utf-16, y vim no puede hacer frente a esto. Me sale el siguiente de PowerShell (archivo en este caso es el programa gnu32):

PS> ls > test 
PS> file test 
test; Little-endian UTF-16 Unicode text, with CRLF, CR line terminator 

También he intentado jugar con $ OutputEncoding, sin ningún éxito, como se describe aquí: http://blogs.msdn.com/b/powershell/archive/2006/12/11/outputencoding-to-the-rescue.aspx

Cualquiera ¿Tiene alguna idea de lo que estoy haciendo mal aquí?

+0

¿La respuesta a esta pregunta ayuda? http://stackoverflow.com/questions/94382/vim-with-powershell – Rynant

+0

@Rynant Revisé esa pregunta antes de publicarla, pero no pude encontrar nada allí que realmente me ayudara. Intenté el "truco" de ejecutar powershell a través de cmd como se describe en la respuesta de Nathan Hartley, pero me encuentro con el mismo problema. Creo que la raíz del problema es que el> operador de redirección en powershell escribe en un archivo en utf-16. Si pudiera encontrar una forma de obtener> ascii de salida, en su lugar, creo que eso resolvería el problema – actf

+0

No creo que esté devolviendo unicode cuando se ejecuta en su función. Si fuera así, verías mucho más^@ caracteres. En cambio, lo que creo que está viendo son representaciones del carácter de retorno de carro (0x0d) que se incluyen en el terminador de línea estándar de Windows (CR LF). En cuanto a cuando estás en PowerShell, el redirector es en realidad una abreviatura de Out-File, que de manera predeterminada es unicode. Intente reemplazar los caracteres CR (\ r) con una cadena vacía antes de mostrar el resultado. – Artomegus

Respuesta

2

Finalmente he descubierto esto.

La siguiente modificación a mi función hace casi exactamente lo que quiero:

function! Test() 
    let @r = system("ls") 
    put! r 
endfunction 

creo Artomegus es correcta, el problema es realmente el retorno de carro, y no un problema de codificación.

Como nota al margen, me encontré con problemas cuando tenía solamente lo siguiente en mi archivo .vimrc:

set shell=powershell 
set shellcmdflag=-c 

Con sólo estos ajustes cuando me encontré: llamada de prueba() Me gustaría obtener una error acerca de que Vim no puede leer el archivo temporal.

La solución a este problema es añadir lo siguiente a su archivo .vimrc:

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

Usted imprescindible establecer el shellquote ser \" y shellxquote ser un espacio en blanco (es decir, vacío) porque de forma predeterminada en windows, shellxquote se establece en \ "que anula el valor de shellquote. Esto es problemático cuando se usa la función del sistema, que ejecuta el programa vimrun.exe detrás de las escenas.

Esperemos que esto ayude a otra persona. Estuve atascado en esto por mucho tiempo, pero ahora PowerShell funciona perfectamente para mí con Vim.

1

Procurad, más bien set shellcmdflag=\ -c

Explicación:

Vim utiliza tempname() para generar una ruta de archivo temporal que el sistema() lee.

Si & cáscara contiene 'sh' y & shellcmdflag comienza con '-' continuación tempname() genera una ruta de archivo temporal con barras diagonales.

Por lo tanto, si set shell=powershell set shellcmdflag=-c continuación, Vim intentará leer un archivo temporal con barras diagonales que no se puede encontrar.

Un remedio es poner en su lugar set shellcmdflag=\ -c es decir, añadir un espacio en blanco para & shellcmdflag de manera que el primer carácter ya no es '-' y tempname() produce una ruta de archivo temporal con atrasadas barras que pueden ser encontrado por el sistema().

Cuestiones relacionadas