Используйте asyncio с удаленными плагинами neovim - PullRequest
0 голосов
/ 28 мая 2020

Я хочу написать плагин vim, который будет прослушивать события, отправленные сервером . Поскольку я наиболее свободно владею python3 и использую neovim, я подумал, что было бы неплохо использовать API удаленного плагина neovim .

Очевидно, что прослушивание сообщений из сети должно не блокировать, поэтому нужно как-то задействовать asyncio. Но я не мог понять, как их совместить. Где-то надо было бы событие l oop запустить. Однако pynvim уже запускает собственное событие l oop, поэтому мне, вероятно, следует подключиться к нему.

@pynvim.plugin
class MyPlugin:
    def __init__(self, nvim):
        self.nvim = nvim

    @pynvim.command('Connect', nargs='1')
    async def connect(self, args):
        url = base_url + args[0]
        async with sse_client.EventSource(url) as event_source:
            for raw in event_source:
                try:
                    msg = json.loads(raw)
                except json.JSONDecodeError:
                    continue
                do_something(msg)

Этот пример не работает. Команда Connect недоступна в neovim (она была до того, как я сделал ее asyn c).

1 Ответ

0 голосов
/ 29 мая 2020

Не уверен, что это лучший ответ, но я обнаружил, что работает именно так:

asyncio похоже, сохраняет ссылку на текущий l oop, поэтому asyncio.ensure_future() может быть используется для планирования кода asyn c. Однако этот асинхронный c код сработает sh, если попытается получить доступ к внутренним компонентам vim. Для этого вам нужно вызвать еще один обратный вызов с помощью nvim.async_call().

@pynvim.plugin
class MyPlugin:
    def __init__(self, nvim):
        self.nvim = nvim

    async def _connect(self, url):
        async with sse_client.EventSource(url) as event_source:
            for raw in event_source:
                try:
                    msg = json.loads(raw)
                except json.JSONDecodeError:
                    continue
                self.nvim.async_call(do_something, msg)

    @pynvim.command('Connect', nargs='1')
    def connect(self, args):
        url = base_url + args[0]
        asyncio.ensure_future(self._connect(url))
...