Neovim异步缓冲区等待

phr

我正在研究与终端缓冲区中的REPL交互的Neovim插件。我希望能够向REPL发送命令,复制响应并以某种方式将其显示给用户。当前,在当前的vimscript函数终止之前,终端缓冲区似乎不会刷新输出,因此我无法使用单个函数来刷新输出,例如:

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

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

目前,我正在使用neovim的作业控制,尽管如果可以在vani 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通信的代码在这里用于管理过程的代码在此处

贾斯汀·凯斯(Justin M.Keyes)

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

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

要弄清楚自上一个TextChanged事件以来哪个文本是“新的”,将需要一些自定义逻辑。'[']标记不正确的设置:term缓冲区(我不知道这是可行的nvim,自动做的,但我犯了一个错误报告)。

请注意,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()功能允许将on_stdout处理程序附加到现有作业(而jobstart()仅将处理程序添加到作业)。然后可以将其用于附加b:terminal_job_id任何:term缓冲区。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章