2008-09-18 15 views
54

Estoy usando gvim en Windows.Vim con Powershell

En mi _vimrc He añadido:

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 se realiza esta función (Ensayo) Veo caracteres sin sentido (caracteres que no sean números/letras ASCII).

Si uso cmd como shell, funciona (sin el -name), por lo que el problema parece estar en obtener la salida de powershell en vim.

Curiosamente, esto funciona muy bien:

:!dir -name 

Como se hace esto:

:r !dir -name 

ACTUALIZACIÓN: comportamiento confirmando mencionado por David

Si ejecuta los comandos set mencionados anteriormente en el _vimrc,: la prueba produce tonterías. Sin embargo, si los ejecuta directamente en vim en lugar de en _vimrc,: la prueba funciona como se espera.

Además, he intentado utilizar iconv en caso de que se trataba de un problema de codificación:

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

Pero esto no hace ninguna diferencia. Sin embargo, podría estar usando los tipos de codificación equivocados.

¿Alguien sabe cómo hacer esto?

+1

Solo pensé que sería genial. ¡Imagina la potencia/flexibilidad! –

+1

¿Podría ser un problema de codificación? Powershell usa Unicode si cree que el objetivo es un archivo. Intenta codificar ASCII como un cambio a powershell. – nickd

+0

¿Alguna idea de cómo puedo haber pasado ese interruptor a través de Vim? –

Respuesta

23

Es un poco un truco, pero el siguiente funciona en Vim 7.2. Aviso, estoy ejecutando Powershell dentro de una sesión de 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 

probado con los siguientes ...

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

Trate de reemplazar

"dir \*vim\*" 

con

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

EDIT: Trate de usar cmd.exe como la cáscara y poner "powershell.exe" antes "-command"

-2

I no use VIM, pero la salida predeterminada de Powershell es Unicode. El bloc de notas puede leer unicode, puede usarlo para ver si está obteniendo el resultado esperado.

+1

Esta es una toma en la oscuridad, y en realidad no aborda el problema. Vim funciona bien con Unicode. –

2

Pregunta interesante - aquí hay algo más que añadir a la confusión. Sin hacer ningún cambio a mi archivo .vimrc, si a continuación, ejecute los siguientes comandos en gvim:

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

se comporta como se esperaba!

Si hago los mismos cambios en mi archivo .vimrc, sin embargo (el shell y las opciones de shellcmdflag), ejecutando: echo system ("dir -name") ¡devuelve los caracteres sin sentido!

0

Propongo una solución hackish. Realmente no resuelve el problema, pero hace el trabajo de alguna manera.

Este Vim plugin automatiza la creación de un archivo de script temporal, llama a powershell a través de cmd.exe y pega el resultado. No es tan bueno como un manejo de Powershell por vim, pero funciona.

5

Sospecho que el problema es que Powershell usa la codificación de cadena nativa para .NET, que es UTF-16 más una marca de orden de bytes.

Cuando está conectando objetos entre comandos no es un problema. Sin embargo, es un PITA total para programas externos.

Puede canalizar la salida a través de archivo externo, lo que sí admite cambiar la codificación, pero sigue formateando la salida del terminal por defecto (arrgh!), Por lo que cosas como "Get-Process" se truncarán con elipses, etc. Sin embargo, puede especificar el ancho del terminal virtual que usa Out-File.

No sé qué tan útil es esta información, pero sí esclarece el problema un poco más.

2

El código de ejemplo inicial funciona bien para mí cuando lo plop en vimrc.

Así que ahora estoy tratando de averiguar qué en mi vimrc lo está haciendo funcionar. Posiblemente:

set encoding=utf8 

Editar: Sí, eso parece hacerlo. Es probable que desee tener VIM predeterminado a unicode de todos modos, en estos días ...

15

me encontré con un problema similar descrito por muchos aquí.

Específicamente, llamando

:set shell=powershell 

manualmente desde dentro de vim causaría PowerShell para funcionar bien, pero tan pronto como añadí:

set shell=powershell 

a mi archivo vimrc me gustaría conseguir el error "No se puede para abrir el archivo temporal ... "

El problema es que, de forma predeterminada, cuando se modifica shell, vim establece automáticamente shellxquote en" lo que significa que los comandos de shell se verán li ke lo siguiente:

powershell -c "cmd > tmpfile" 

Donde como este comando debe tener este aspecto, con el fin de vim para leer el archivo temporal:

powershell -c "cmd" > tmpfile 

Configuración shellquote a "en mi archivo vimrc y shellxquote desarmado (es decirestableciéndolo en un espacio en blanco) parecen solucionar todos mis problemas:

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

También he intentado tomar este más allá y vim un poco de secuencias de comandos utilizando el sistema() llamada: system() with powershell in vim

0

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


Explicación:

Vim utiliza tempname() para generar una ruta de archivo temporal ese 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().


me comentó en la lista de correo vim_dev (https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0) que esto se merece una mejor documentación.

2

Ninguna de las respuestas en esta página funcionaba para mí hasta que encontré esta sugerencia en https://github.com/dougireton/mirror_pond/blob/master/vimrc - set shellxquote = [carácter de espacio] era la pieza faltante.

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 
+0

¿Qué significa "trabajo" aquí? ¿Puedes seleccionar líneas y '! Sort-object' them (reemplazando las líneas con las líneas ordenadas)? – Alan

0

actf respuesta funciona para mí, pero a causa de Powershell construido en DIFF (que es diferente de la de Linux uno) debe añadir esta línea a su perfil Powershell tener diff a trabajar de nuevo en VIM:

Remove-Item Alias:diff -force