Pergunta

Eu estou usando gvim no Windows.

Na minha _vimrc eu adicionei:

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 eu executar esta função (: Test). Vejo caracteres sem sentido (número não / carta caracteres ASCII)

Se eu usar cmd como o shell, ele funciona (sem o -nome), de modo que o problema parece ser com a obtenção de saída do PowerShell para vim.

Curiosamente, isso funciona muito bem:

:!dir -name

Como faz isso:

:r !dir -name

UPDATE: comportamento confirmando mencionado por David

Se você executar os comandos set mencionados acima na _vimrc,: Teste saídas absurdo. No entanto, se você executá-los diretamente no vim em vez de no _vimrc,:. Teste funciona como esperado

Além disso, eu tentei usar iconv no caso, foi um problema de codificação:

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

Mas isso não faz qualquer diferença. Eu poderia estar usando os tipos de codificação errada embora.

conheço ninguém como fazer este trabalho?

Foi útil?

Solução

É um pouco de um truque, mas a seguir funciona no vim 7.2. Aviso, eu estou correndo PowerShell dentro de uma sessão 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

Testado com o seguinte ...

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

Outras dicas

Eu corri para um problema semelhante descrito por muitos aqui.

Especificamente, chamando

:set shell=powershell

manualmente a partir do vim causaria PowerShell para funcionar bem, mas assim que eu adicionei:

set shell=powershell

para o meu arquivo vimrc eu iria receber o erro "Não é possível arquivo temporário aberto ...."

O problema é que, por padrão, quando shell é modificado, o Vim automaticamente conjuntos shellxquote para "o que significa que comandos shell será parecido com o seguinte:

 powershell -c "cmd > tmpfile"

Onde como este comando necessidades para olhar como este, para que vim para ler o arquivo temporário:

 powershell -c "cmd" > tmpfile

Configuração shellquote para "no meu arquivo vimrc e shellxquote desactivação (ou seja, definindo-o como um espaço em branco) parecem corrigir todos os meus problemas:

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

Eu também tentei tomar este vim mais e scripting um pouco usando o sistema () chamada: () com o PowerShell no vim

I suspeitar que o problema é que Powershell utiliza a cadeia nativa que codifica para a NET, que é UTF-16 acrescido de um fim-de marca de byte.

Quando se da tubulação objetos entre os comandos não é um problema. É uma PITA total para os programas externos embora.

Você pode canalizar a saída através de out-arquivo, que suporta alterar a codificação, mas ainda formata a saída para o terminal que está em por padrão (arrgh!), Então coisas como "Get-Process" irá truncar com elipses , etc. Você pode especificar a largura do terminal virtual que usa out-File embora.

Não tenho certeza o quão útil esta informação é, mas faz iluminar o problema um pouco mais.

Tente substituir

"dir \*vim\*"

com

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

EDIT: Tente usar cmd.exe como o shell e colocar "powershell.exe" antes "-command"

Pergunta interessante - aqui é outra coisa para aumentar a confusão. Sem fazer qualquer alteração para o meu arquivo .vimrc, se eu, em seguida, execute os seguintes comandos em gvim:

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

Ele se comporta como esperado!

Se eu fizer as mesmas alterações no meu arquivo .vimrc, embora (a casca e opções shellcmdflag), correndo: sistema de eco ( "dir -name") retorna os caracteres sem sentido

O código de exemplo inicial funciona bem para mim quando eu plop-lo em vimrc.

Então agora eu estou tentando descobrir o que no meu vimrc é torná-lo funcionar. Possivelmente:

set encoding=utf8

Editar : Sim, isso parece fazer isso. Você provavelmente vai querer ter VIM falta para unicode de qualquer maneira, nos dias de hoje ...

Nenhuma das respostas nesta página foram trabalhar para mim até que eu encontrei esta dica de https :. //github.com/dougireton/mirror_pond/blob/master/vimrc - conjunto shellxquote = [caractere de espaço] era a peça que faltava

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 

proponho uma solução hackish. Realmente não resolver o problema, mas fazer o trabalho de alguma forma.

Este Vim plug-in automatizar a criação de um arquivo de script temporários , PowerShell chamar através cmd.exe e colar do resultado. Não é tão bom como uma manipulação por vim PowerShell adequada, mas funciona.

Tente vez set shellcmdflag=\ -c


Explicação:

Vim usa tempname () para gerar um caminho de arquivo temporário que o sistema () lê.

Se & shell contém 'sh' e & shellcmdflag começa com '-' em seguida, tempname () gera um caminho de arquivo temporário com barras.

Assim, se set shell=powershell set shellcmdflag=-c em seguida, o Vim tentará ler um arquivo temporário com barras que não pode ser encontrado.

A solução é definir vez set shellcmdflag=\ -c isto é, adicionar um espaço em branco para & shellcmdflag de modo que o primeiro caractere não é mais '-' e tempname () produz um caminho de arquivo temporário com backward barras que podem ser encontrados pelo sistema ().


Eu comentou sobre a lista de discussão vim_dev ( https://groups.google. com / forum / #! tópico / vim_dev / vTR05EZyfE0 ) que este merece melhor documentação.

ACTF resposta trabalha para mim, mas por causa de Powershell construído em DIFF (que é diferente do Linux) você deve adicionar esta linha ao seu perfil Powershell ter diff trabalhar novamente na VIM:

Remove-Item Alias:diff -force

Não uso de VIM mas Powershell saída padrão é Unicode. Notepad pode ler unicode, você pode usá-lo para ver se você está recebendo a saída esperada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top