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?
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.