我正在研究一個與終端緩衝區中的REPL交互的Neovim插件。我希望能夠向REPL發送命令,複製響應並以某種方式將其顯示給用戶。目前,終端緩衝似乎並不刷新輸出,直到當前的Vimscript函數結束,所以我不能有一個單一的功能呢,比如:Neovim異步緩衝區等待
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。
嗯,'TextChanged'' autocmd'不完全符合我的期望。它似乎只在用戶的光標當前位於終端緩衝區時觸發。現在檢出'jobattach' – ephrion
'jobattach'尚不存在 - 這將是一個功能請求。 –
@ephrion我使用計時器添加了另一個建議。但可能'jobattach()'是真正需要的。 –