@@ -239,6 +239,58 @@ function s:GetJobBufNr(job)
239239 endif
240240endfunc
241241
242+ function s: NvimOut (id, data, event ) dict
243+ if empty (a: data ) | return | endif
244+ let b = self .buf
245+ if bufexists (b )
246+ let mod = getbufvar (b , ' &modifiable' )
247+ call setbufvar (b , ' &modifiable' , 1 )
248+ let data = copy (a: data )
249+ let last = getbufline (b , ' $' )[0 ]
250+ let data[0 ] = last . data[0 ]
251+ call setbufline (b , ' $' , data[0 ])
252+ if len (data) > 1
253+ call appendbufline (b , ' $' , data[1 :])
254+ endif
255+ call setbufvar (b , ' &modifiable' , mod )
256+ endif
257+ if has_key (self , ' callback' ) && ! empty (self .callback)
258+ call call (self .callback, [a: id , ' ' ])
259+ endif
260+ endfunc
261+
262+ function s: NvimExit (id, status, event ) dict
263+ if has_key (s: nvim_jobs , a: id )
264+ call remove (s: nvim_jobs , a: id )
265+ endif
266+ call s: Exited (a: id , a: status )
267+ endfunc
268+
269+ function s: JobStartNvim (cmd, outb, ctxb, opts, inp)
270+ let job_opts = {
271+ \ ' on_exit' : function (' s:NvimExit' ),
272+ \ ' on_stdout' : function (' s:NvimOut' ),
273+ \ ' on_stderr' : function (' s:NvimOut' ),
274+ \ ' buf' : a: outb ,
275+ \ ' callback' : get (a: opts , ' callback' , ' ' ),
276+ \ }
277+ if has_key (a: opts , ' cwd' )
278+ let job_opts.cwd = a: opts .cwd
279+ endif
280+ let env = s: SetEnv (s: JobEnv (a: outb ))
281+ let job = jobstart (s: Argv (a: cmd ), job_opts)
282+ call s: SetEnv (env)
283+ if job <= 0
284+ return
285+ endif
286+ let s: nvim_jobs [job] = job_opts
287+ call s: Started (job, s: BufWin (a: outb ) != 0 ? a: outb : a: ctxb , a: cmd )
288+ if a: inp != ' '
289+ call chansend (job, a: inp )
290+ call chanclose (job, ' stdin' )
291+ endif
292+ endfunc
293+
242294function s: JobEnv (buf )
243295 return {
244296 \ ' ACMEVIMBUF' : a: buf ,
@@ -260,6 +312,9 @@ function s:SetEnv(env)
260312endfunc
261313
262314function s: JobStart (cmd, outb, ctxb, opts, inp)
315+ if has (' nvim' )
316+ return s: JobStartNvim (a: cmd , a: outb , a: ctxb , a: opts , a: inp )
317+ endif
263318 let opts = {
264319 \ ' exit_cb' : ' s:Exited' ,
265320 \ ' err_io' : ' out' ,
@@ -803,7 +858,7 @@ endfunc
803858
804859function s: Scroll (topline)
805860 let v = winsaveview ()
806- v .topline = a: topline
861+ let v .topline = a: topline
807862 call winrestview (v )
808863endfunc
809864
@@ -850,8 +905,8 @@ function s:Layout(col)
850905 let s = float2nr (h / (n * (n > s: tops ? 1.75 : 1 )))
851906 endif
852907 call win_move_statusline (win_id2win (w ) - 1 , winheight (w ) - s )
853- h -= s
854- n -= 1
908+ let h -= s
909+ let n -= 1
855910 endfor
856911 call timer_start (0 , {_ - > s: Fit (a: col )})
857912endfunc
@@ -1098,7 +1153,7 @@ function s:Pty(b)
10981153 if ! has_key (s: scratch , a: b ) || w == 0
10991154 return
11001155 endif
1101- s: scratch [a: b ].pty = 1
1156+ let s: scratch [a: b ].pty = 1
11021157 call win_execute (w , ' call s:PtyMap()' )
11031158endfunc
11041159
@@ -1305,13 +1360,13 @@ if s:ctrlexe != ''
13051360 let s: ctrl = jobstart ([s: ctrlexe ], {
13061361 \ ' on_stdout' : function (' s:NvimCtrlRecv' ),
13071362 \ ' rpc' : 0 ,
1308- \ })
1363+ \ })
13091364 else
13101365 let s: ctrl = job_start ([s: ctrlexe ], {
13111366 \ ' callback' : ' s:CtrlRecv' ,
13121367 \ ' err_io' : ' null' ,
13131368 \ ' mode' : ' raw' ,
1314- \ })
1369+ \ })
13151370 endif
13161371 let $EDITOR = s: ctrlexe
13171372endif
0 commit comments