2016-07-06 22 views
1

私は端末バッファ内のREPLとやりとりするNeovimプラグインに取り組んでいます。私は、REPLにコマンドを送信し、応答をコピーして何らかの形でそれをユーザーに表示できるようにしたいと考えています。現在、ターミナルバッファは、現在のvimscript機能が終了するまで出力をリフレッシュしていないようですので、私はありません、単一の機能、例えば持つことはできません。get_response機能は、端末のバッファに取り組んでいるようNeovim非同期バッファ待ち

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

をそれが更新される前に。

現在、私はneovimのジョブコントロールを使用していますが、これがバニラの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です。

答えて

3

:termバッファでは、TextChangedハンドラを設定できます。例えば。次のコードs:on_responseに全体:termバッファの内容を送信します。

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

以前TextChangedイベントはいくつかのカスタム・ロジックが必要になりますので、「新」であるテキスト考え出します。 '[']のマークが:termバッファに正しく設定されていません(nvimが自動的に実行されることは確かではありませんが、私はbug reportとしました)。

TextChangedは、ユーザーが通常モードになっている場合のみ起動します(挿入モードを終了するとすぐに発生します)。

TextChangedIは(最後にIに気づく)、挿入モードで発射すべきであるが、それはそれはbugだ、:termでは動作しません。


もう1つの方法は、ユーザータイマーです(:help timer_start参照)。ここでは毎秒s:on_reponse(timer_id)を呼び出しタイマーです:

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

しかし、あなたは端子とタイマIDのマップを維持する必要がある(またはすべて:terminalバッファを反復処理し、その内容を確認してください)になるので、これは理想的ではありません。


私は(jobstart()のみ新しいジョブにハンドラを追加する一方で)既存のジョブへon_stdoutハンドラをアタッチできるようになるjobattach()機能のためfeature requestを作りました。これを使用してb:terminal_job_idのいずれかの:termバッファーを添付することができます。

+0

ええと、 'TextChanged'' autocmdは私が期待していることを全くしません。ユーザーのカーソルが現在ターミナルバッファに置かれているときだけ起動するように見えます。今すぐ 'jobattach'をチェックアウトすると – ephrion

+1

' jobattach'はまだ存在しません。これは機能要求です。 –

+1

@ephrionタイマーを使って別の提案を追加しました。しかしおそらく 'jobattach()'は本当に必要なものです。 –

関連する問題