Skip to content

Commit e1cfdc5

Browse files
committed
Port to Neovim: Emulate 'out_io': 'buffer' behavior for Neovim
1 parent e630491 commit e1cfdc5

1 file changed

Lines changed: 61 additions & 6 deletions

File tree

plugin/acme.vim

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,58 @@ function s:GetJobBufNr(job)
239239
endif
240240
endfunc
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+
242294
function s:JobEnv(buf)
243295
return {
244296
\ 'ACMEVIMBUF': a:buf,
@@ -260,6 +312,9 @@ function s:SetEnv(env)
260312
endfunc
261313

262314
function 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

804859
function s:Scroll(topline)
805860
let v = winsaveview()
806-
v.topline = a:topline
861+
let v.topline = a:topline
807862
call winrestview(v)
808863
endfunc
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)})
857912
endfunc
@@ -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()')
11031158
endfunc
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
13171372
endif

0 commit comments

Comments
 (0)