Powerline: Adicionar suporte para NeoVim

Criado em 27 jan. 2015  ·  23Comentários  ·  Fonte: powerline/powerline

Eu entendo que isso pode não ser viável imediatamente devido à natureza ainda instável do NeoVim, mas gostaria de fazer a solicitação mesmo assim.

Primeiro, a linha de energia falha ao tentar acessar o método bindeval que o NeoVim não suporta. Eu tentei fazer uma depuração inicial e descobri que o Powerline depende da API Python 7.4 do Vim quando detecta uma versão superior a 703. NeoVim reporta como versão 704 agora, mas não adicionou suporte para API Python 7.4 do Vim (veja a discussão sobre neovim / neovim # 1898), que aparentemente inclui o método bindeval. Depois de tentar contornar isso modificando a verificação de versão do powerline, ainda estou vendo o seguinte problema:

Error detected while processing function PowerlinePyeval..provider#python#Call:
line    1:
NameError("name 'powerline' is not defined",)

Não tenho certeza do que está acontecendo aqui que ele não consegue encontrar "powerline". Executar :py import sys; print sys.path parece indicar que os caminhos corretos podem ser encontrados e posso executar :py import powerline sem reclamar.

Para registro, estou executando o NeoVim mais recente (NVIM 0.0.0-alpha + 201501262108) no Mac OS 10.10, com Python 2.7 instalado por homebrew e powerline 2.0 instalado por pip.

Quer apoiar este problema? Publique uma recompensa por isso! Aceitamos recompensas via Bountysource .

cvim enhancement

Comentários muito úteis

Você poderia simplesmente parar de enviar spam para este relatório de bug com o inútil "+1". Basta usar o recurso "reação" do github no primeiro post.

Todos 23 comentários

@abstiles powerline que não foi encontrado não tem nada a ver com o módulo powerline . É uma instância da classe powerline.vim.VimPowerline que se espera que viva no módulo __main__ . Se

python foo = 1

irá adicionar a variável foo a algo _outro_ então __main__ ligações do módulo não funcionarão. Mas, em qualquer caso, você não deve tentar usar vínculos para o Vim antigo porque o motivo pelo qual pyeval foi adicionado em primeiro lugar é que as outras formas são lentas pra caralho (bem, elas não são tão lentas para powerline porque eu escrevi para transmitir arquivos de alguns KiBs para alguns MiBs em uma volta e a linha de energia nunca esteve perto dessa taxa de dados, mas ainda há muita sobrecarga para despejar strings). NeoVim está usando msgpack em sockets e isso vai ser bem mais lento. Eu não adicionaria suporte a NeoVim tão cedo porque isso precisa de uma grande reescrita nas ligações do Vim desde

&statusline
   \/
pyeval
   \/
…
   \/
segment function
   \/
vim.eval
   \/
result
   \/
displayed statusline

está bem, mas

&statusline
  \/
:python          --------msgpack-rpc------>  … > segment function
                                                \/
vim_eval         <-------msgpack-rpc-------  vim.eval
  \/
eval result (C)  --------msgpack-rpc------>  result (Python)
                                                \/
displayed stl    <-------msgpack-rpc-------  segment function result

(em todos os casos: repetido para cada função de segmento que incomoda em usar alguma interface com o Vim) não é e não preciso de testes para dizer que isso não funcionaria.

A única abordagem alternativa que posso ver é

startup notification  -------msgpack-rpc------->  powerline
                                                     \/
                                                     …
                                                     \/
                                                  segment.startup
                                                     \/
&statusline function  <------msgpack-rpc--------  list of things needed from NeoVim
  \/
computed list of things ----------msgpack-rpc-----------------------------+
                                                                          |
&statusline                                                               |
  \/                                                                      |
:python (+computed list of things)  -------msgpack-rpc------->  renderer  |    ----->  … > segment function
                                                                   \/     \/                    \/
displayed statusline                <------msgpack-rpc--------  cached result                result
                                                                                                |
&statusline                                                               +---------------------+
  \/                                                                      |
:python (+computed list of things)  -------msgpack-rpc------->  renderer  |    ----->  … > segment function
                                                                   \/     \/                    \/
displayed statusline                <------msgpack-rpc--------  cached result                result
                                                                                                |
…

, mas como você pode ver, haverá um lapso entre o momento em que as coisas necessárias do NeoVim são calculadas e o momento em que são exibidas. Nesse caso, pode parecer que posso esperar até que as coisas computadas sejam processadas, então não haverá atraso, mas não tenho certeza. A reescrita é necessária em qualquer caso.

Há também uma alternativa onde a função statusline calcula constantemente as coisas e as envia para powerline e powerline envia constantemente de volta uma atualização para & statusline quando estão prontas, mas isso não é diferente em relação a como as funções de segmento precisam ser reescritas e esta variante não é compatível com Vim.

Algumas coisas em uma lista podem ser substituídas por eventos NeoVim, que são um pouco mais rápidos.

Não há alguma maneira de pelo menos fazer isso funcionar, mesmo que não tenha um desempenho ideal? Tentei aumentar as condicionais da versão de 703 para 704 , mas tudo o que consegui foi:

Error detected while processing function provider#python#Call:
line    1:
NameError("name 'powerline' is not defined",)

Em vez de:

Error detected while processing function provider#python#Call:
line    1:
AttributeError("'Nvim' object has no attribute 'bindeval'",)
NameError("name 'powerline_setup' is not defined",)
NameError("name 'powerline_setup' is not defined",)

Se eu adicionar um teste para hasattr(vim, 'bindeval') antes das chamadas para bindeval que não têm nenhum, eu apenas obtenho:

Error detected while processing function provider#python#Call:
line    1:
NvimError('Key not found',)

Portanto, estou me perguntando exatamente quais recursos estão quebrados e / ou se <= 703 funcionam atualmente e, em caso afirmativo, como forçar corretamente o Powerline a usar as ligações mais antigas com o NeoVim.

O NeoVim _não_ oferece suporte à API Python completa, mesmo a partir da versão 7.0. Existe um patch para powerline que usei para fazê-lo funcionar para ter algumas medições de desempenho e é mais do que apenas adicionar alguns if s. Ou seja, veja neovim / python-client # 85, neovim / python-client # 84, neovim / python-client # 87.

Oh certo, feio. Obrigado pelos links.

Não notei nenhuma atividade nova neste problema ou nos problemas relacionados ao Neovim. Existem diferenças simplesmente irreconciliáveis ​​entre o Neovim e o Powerline, de forma que não há planos para que o Powerline ofereça suporte ao Neovim?

Gostaria de saber se você vê alguma esperança de resolver os problemas aqui, ou se devo desistir de usar o Powerline no Neovim.

Posso adicionar meu voto para este recurso também?

Existe uma boa alternativa para powerline que funcione com o neovim?

Agradável! Isso funciona! Obrigado @aarobc!

Muito difícil escolher entre neovim e powerline ...
+ ∞

@ code-hunger vim-airline oferece funcionalidade semelhante ao powerline e funciona bem com o neovim.

@kierun obrigado, parece fazer exatamente o mesmo trabalho.

A única desvantagem com a companhia aérea é que você tem que configurá-lo separadamente do powerline e se você já usa o powerline no bash, weechat / irssi, tmux, etc ... é um pouco chato fazer isso.

@Goddard Dê uma olhada nestes:

https://github.com/edkolev/promptline.vim
https://github.com/edkolev/tmuxline.vim

Os projetos acima geram scripts para bash, zsh, fish e tmux e o script gerado é um código nativo que não chama nenhum programa externo como o python.

Estou mudando para nvim e adoraria ver o suporte do Powerline para ele.

Você poderia simplesmente parar de enviar spam para este relatório de bug com o inútil "+1". Basta usar o recurso "reação" do github no primeiro post.

Da mesma forma, você pode voltar e excluir seus comentários "+1" para tornar este problema mais fácil de acompanhar.

Então, estamos em 2019 (quase 2020) agora e ainda estou recebendo este erro. Existe uma solução alternativa para fazer o Powerline funcionar no nvim ou ele é exclusivo do vim?

@vegerot Desisti há muito tempo e comecei a usar o vim -irline que funciona fora da caixa e pode ser instalado com o dein ou outros gerenciadores de plug-ins ...

5 1/2 anos e ainda não funciona? Há uma atualização sobre o status disso ou a probabilidade de que funcione em algum momento no futuro?

5 1/2 anos e ainda não funciona? Há uma atualização sobre o status disso ou a probabilidade de que funcione em algum momento no futuro?

Infelizmente, não há progresso no sentido de apoiar a NeoVim e, olhando os comentários originais do @ ZyX-I sobre este assunto, não estou muito otimista em relação ao futuro. Talvez o NeoVim tenha mudado algo em relação ao seu suporte a python nesse ínterim (o que eu não sei), então faria sentido olhar para isso novamente; se não e se não o fizerem, não estou muito otimista de que o suporte NeoVim será adicionado (pelo menos por mim) em um futuro próximo, desculpe.

Não relacionado: acabei de remover a abundância de comentários “+1” para tornar este problema um pouco mais legível.

Existe uma maneira de esconder esse erro, pelo menos? No meu caso, quero ter o neovim e o vim com powerline.

Existe uma maneira de esconder esse erro, pelo menos? No meu caso, quero ter o neovim e o vim com powerline.

Você pode tentar o seguinte: Em seu .vimrc , coloque todos os códigos relacionados à linha de energia em um bloco if !has('nvim') ... endif .

Esta página foi útil?
0 / 5 - 0 avaliações