Powerline: Добавить поддержку NeoVim

Созданный на 27 янв. 2015  ·  23Комментарии  ·  Источник: powerline/powerline

Я понимаю, что это может быть не сразу осуществимо из-за все еще нестабильного характера NeoVim, но я все равно хотел бы сделать запрос.

Во-первых, powerline не работает, когда пытается получить доступ к методу bindeval, который NeoVim не поддерживает. Я попытался выполнить некоторую начальную отладку и обнаружил, что Powerline полагается на API Python Vim 7.4, когда он обнаруживает версию выше 703. NeoVim сообщает как версию 704 прямо сейчас, но не добавил поддержку Vim 7.4 Python API (см. Обсуждение neovim / neovim # 1898), который, по-видимому, включает метод bindeval. После попытки обойти это, изменив проверку версии Powerline, я все еще вижу следующую проблему:

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

Я не уверен, что здесь происходит, что он не может найти "powerline". Выполнение :py import sys; print sys.path кажется, указывает на то, что можно найти правильные пути, и я могу выполнить :py import powerline без жалоб.

Для справки, я использую последнюю версию NeoVim (NVIM 0.0.0-alpha + 201501262108) в Mac OS 10.10 с Python 2.7, установленным через homebrew, и Powerline 2.0, установленным через pip.

Хотите поддержать этот выпуск? Разместите на нем награду! Мы принимаем награды через Bountysource .

cvim enhancement

Самый полезный комментарий

Не могли бы вы просто перестать спамить этот отчет об ошибке с бесполезными «+1». Просто используйте функцию "реакция" на github в первом посте.

Все 23 Комментарий

@abstiles powerline который не найден, не имеет ничего общего с модулем powerline . Это экземпляр класса powerline.vim.VimPowerline который, как ожидается, будет находиться в модуле __main__ . Если

python foo = 1

добавит переменную foo к чему-то _другому_, тогда привязки модуля __main__ не будут работать. Но в любом случае вам не следует пытаться использовать привязки для старого Vim, потому что сама причина того, что pyeval было добавлено в первую очередь, заключается в том, что другие способы обходятся чертовски медленно (ну, они не такие медленные для powerline, потому что я написал их для передачи файлов с нескольких КиБ на несколько МиБ за один оборот, и линия электропередачи никогда не была близка к этой скорости передачи данных, но по-прежнему существует много накладных расходов для сброса строк). NeoVim использует msgpack поверх сокетов, и это будет намного медленнее. Я не собирался добавлять поддержку NeoVim в ближайшее время, потому что это требует серьезного переписывания привязок Vim, поскольку

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

хорошо, но

&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

(во всех случаях: повторяется для каждой функции сегмента, которая пытается использовать какой-либо интерфейс с Vim) нет, и мне не нужны тесты, чтобы сказать, что это не сработает.

Единственный альтернативный подход, который я вижу, это

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

, но, как вы видите, будет задержка между вычислением данных, необходимых для NeoVim, и их отображением. В этом случае может показаться, что я могу позволить себе подождать, пока вычисленные данные будут обработаны, поэтому задержки не будет, но я не уверен. Перепрошивка нужна в любом случае.

Существует также альтернатива, когда функция строки состояния постоянно вычисляет вещи и отправляет их в powerline, а powerline постоянно отправляет обновления в строку состояния, когда они готовы, но это ничем не отличается от того, как функции сегментов должны быть переписаны, и этот вариант скорее несовместим с Vim.

Некоторые элементы в списке могут быть заменены событиями NeoVim, что выполняется немного быстрее.

Разве нет способа хотя бы заставить это работать, даже если оно не работает оптимально? Я попытался перебросить условные обозначения версии с 703 на 704 , но все, что у меня получилось, было:

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

Вместо:

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

Если я добавлю тест для hasattr(vim, 'bindeval') перед вызовами bindeval , у которых их нет, я просто получаю:

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

Итак, мне интересно, какие именно функции не работают и / или работает ли <= 703 в настоящее время, и если да, то как правильно заставить Powerline использовать старые привязки с NeoVim.

NeoVim _не_ поддерживает полный API Python даже начиная с версии 7.0. Есть патч для powerline, который я использовал, чтобы заставить его работать, чтобы измерить производительность, и это больше, чем просто добавление нескольких if s. Т.е. см. Neovim / python-client # 85, neovim / python-client # 84, neovim / python-client # 87.

Ах да, некрасиво. Спасибо за ссылки.

Я не заметил никакой новой активности по этой проблеме или связанным с ней вопросам Neovim. Есть ли просто непримиримые различия между Neovim и Powerline, такие что Powerline не планирует поддерживать Neovim?

Я хотел бы знать, видите ли вы какую-либо надежду на решение проблем здесь, или я должен отказаться от своей надежды на использование Powerline в Neovim.

Могу ли я также проголосовать за эту функцию?

Есть ли хорошая альтернатива powerline, работающая с neovim?

@phiche проверьте https://github.com/bling/vim-airline

Хороший! Это работает! Спасибо @aarobc!

Очень сложно выбрать между неовим и powerline ...
+ ∞

@ code-hunger vim-Airlines предлагает функции, аналогичные функциям Powerline, и прекрасно работает с neovim.

@kierun, спасибо, похоже, он выполняет ту же работу.

Единственным недостатком авиакомпании является то, что вам нужно настраивать ее отдельно от powerline, и если вы уже используете powerline в bash, weechat / irssi, tmux и т. Д., Это немного раздражает.

@Goddard Взгляните на это:

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

Вышеупомянутые проекты генерируют сценарии для bash, zsh, fish и tmux, а сгенерированный сценарий представляет собой собственный код, который не вызывает никаких внешних программ, таких как python.

Я перехожу на nvim и хотел бы увидеть для него поддержку Powerline.

Не могли бы вы просто перестать спамить этот отчет об ошибке с бесполезными «+1». Просто используйте функцию "реакция" на github в первом посте.

Точно так же вы можете вернуться и удалить свои комментарии «+1», чтобы упростить отслеживание этой проблемы.

Итак, сейчас 2019 год (почти 2020 год), а я все еще получаю эту ошибку. Есть ли способ заставить Powerline работать в nvim или это только vim?

@vegerot Я vim- airlines, которая работает "из коробки" и может быть установлена ​​с помощью dein или других менеджеров плагинов ...

5 1/2 лет, а все еще не работает? Есть ли обновленная информация о статусе этого или вероятность того, что это сработает в какой-то момент в будущем?

5 1/2 лет, а все еще не работает? Есть ли обновленная информация о статусе этого или вероятность того, что это сработает в какой-то момент в будущем?

К сожалению, пока нет прогресса в поддержке NeoVim, и, глядя на оригинальные комментарии @ ZyX-I по этой проблеме, я не очень оптимистичен в отношении будущего. Возможно, NeoVim тем временем изменил что-то, касающееся поддержки Python (чего я не знаю), так что имеет смысл взглянуть на это еще раз; если нет, и если они этого не сделают, я не очень оптимистичен, что поддержка NeoVim будет добавлена ​​(по крайней мере, мной) в ближайшем будущем, извините.

Несвязанный: я просто удалил множество комментариев «+1», чтобы сделать эту проблему более читаемой.

Есть ли способ хотя бы скрыть эту ошибку? В моем случае я хочу иметь как neovim, так и vim с powerline.

Есть ли способ хотя бы скрыть эту ошибку? В моем случае я хочу иметь как neovim, так и vim с powerline.

Вы можете попробовать следующее: в вашем .vimrc поместите весь связанный с Powerline код в блок if !has('nvim') ... endif .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги