pagina oficial from cancel and vim powershell

oficial - vim get out



Vim con Powershell (11)

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

Así que ahora estoy tratando de descubrir 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 ...

Estoy usando gvim en Windows.

En mi _vimrc he agregado:

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 (: Prueba) veo caracteres sin sentido (caracteres ASCII sin número / letra).

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 genial:

:!dir -name

Como lo hace esto:

:r !dir -name

ACTUALIZACIÓN: comportamiento confirmado mencionado por David

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

Además, he intentado usar iconv en caso de que haya 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 equivocados.

¿Alguien sabe cómo hacer que esto funcione?


Es un truco, pero lo 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 lo siguiente ...

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

Intenta reemplazar

"dir /*vim/*"

con

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

EDITAR: Intente usar cmd.exe como el shell y ponga "powershell.exe" antes de "-command"


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 me sale el error "No se puede 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 como los siguientes:

powershell -c "cmd > tmpfile"

Donde este comando debe verse así, para que vim lea el archivo temporal:

powershell -c "cmd" > tmpfile

Al establecer "shellquote" en "en mi archivo vimrc y desactivar el 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 intenté llevar esto más allá y escribir vim un poco usando el sistema () call: system () con powershell en vim


Ninguna de las respuestas en esta página me funcionaba hasta que encontré esta sugerencia en 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://.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


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 el resultado esperado.


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

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

¡Se comporta como se esperaba!

Sin embargo, si realizo los mismos cambios en mi archivo .vimrc (las opciones shell y shellcmdflag), ejecutar: echo system ("dir -name") devuelve los caracteres sin sentido.


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

Este plugin de Vim 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.


Pruebe en su lugar set shellcmdflag=/ -c

Explicación:

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

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

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

Un remedio es establecer en su lugar set shellcmdflag=/ -c , es decir, agregar un espacio en blanco a & shellcmdflag para que el primer carácter ya no sea ''-'' y tempname () produzca una ruta de archivo temporal con barras invertidas que pueda encontrar el sistema ( )

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


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 un archivo externo, que sí permite 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 puntos suspensivos, etc. Sin embargo, puede especificar el ancho del terminal virtual que usa Out-File.

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


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

Remove-Item Alias:diff -force