我正在研究与终端缓冲区中的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中似乎不起作用。
在: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] 删除。
我来说两句