2016-07-06 13 views
1

터미널 버퍼의 REPL과 상호 작용하는 Neovim 플러그인을 작업 중입니다. REPL에 명령을 보내고 응답을 복사하여 어떻게 든 사용자에게 표시 할 수 있기를 원합니다. 현재, 단말의 버퍼는 현재 vim 스크립트 기능이 종료 될 때까지 출력을 리프레시하지 않는 것, 그래서 않는 단일 기능, 예를 가질 수 없다 다음 get_response 기능은 단말의 버퍼와 협력으로Neovim 비동기 버퍼 대기

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

을 업데이트되기 전에.

현재 저는 neovim의 작업 제어 기능을 사용하고 있습니다.하지만 바닐라 빔으로 수행 할 수 있다면 더 좋습니다. 내가 edit 명령을 추가하려고했습니다

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

:

여기
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에 명령을 보내고있다 방법은 다음과 같습니다 여기

내가 터미널을 초기화하는 데 사용하고 코드입니다 새로 고침을하지만 REPL에서 작동하지 않는 것 같습니다.

REPL과 통신하기위한 코드는 here입니다. 프로세스를 관리하는 코드는 here입니다.

답변

3

:term 버퍼에서 TextChanged 처리기를 설정할 수 있습니다. 예 : 다음 코드는 s:on_response에 전체 :term 버퍼 내용을 전송 :

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

이전 TextChanged 이벤트가 일부 사용자 지정 논리를 필요로하기 때문에 "새로운"인 텍스트 알아내는. '[']마르크 올바르게 (내가 nvim 자동으로 할 수 있도록이 가능하다 모르겠지만, 나는 bug report을했다)에 :term 버퍼에 설정되어 있지 않습니다.

사용자가 정상 모드에있는 경우 TextChanged 만 (즉시 삽입 모드를 떠나시) 발사하는 것으로

.

TextChangedI (마지막에 I 통지) 삽입 모드에서 발사해야하지만 :term 작동하지 않습니다, 즉는 bug입니다.


또 다른 접근법은 사용자 타이머입니다 (: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()'는 실제로 필요한 부분입니다. –