簡體   English   中英

將 asyncio 與 neovim 遠程插件一起使用

[英]Use asyncio with neovim remote plugins

我想寫一個 vim 插件來監聽服務器發送的事件 由於我最熟悉 python3 並使用 neovim,我認為使用neovim 遠程插件 API是一個好主意。

顯然,監聽來自網絡的消息不能是阻塞的,因此必須以某種方式涉及 asyncio。 但我無法弄清楚如何將兩者結合起來。 我必須在某個地方運行事件循環。 但是,pynvim 已經運行了自己的事件循環,所以我可能應該加入它。

@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 中不可用(在我使它異步之前)。

不確定這是否是最好的答案,但這是我發現的工作:

asyncio似乎保留了對當前循環的引用,因此asyncio.ensure_future()可用於調度異步代碼。 但是,如果該異步代碼嘗試訪問 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM