Vim con Powershell


Estoy usando gvim en Windows.

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 ejecuto esta función (:Test) veo caracteres sin sentido (caracteres ASCII no numéricos/letras).

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

Curiosamente, esto funciona muy bien:

:!dir -name

Al igual que esto:

:r !dir -name

ACTUALIZACIÓN: confirmando el comportamiento mencionado por David

Si ejecuta los comandos set mencionados anteriormente en el _vimrc, :Test produce un sinsentido. Sin embargo, si los ejecuta directamente en vim en lugar de en el _vimrc,: Test funciona como se espera.

Además, he intentado usar iconv en caso de que fuera un problema de codificación:

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

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

¿Alguien sabe cómo hacer que esto funcione?

Author: Community, 2008-09-18

11 answers

Es un poco un truco, pero lo siguiente funciona en Vim 7.2. Observe que 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 lo siguiente...

  • :!dir -name
  • :call Test()
 23
Author: Nathan Hartley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 15:39:29

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

Específicamente, llamando

:set shell=powershell

Manualmente desde vim haría que powershell funcionara bien, pero tan pronto como agregué:

set shell=powershell

A mi archivo vimrc obtendría el error "No se puede abrir el archivo temporal .... "

El problema es que, por defecto, cuando se modifica el shell, vim automáticamente establece shellxquote en", lo que significa que los comandos del shell se verán como los siguientes:

 powershell -c "cmd > tmpfile"

Donde como este comando necesita tener este aspecto, para que vim lea el archivo temporal:

 powershell -c "cmd" > tmpfile

Establecer shellquote en " en mi archivo vimrc y desactivar shellxquote (es decir, configurarlo en un espacio en blanco) parece solucionar todos mis problemas:

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

También he intentado llevar esto más lejos y scripting vim un poco usando la llamada system (): system () con powershell en vim

 15
Author: actf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:19

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

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

Puede canalizar la salida a través de out-file, que admite cambiar la codificación, pero aún formatea la salida para el terminal en el que está por defecto (arrgh!), así que cosas como "Get-Process"se truncarán con elipses, etc. Usted sin embargo, puede especificar el ancho del terminal virtual que utiliza Out-File.

No estoy seguro de cuán útil es esta información, pero sí ilumina el problema un poco más.

 5
Author: Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-04 13:20:57

Intenta reemplazar

"dir \*vim\*"

Con

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

EDITAR: Intente usar cmd.exe como el shell y poner " powershell.exe "before" - command "

 3
Author: Mark Schill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 17:52:37

Pregunta interesante - aquí hay algo más para agregar a la confusión. Sin hacer ningún cambio en mi .archivo vimrc, si luego corro los siguientes comandos en gvim:

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

Se comporta como se espera!

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

 2
Author: David Mohundro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 13:19:10

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

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

set encoding=utf8

Editar : Sí, eso parece hacerlo. Probablemente quieras tener VIM por defecto a unicode de todos modos, en estos días...

 2
Author: Dan Fitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-29 17:31:22

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

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 
 2
Author: Mark Stanfill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-16 22:08:16

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

Este complemento Vim automatiza la creación de un archivo de script temporal, llamada de powershell a través de cmd.exe y pegar del resultado. No es tan agradable como un manejo adecuado de powershell por parte de vim, pero funciona.

 0
Author: Raoul Supercopter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-03 21:14:12

Inténtalo en su lugar set shellcmdflag=\ -c


Explicación:

Vim usa tempname() para generar una ruta de archivo temporal que system() lee.

Si & shell contiene 'sh' y & shellcmdflag comienza con' -' luego tempname() genera una ruta de archivo temporal con barras hacia adelante.

Así, si set shell=powershell set shellcmdflag=-c entonces Vim intentará leer un archivo temporal con barras que no se puede encontrar.

Un remedio es establecer en su lugar set shellcmdflag=\ -c es decir, agregue un espacio en blanco a & shellcmdflag para que el primer carácter ser ya no '-' y tempname () produce una ruta de archivo temporal con barras que puede encontrar system().


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

 0
Author: Enno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-16 07:58:42

Actf respuesta funciona para mí, pero debido a Powershell construido en DIFF (que es diferente de la de Linux) debe agregar esta línea a su perfil de Powershell para que diff funcione de nuevo en VIM:

Remove-Item Alias:diff -force
 0
Author: Lobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:01

No uso VIM, pero la salida predeterminada de Powershell es Unicode. El bloc de notas puede leer unicode, puede usarlo para ver si está obteniendo la salida que espera.

 -2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 18:02:24