【问题标题】:Neovim asynchronous buffer waitingNeovim 异步缓冲区等待
【发布时间】:2016-07-06 04:14:14
【问题描述】:

我正在开发一个与终端缓冲区中的 REPL 交互的 Neovim 插件。我希望能够向 REPL 发送命令,复制响应,并以某种方式将其显示给用户。目前,在当前 vimscript 函数终止之前,终端缓冲区似乎不会刷新输出,所以我没有一个函数可以这样做,例如:

function! plugin#eval(str)
    call s:send_to_repl(str)
    echomsg s:get_response()
endfunction

因为get_response 函数在更新之前正在使用终端缓冲区。

目前,我正在使用 neovim 的作业控制,不过如果这可以在 vanilla vim 中完成,那就更好了。

这是我用来初始化终端的代码:

function! s:start_buffer(height)
    set bufhidden=hide
    set noswapfile
    set buftype=nofile
    set hidden
    terminal! stack ghci --with-ghc intero
    let l:buffer_id = bufnr('%')
    let g:intero_job_id = b:terminal_job_id
endfunction

这是我将命令发送到 REPL 的方式:

function! s:send(str)
    call jobsend(g:intero_job_id, add([a:str], ''))
endfunction

我尝试添加 edit 命令来刷新,但这似乎在 REPL 中不起作用。

与 REPL 通信的代码是 here。管理进程的代码是here

【问题讨论】:

    标签: vim neovim


    【解决方案1】:

    :term 缓冲区中,您可以设置TextChanged 处理程序。例如。以下代码将整个:term 缓冲区内容发送到s:on_response

    autocmd TextChanged <buffer> call <SID>on_response(getline(1,'$'))
    

    从之前的TextChanged 事件中找出哪些文本是“新的”需要一些自定义逻辑。 '['] 标记未正确设置在 :term 缓冲区中(我不确定 nvim 自动执行此操作是否可行,但我创建了 bug report)。

    请注意,TextChanged 仅在用户处于正常模式时才会触发(离开插入模式时也会立即触发)。

    TextChangedI(注意末尾的I)应该在插入模式下触发,但它不适用于:term,那是bug


    另一种方法是使用用户计时器(请参阅:help timer_start)。这是一个每秒调用s:on_reponse(timer_id) 的计时器:

    call timer_start(1000, '<SID>on_response', {'repeat':-1})
    

    但这并不理想,因为您需要保留终端和计时器 ID 的映射(或遍历所有 :terminal 缓冲区并检查其内容)。


    我为jobattach() 函数创建了一个feature request,它允许将on_stdout 处理程序附加到现有作业(而jobstart() 仅将处理程序添加到 作业)。然后可以使用它附加到任何:term 缓冲区的b:terminal_job_id

    【讨论】:

    • 嗯,TextChanged autocmd 并没有达到我的预期。它似乎只在用户光标当前位于终端缓冲区时触发。立即查看jobattach
    • jobattach 还不存在——这将是一个功能请求。
    • @ephrion 我添加了另一个使用计时器的建议。但可能jobattach() 才是真正需要的。
    • @ephiron 在github.com/neovim/neovim/issues/5023 bfredl 中指出,您可以使用termopen() 来附加on_stdout 处理程序,就像使用普通的jobstart() 一样。因此,只要您的插件能够控制创建 :term 缓冲区,这应该会有所帮助。
    • 这非常有帮助,谢谢!感谢您提出功能请求。
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2023-02-11
    • 2017-04-20
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-07-07
    • 2016-03-25
    相关资源
    最近更新 更多