@@ -93,7 +93,12 @@ function! s:exit_callback(msg) abort
9393 if len (s: results )
9494 let view = winsaveview ()
9595 silent execute ' % delete'
96- call setline (1 , s: results )
96+ if has (' nvim' )
97+ " the -2 slicing is required to remove an extra new line
98+ call setline (1 , s: results [0 ][:-2 ])
99+ else
100+ call setline (1 , s: results )
101+ endif
97102 call winrestview (view )
98103 endif
99104
@@ -106,20 +111,35 @@ function! s:exit_callback(msg) abort
106111endfunction
107112
108113function ! s: vim .execute (cmd, lines , start_lineno, is_method, cb , ex_cb) dict
109- if exists (' s:job' ) && job_status (s: job ) != ' stop'
110- call job_stop (s: job )
111- endif
114+ if has (' nvim' )
115+ if exists (' s:job' ) && jobwait ([s: job ], 0 )[0 ] == -1
116+ call jobstop (s: job )
117+ endif
112118
113- let s: job = job_start (a: cmd , {
114- \ ' callback' : {_, m - > a: cb (m , a: start_lineno , a: is_method )},
115- \ ' exit_cb' : {_, m - > a: ex_cb (m )},
116- \ ' in_mode' : ' nl' ,
117- \ })
119+ let s: job = jobstart (a: cmd , {
120+ \ ' on_stdout' : {_, m - > a: cb (m , a: start_lineno , a: is_method )},
121+ \ ' on_exit' : {_, m - > a: ex_cb (m )},
122+ \ ' stdout_buffered' : 1 ,
123+ \ })
124+
125+ call chansend (s: job , a: lines )
126+ call chanclose (s: job , ' stdin' )
127+ elseif v: version >= 800 && ! has (' nvim' )
128+ if exists (' s:job' ) && job_status (s: job ) != ' dead'
129+ call job_stop (s: job )
130+ endif
131+
132+ let s: job = job_start (a: cmd , {
133+ \ ' callback' : {_, m - > a: cb (m , a: start_lineno , a: is_method )},
134+ \ ' exit_cb' : {_, m - > a: ex_cb (m )},
135+ \ ' in_mode' : ' nl' ,
136+ \ })
118137
119- let channel = job_getchannel (s: job )
120- if ch_status (channel) == # ' open'
121- call ch_sendraw (channel, a: lines )
122- call ch_close_in (channel)
138+ let channel = job_getchannel (s: job )
139+ if ch_status (channel) == # ' open'
140+ call ch_sendraw (channel, a: lines )
141+ call ch_close_in (channel)
142+ endif
123143 endif
124144endfunction
125145
0 commit comments