Powerline: Agregar soporte para NeoVim

Creado en 27 ene. 2015  ·  23Comentarios  ·  Fuente: powerline/powerline

Entiendo que esto puede no ser factible de inmediato debido a la naturaleza aún inestable de NeoVim, pero me gustaría hacer la solicitud de todos modos.

Primero, powerline falla cuando intenta acceder al método bindeval que NeoVim no admite. Intenté hacer una depuración inicial y descubrí que Powerline se basa en la API de Python 7.4 de Vim cuando detecta una versión superior a 703. NeoVim informa como la versión 704 en este momento, pero no ha agregado soporte para la API de Python 7.4 de Vim (ver discusión sobre neovim / neovim # 1898), que aparentemente incluye el método bindeval. Después de intentar solucionar este problema modificando la verificación de la versión de powerline, sigo viendo el siguiente problema:

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

No estoy seguro de qué está pasando aquí que no puede encontrar "powerline". Ejecutar :py import sys; print sys.path parece indicar que se pueden encontrar las rutas correctas, y puedo ejecutar :py import powerline sin quejarme.

Para que conste, estoy ejecutando la última versión de NeoVim (NVIM 0.0.0-alpha + 201501262108) en Mac OS 10.10, con Python 2.7 instalado a través de homebrew y powerline 2.0 instalado a través de pip.

¿Quiere respaldar este problema? ¡Publique una recompensa por él! Aceptamos recompensas a través de Bountysource .

cvim enhancement

Comentario más útil

¿Podrías dejar de enviar spam a este informe de error con un "+1" inútil? Simplemente use la función de github de "reacción" en la primera publicación.

Todos 23 comentarios

@abstiles powerline que no se encuentra no tiene nada que ver con el módulo powerline . Es una instancia de la clase powerline.vim.VimPowerline que se espera que viva en el módulo __main__ . Si

python foo = 1

agregará la variable foo a algo _otro_ entonces los enlaces del módulo __main__ no funcionarán. Pero en cualquier caso, no deberías intentar usar enlaces para Vim antiguo porque la razón misma por la que pyeval se agregó en primer lugar es que otras formas son jodidamente lentas (bueno, no son tan lentas para powerline porque escribí utilizarlos para transmitir archivos (unos pocos KiB a unos pocos MiB en un turno y la línea eléctrica nunca estuvo cerca de esa velocidad de datos, pero todavía hay mucha sobrecarga para descargar cadenas). NeoVim está usando msgpack sobre sockets y esto será mucho más lento. No iba a agregar soporte de NeoVim en el corto plazo porque esto necesita una reescritura importante de los enlaces de Vim ya que

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

está bien, pero

&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

(en todos los casos: función repetida para cada segmento que se molesta en usar alguna interfaz con Vim) no lo es y no necesito pruebas para decir que esto no funcionaría.

El único enfoque alternativo que puedo ver es

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
                                                                                                |
…

, pero como puede ver, habrá un retraso entre el momento en que se calculan las cosas necesarias de NeoVim y el momento en que se muestran. En este caso, puede parecer que puedo permitirme esperar hasta que se procesen las cosas calculadas, por lo que no habrá retraso, pero no estoy seguro. En cualquier caso, es necesario volver a escribir.

También existe una alternativa en la que la función de línea de estado calcula constantemente las cosas y las envía a la línea eléctrica y la línea eléctrica envía constantemente actualizaciones a una línea de estado cuando están listas, pero esto no es diferente en cuanto a cómo las funciones de segmento deben reescribirse y esta variante no es compatible. con Vim.

Algunas cosas en una lista pueden reemplazarse con eventos de NeoVim, que es un poco más rápido.

¿No hay alguna manera de al menos hacer que esto funcione, incluso si no funciona de manera óptima? Intenté subir los condicionales de la versión de 703 a 704 , pero todo lo que me atrapó fue:

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

En 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",)

Si agrego una prueba para hasattr(vim, 'bindeval') antes de las llamadas a bindeval que no tienen ninguna, solo obtengo:

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

Entonces, me pregunto exactamente qué características están rotas y / o si <= 703 funcionan actualmente, y si es así, cómo forzar correctamente a Powerline para que use los enlaces más antiguos con NeoVim.

NeoVim _no_ es compatible con la API de Python completa incluso a partir de la versión 7.0. Hay un parche para powerline que utilicé para que funcione para tener algunas medidas de rendimiento y es más que simplemente agregar algunos if s. Es decir, vea neovim / python-client # 85, neovim / python-client # 84, neovim / python-client # 87.

Oh cierto, feo. Gracias por los enlaces.

No he notado ninguna actividad nueva sobre este problema o los problemas relacionados con Neovim. ¿Hay diferencias simplemente irreconciliables entre Neovim y Powerline de modo que no hay planes para que Powerline apoye a Neovim?

Me gustaría saber si ve alguna esperanza de resolver los problemas aquí, o si debería renunciar a mi esperanza de usar Powerline en Neovim.

¿Puedo agregar mi voto para esta función también?

¿Existe una buena alternativa a la línea eléctrica que funcione con neovim?

@phiche echa un vistazo a https://github.com/bling/vim-airline

¡Bonito! ¡Eso funciona! ¡Gracias @aarobc!

Es muy difícil elegir entre neovim y powerline ...
+ ∞

@ code-hunger vim- airlines ofrece una funcionalidad similar a la línea eléctrica y funciona bien con neovim.

@kierun gracias, parece que hace el mismo trabajo.

El único inconveniente de la línea aérea es que tienes que configurarlo aparte de powerline y si ya usas powerline en bash, weechat / irssi, tmux, etc ... es un poco molesto hacerlo.

@Goddard Echa un vistazo a estos:

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

Los proyectos anteriores generan scripts para bash, zsh, fish y tmux y el script generado es un código nativo que no llama a ningún programa externo como python.

Estoy haciendo el cambio a nvim y me encantaría ver el soporte de Powerline.

¿Podrías dejar de enviar spam a este informe de error con un "+1" inútil? Simplemente use la función de github de "reacción" en la primera publicación.

Del mismo modo, puede volver atrás y eliminar sus comentarios "+1" para facilitar el seguimiento de este problema.

Así que estamos en 2019 (casi en 2020) y sigo recibiendo este error. ¿Existe una solución alternativa para que Powerline funcione en nvim, o es exclusivo de vim?

@vegerot Me di por vencido hace años y comencé a usar vim- airlines, que funciona de

¿5 años y medio y todavía no funciona en absoluto? ¿Existe una actualización sobre el estado de esto o la probabilidad de que funcione en algún momento en el futuro?

¿5 años y medio y todavía no funciona en absoluto? ¿Existe una actualización sobre el estado de esto o la probabilidad de que funcione en algún momento en el futuro?

Lamentablemente, no hay avances en el apoyo a NeoVim y, mirando los comentarios originales de @ ZyX-I sobre este tema, no soy muy optimista con respecto al futuro. Quizás NeoVim cambió algo con respecto a su compatibilidad con Python mientras tanto (que no sé), por lo que tendría sentido volver a ver esto; si no y si no lo hacen, no soy muy optimista de que se agregará soporte para NeoVim (al menos por mí) en un futuro cercano, lo siento.

No relacionado: Acabo de eliminar la gran cantidad de comentarios "+1" para que este problema sea algo más legible.

¿Hay alguna forma de ocultar este error al menos? En mi caso quiero tener tanto neovim como vim con powerline.

¿Hay alguna forma de ocultar este error al menos? En mi caso quiero tener tanto neovim como vim con powerline.

Puede intentar lo siguiente: En su .vimrc , coloque todo el código relacionado con la línea eléctrica en un bloque if !has('nvim') ... endif .

¿Fue útil esta página
0 / 5 - 0 calificaciones