From 087b634702bc93391c7930c12af36c2a3b7846a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bert=20M=C3=BCnnich?= Date: Fri, 27 Feb 2026 08:17:28 +0100 Subject: [PATCH 1/3] Prevent moving space from closed wins into guide wins We now use the WinClosed autocmd for this which means that it also happens when using builtin vim functionality to close the window. --- plugin/acme.vim | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/plugin/acme.vim b/plugin/acme.vim index f4fc7a5..b0454b8 100644 --- a/plugin/acme.vim +++ b/plugin/acme.vim @@ -723,9 +723,6 @@ function s:MoveWin(w, other, below) noa exe win_id2win(p != a:w ? p : nw).'wincmd w' noa exe win_id2win(w != a:w ? w : nw).'wincmd w' noa exe win_id2win(a:w).'close!' - call remove(col, i) - call s:Layout(col) - call s:Layout(s:WinCol(nw)) endif endfunc @@ -741,8 +738,6 @@ function s:NewCol(w) noa exe win_id2win(p).'wincmd w' noa exe win_id2win(w).'wincmd w' noa exe win_id2win(a:w).'close!' - call remove(col, index(col, a:w)) - call s:Layout(col) endfunc function s:Scroll(topline) @@ -1177,18 +1172,32 @@ function s:BufWinLeave() endif endfunc -function s:WinClosed(w) - if has_key(s:minimized, a:w) - call remove(s:minimized, a:w) +function s:WinClosedPre() + " Only works with 'nosplitbelow' + let w = expand("") + let h = winheight(w) + 1 + let col = s:WinCol(w) + let [i, j] = [index(col, w), index(col, win_getid())] + if j == -1 + let fbelow = i + 1 == len(col) ? '' : + \ fnamemodify(bufname(winbufnr(col[i + 1])), ':t') + if i == 0 || fbelow != 'guide' + return + endif + let j = i - 1 endif - let col = s:WinCol(a:w) - call remove(col, index(col, a:w)) - call timer_start(0, {_ -> s:Layout(col)}) + let focus = w == win_getid() + call timer_start(0, {_ -> s:WinClosedPost(col[j], i - j, h, focus)}) endfunc -function s:WinNew(w) - let col = s:WinCol(a:w) - call timer_start(0, {_ -> s:Layout(col)}) +function s:WinClosedPost(w, n, h, focus) + let w = win_id2win(a:w) + for i in a:n < 0 ? range(a:n + 1, -1) : reverse(range(a:n)) + call win_move_statusline(w + i, a:n < 0 ? -a:h : a:h) + endfor + if a:focus + exe w.'wincmd w' + endif endfunc augroup acme_vim @@ -1200,8 +1209,7 @@ au TextChanged,TextChangedI guide setl nomodified au VimEnter * call s:ReloadDirs(winnr()) au VimResized * call s:ReloadDirs(0) au WinResized * call s:ReloadDirs(0) -au WinClosed * call s:WinClosed(str2nr(expand(""))) -au WinNew * call s:WinNew(win_getid()) +au WinClosed * call s:WinClosedPre() augroup END if exists("s:ctrlexe") From ba0ca6510cd9efd10979d9c73b90040ac6dfcd4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= Date: Fri, 9 Jan 2026 07:27:38 +0100 Subject: [PATCH 2/3] Port to Neovim: Add compatibility layer for job control and output buffering Add Neovim-compatible wrappers for job control (s:JobStop, s:ChanSend, s:ChanCloseIn, s:ChanSetCallback, s:JobInfo, s:GetJobBufNr), emulate Vim's 'out_io':'buffer' behavior via s:NvimOut/s:NvimExit callbacks, handle signal sending via vim.loop.kill, initialize script-local click variables, fix readdir() call (two parameters, not three), and fix various Vimscript and callback regressions introduced during porting. --- plugin/acme.vim | 263 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 192 insertions(+), 71 deletions(-) diff --git a/plugin/acme.vim b/plugin/acme.vim index b0454b8..2a658fe 100644 --- a/plugin/acme.vim +++ b/plugin/acme.vim @@ -1,3 +1,9 @@ +let s:click = {'winid': 0} +let s:clicksel = 0 +let s:clickwin = 0 +let s:visual = [[0,0,0,0], [0,0,0,0], ''] +let s:clickstatus = 0 + function s:Bound(min, n, max) return max([a:min, min([a:n, a:max])]) endfunc @@ -13,8 +19,8 @@ function s:FileWin(name) endfunc function s:Sel() - let text = getreg('"') - let type = getregtype('"') + let text = getreg("'") + let type = getregtype("'") let view = winsaveview() silent normal! gv""y let sel = [getreg('"'), getregtype('"')] @@ -74,7 +80,7 @@ function AcmeStatusFlags() endfunc function AcmeStatusJobs() - return join(map(s:Jobs(bufnr()), '"{".v:val.cmd."}"'), '') + return join(map(s:Jobs(bufnr()), {_, v -> '"{'.v.cmd.'}"'}), '') endfunc function AcmeStatusRuler() @@ -87,7 +93,7 @@ function s:Started(job, buf, cmd) \ 'h': a:job, \ 'cmd': type(a:cmd) == type([]) ? join(a:cmd) : a:cmd, \ 'killed': 0, - \ }) + \ }) redrawstatus! endfunc @@ -100,11 +106,11 @@ function s:RemoveJob(i, status) else checktime call s:ReloadDirs() - let sig = job_info(job.h).termsig + let sig = s:JobInfo(job.h).termsig if a:status == 0 echo 'Done:' job.cmd elseif sig != '' && !job.killed - let name = bufname(ch_getbufnr(job.h, 'out')) + let name = bufname(s:GetJobBufNr(job.h)) call s:ErrorOpen(name, [toupper(sig).': '.job.cmd]) endif endif @@ -121,11 +127,13 @@ endfunc function s:Kill(p) for job in s:Jobs(a:p) - let ch = job_getchannel(job.h) - if string(ch) != 'channel fail' - call ch_close(ch) + if !has('nvim') + let ch = job_getchannel(job.h) + if string(ch) != 'channel fail' + call ch_close(ch) + endif endif - call job_stop(job.h) + call s:JobStop(job.h) let job.killed = 1 endfor endfunc @@ -156,8 +164,8 @@ function s:Send(w, inp) endif let inp = split(inp, '\n') let job = s:Jobs(b)[0].h - call ch_setoptions(job, {'callback': ''}) - call ch_sendraw(job, join(inp, "\n")."\n") + call s:ChanSetCallback(job, '') + call s:ChanSend(job, join(inp, "\n")."\n") endfunc function s:Receiver(b) @@ -182,6 +190,131 @@ function s:ArgvAxec(cmd, cwd) \ ? [s:avimdir.'/bin/axec'] + argv : argv endfunc +function s:JobStop(job) + if has('nvim') + silent! call jobstop(a:job) + else + call job_stop(a:job) + endif +endfunc + +function s:JobKill(job, sig) + if has('nvim') + let sig = a:sig + if type(sig) == type("") + let map = {'int': 2, 'hup': 1, 'term': 15, 'kill': 9} + let sig = get(map, sig, 15) + endif + silent! call luaeval('vim.loop.kill(vim.fn.jobpid(_A[1]), _A[2])', [a:job, sig]) + else + call job_stop(a:job, a:sig) + endif +endfunc + +function s:ChanSend(job, data) + if has('nvim') + call chansend(a:job, a:data) + else + call ch_sendraw(a:job, a:data) + endif +endfunc + +function s:ChanCloseIn(job) + if has('nvim') + call chanclose(a:job, 'stdin') + else + call ch_close_in(a:job) + endif +endfunc + +function s:ChanSetCallback(job, cb) + if has('nvim') + if has_key(s:nvim_jobs, a:job) + let s:nvim_jobs[a:job].callback = a:cb + endif + else + call ch_setoptions(a:job, {'callback': a:cb}) + endif +endfunc + +function s:JobInfo(job) + if has('nvim') + let s = jobwait([a:job], 0)[0] + let sig = '' + if s > 128 + let sig = s == 130 ? 'int' : s == 143 ? 'term' : s == 129 ? 'hup' : 'sig'.(s-128) + endif + return {'termsig': sig} + else + return job_info(a:job) + endif +endfunc + +function s:GetJobBufNr(job) + if has('nvim') + return get(get(s:nvim_jobs, a:job, {}), 'buf', -1) + else + return ch_getbufnr(a:job, 'out') + endif +endfunc + +function s:NvimOut(id, data, event) + if empty(a:data) || a:data == [''] | return | endif + let job = get(s:nvim_jobs, a:id, {}) + let b = get(job, 'buf', -1) + if bufexists(b) + let mod = getbufvar(b, '&modifiable') + call setbufvar(b, '&modifiable', 1) + let data = copy(a:data) + let last = getbufline(b, '$')[0] + let data[0] = last . data[0] + call setbufline(b, '$', data[0]) + if len(data) > 1 + call appendbufline(b, '$', data[1:]) + endif + call setbufvar(b, '&modifiable', mod) + endif + if has_key(job, 'callback') && !empty(job.callback) + call call(job.callback, [a:id, '']) + endif +endfunc + +function s:NvimExit(id, status, event) + if has_key(s:nvim_jobs, a:id) + call remove(s:nvim_jobs, a:id) + endif + call s:Exited(a:id, a:status) +endfunc + +function s:JobStartNvim(cmd, outb, ctxb, opts, inp) + let job_opts = { + \ 'on_exit': function('s:NvimExit'), + \ 'on_stdout': function('s:NvimOut'), + \ 'on_stderr': function('s:NvimOut'), + \ } + if a:inp != '' + let job_opts.stdin = 'pipe' + endif + if has_key(a:opts, 'cwd') + let job_opts.cwd = a:opts.cwd + endif + let env = s:SetEnv(s:JobEnv(a:outb)) + let job = jobstart(s:Argv(a:cmd), job_opts) + call s:SetEnv(env) + if job <= 0 + return + endif + let s:nvim_jobs[job] = { + \ 'buf': a:outb, + \ 'callback': get(a:opts, 'callback', ''), + \ } + call s:Started(job, s:BufWin(a:outb) != 0 ? a:outb : a:ctxb, a:cmd) + if a:inp != '' + call chansend(job, a:inp) + call chanclose(job, 'stdin') + endif +endfunc + function s:JobEnv(buf) return { \ 'ACMEVIMBUF': a:buf, @@ -190,7 +323,7 @@ function s:JobEnv(buf) \ &buftype == '' ? expand('%:t') : '', \ 'COLUMNS': 80, \ 'LINES': 24, - \ } + \ } endfunc function s:SetEnv(env) @@ -203,13 +336,16 @@ function s:SetEnv(env) endfunc function s:JobStart(cmd, outb, ctxb, opts, inp) + if has('nvim') + return s:JobStartNvim(a:cmd, a:outb, a:ctxb, a:opts, a:inp) + endif let opts = { \ 'exit_cb': 's:Exited', \ 'err_io': 'out', \ 'out_io': 'buffer', \ 'out_buf': a:outb, \ 'out_msg': 0, - \ } + \ } call extend(opts, a:opts) let cwd = get(a:opts, 'cwd', getcwd()) let env = s:SetEnv(s:JobEnv(a:outb)) @@ -270,7 +406,7 @@ function s:ErrorOpen(name, ...) exe w.'wincmd w' let b = s:ErrorLoad(a:name) for job in s:jobs - if ch_getbufnr(job.h, 'out') == b && job.buf != b + if s:GetJobBufNr(job.h) == b && job.buf != b let job.buf = b endif endfor @@ -290,7 +426,7 @@ endfunc function s:ErrorCb(b, ch, msg) call s:ErrorOpen(bufname(a:b)) - call ch_setoptions(a:ch, {'callback': ''}) + call s:ChanSetCallback(a:ch, '') endfunc function s:ErrorExec(cmd, dir, b, inp) @@ -389,7 +525,7 @@ function s:ScratchCb(b, ch, msg) let w = win_getid(w) if line('$', w) > 1 call win_execute(w, 'noa normal! gg0') - call ch_setoptions(a:ch, {'callback': ''}) + call s:ChanSetCallback(a:ch, '') endif endif endfunc @@ -400,7 +536,7 @@ function s:ScratchExec(cmd, dir, inp, title) let opts = { \ 'callback': function('s:ScratchCb', [b]), \ 'in_io': 'pipe', - \ } + \ } if a:dir != '' let opts.cwd = a:dir endif @@ -408,11 +544,15 @@ function s:ScratchExec(cmd, dir, inp, title) endfunc function s:Exec(cmd) - silent! call job_start(s:Argv(a:cmd), { - \ 'err_io': 'null', - \ 'in_io': 'null', - \ 'out_io': 'null', - \ }) + if has('nvim') + silent! call jobstart(s:Argv(a:cmd), {'detach': 1}) + else + silent! call job_start(s:Argv(a:cmd), { + \ 'err_io': 'null', + \ 'in_io': 'null', + \ 'out_io': 'null', + \ }) + endif endfunc function s:BufWidth(b) @@ -454,7 +594,7 @@ function s:ListDir() if !isdirectory(dir) || !&modifiable return endif - let lst = ['..'] + readdir(dir, 1, {'sort': 'collate'}) + let lst = ['..'] + readdir(dir, 1) call map(lst, 'isdirectory(dir."/".v:val) ? v:val."/" : v:val') let width = s:BufWidth(bufnr()) let lst = s:Columnate(lst, width) @@ -535,7 +675,7 @@ endfunc function s:CtxDir() let dir = s:Dir() if &buftype != '' - let [t, q] = ['ing directory:? ', "[`'\"]"] + let [t, q] = ['ing directory:? ', "[`'\"`]"] let l = searchpair('\vEnter'.t.q, '', '\vLeav'.t.q, 'nW', \ '', 0, 50) let m = matchlist(getline(l), '\vLeav'.t.q.'(.+)'.q) @@ -623,7 +763,7 @@ let s:plumbing = [ \ [], \ ['\f+', {m -> m[0] !~ '/' && AcmeOpen(exepath(m[0]), '')}], \ ['\d+%([:,]\d+)?', {m -> s:Goto(m[0])}], -\ ] + \ ] function s:Open(text, click, dir, win) let s:plumbclick = a:click @@ -900,52 +1040,21 @@ function s:RightRelease(click) return endif exe "normal! \" - let click = s:clicksel ? -1 : a:click - let text = click <= 0 ? trim(s:Sel()[0], "\r\n", 2) : getline('.') + let cmd = a:click <= 0 || s:clicksel ? s:Sel()[0] : expand('') + let vis = s:clickmode == 'v' && (a:click <= 0 || !s:clicksel) call s:RestVisual(s:visual) let w = win_getid() let dir = s:CtxDir() exe win_id2win(s:clickwin).'wincmd w' - call s:Open(text, click, dir, w) + call s:Open(cmd, a:click, dir, w) endfunc -for m in ['', 'i'] - for n in ['', '2-', '3-', '4-'] - for c in ['Mouse', 'Drag', 'Release'] - exe m.'noremap <'.n.'Middle'.c.'> ' - exe m.'noremap <'.n.'Right'.c.'> ' - endfor - endfor - exe m.'noremap ' - exe m.'noremap ' -endfor -for n in ['', '2-', '3-', '4-'] - exe 'nnoremap <'.n.'MiddleMouse>' - \ ':call MousePress("")' - exe 'vnoremap <'.n.'MiddleMouse>' - \ ':call MousePress("v")' - exe 'nnoremap <'.n.'MiddleRelease>' - \ ':call MiddleRelease(col("."))' - exe 'nnoremap <'.n.'RightMouse>' - \ ':call MousePress("")' - exe 'vnoremap <'.n.'RightMouse>' - \ ':call MousePress("v")' - exe 'nnoremap <'.n.'RightRelease>' - \ ':call RightRelease(col("."))' -endfor -inoremap :call MousePress('') -inoremap :call MiddleRelease(col('.')) -vnoremap :call MiddleRelease(-1) -inoremap :call MousePress('') -inoremap :call RightRelease(col('.')) -vnoremap :call RightRelease(-1) - function s:Clear(b) call deletebufline(a:b, 1, "$") if has_key(s:scratch, a:b) let s:scratch[a:b].cleared = 1 for job in s:Jobs(a:b) - call ch_setoptions(job.h, {'callback': ''}) + call s:ChanSetCallback(job.h, '') endfor endif endfunc @@ -1006,7 +1115,7 @@ endfunc function s:Signal(sig) for job in s:Jobs(bufnr()) - call job_stop(job.h, a:sig) + call s:JobKill(job.h, a:sig) endfor endfunc @@ -1021,7 +1130,7 @@ endfunc function s:PtyPw() let pw = inputsecret('PW> ') for job in s:Jobs(bufnr()) - call ch_sendraw(job.h, pw."\n") + call s:ChanSend(job.h, pw."\n") endfor endfunc @@ -1070,7 +1179,8 @@ function s:Look(p) else let hl = 1 let p = map(a:p[1:-2], {i, v -> escape(v, '\/')}) - let @/ = '\V'.a:p[0].'\%\('.join(p, '\|').'\)'.a:p[-1] + let @/ = '\V'.a:p[0].'\%('.join(p, '\|').'\)'.a:p[-1] + call feedkeys(":let v:hlsearch=1\", 'n') endif let esc = mode() == 'i' ? "\" : "" call feedkeys(esc.":let v:hlsearch=".hl."\", 'n') @@ -1084,7 +1194,7 @@ endfunc function s:CtrlRecv(ch, data) let len = strridx(a:data, "\x1e") let len += len == -1 ? 0 : len(s:ctrlrx) - let s:ctrlrx .= a:data + s:ctrlrx .= a:data if len == -1 return endif @@ -1150,7 +1260,7 @@ function s:CtrlRecv(ch, data) endfunc function s:CtrlSend(msg) - call ch_sendraw(s:ctrl, join(a:msg, "\x1f") . "\x1e") + call s:ChanSend(s:ctrl, join(a:msg, "\x1f") . "\x1e") endfunc function s:BufWinLeave() @@ -1233,12 +1343,23 @@ let s:jobs = [] let s:minimized = {} let s:scratch = {} let s:tops = 1 +let s:nvim_jobs = {} if s:ctrlexe != '' - let s:ctrl = job_start([s:ctrlexe], { - \ 'callback': 's:CtrlRecv', - \ 'err_io': 'null', - \ 'mode': 'raw', - \ }) + if has('nvim') + function s:NvimCtrlRecv(id, data, event) + call s:CtrlRecv(a:id, join(a:data, "\n")) + endfunc + let s:ctrl = jobstart([s:ctrlexe], { + \ 'on_stdout': function('s:NvimCtrlRecv'), + \ 'rpc': 0, + \ }) + else + let s:ctrl = job_start([s:ctrlexe], { + \ 'callback': 's:CtrlRecv', + \ 'err_io': 'null', + \ 'mode': 'raw', + \ }) + endif let $EDITOR = s:ctrlexe endif From 8c2a601c88d4d9fa6493f43be24636d35e90ba32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= Date: Fri, 9 Jan 2026 09:09:41 +0100 Subject: [PATCH 3/3] Port to Neovim: Add public AcmeActivate function and fix mouse handling Add AcmeActivate public function and key mappings. Add fallback in s:RightRelease to use getmousepos() when s:click is uninitialized. Fix mouse handling for Neovim 0.12+ where normal! with mouse key events is restricted. Use getline('.') in s:RightRelease for correct column-based plumbing pattern matching. --- plugin/acme.vim | 84 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 15 deletions(-) diff --git a/plugin/acme.vim b/plugin/acme.vim index 2a658fe..80404ca 100644 --- a/plugin/acme.vim +++ b/plugin/acme.vim @@ -19,8 +19,8 @@ function s:FileWin(name) endfunc function s:Sel() - let text = getreg("'") - let type = getregtype("'") + let text = getreg('"') + let type = getregtype('"') let view = winsaveview() silent normal! gv""y let sel = [getreg('"'), getregtype('"')] @@ -93,7 +93,7 @@ function s:Started(job, buf, cmd) \ 'h': a:job, \ 'cmd': type(a:cmd) == type([]) ? join(a:cmd) : a:cmd, \ 'killed': 0, - \ }) + \ }) redrawstatus! endfunc @@ -323,7 +323,7 @@ function s:JobEnv(buf) \ &buftype == '' ? expand('%:t') : '', \ 'COLUMNS': 80, \ 'LINES': 24, - \ } + \ } endfunc function s:SetEnv(env) @@ -345,7 +345,7 @@ function s:JobStart(cmd, outb, ctxb, opts, inp) \ 'out_io': 'buffer', \ 'out_buf': a:outb, \ 'out_msg': 0, - \ } + \ } call extend(opts, a:opts) let cwd = get(a:opts, 'cwd', getcwd()) let env = s:SetEnv(s:JobEnv(a:outb)) @@ -536,7 +536,7 @@ function s:ScratchExec(cmd, dir, inp, title) let opts = { \ 'callback': function('s:ScratchCb', [b]), \ 'in_io': 'pipe', - \ } + \ } if a:dir != '' let opts.cwd = a:dir endif @@ -551,7 +551,7 @@ function s:Exec(cmd) \ 'err_io': 'null', \ 'in_io': 'null', \ 'out_io': 'null', - \ }) + \ }) endif endfunc @@ -980,7 +980,12 @@ function s:MousePress(mode) if s:clickstatus != 0 || s:click.winid == 0 return endif - exe "normal! \" + if has('nvim') + exe win_id2win(s:click.winid).'wincmd w' + call cursor(s:click.line, s:click.column) + else + exe "normal! \" + endif let s:visual = s:SaveVisual() let s:clicksel = s:clickmode == 'v' && win_getid() == s:clickwin && \ s:InSel() @@ -1001,7 +1006,9 @@ function s:MiddleRelease(click) endif return endif - exe "normal! \" + if !has('nvim') + exe "normal! \" + endif let cmd = a:click <= 0 || s:clicksel ? s:Sel()[0] : expand('') let vis = s:clickmode == 'v' && (a:click <= 0 || !s:clicksel) call s:RestVisual(s:visual) @@ -1020,6 +1027,14 @@ function s:MiddleRelease(click) endfunc function s:RightRelease(click) + if s:click.winid == 0 + let s:click = getmousepos() + let s:clickwin = win_getid() + let s:clickstatus = s:click.line == 0 ? win_id2win(s:click.winid) : 0 + let s:clickmode = 'n' + let s:clicksel = 0 + endif + if s:click.winid == 0 return elseif s:clickstatus != 0 @@ -1039,8 +1054,10 @@ function s:RightRelease(click) endif return endif - exe "normal! \" - let cmd = a:click <= 0 || s:clicksel ? s:Sel()[0] : expand('') + if !has('nvim') + exe "normal! \" + endif + let cmd = a:click <= 0 || s:clicksel ? s:Sel()[0] : getline('.') let vis = s:clickmode == 'v' && (a:click <= 0 || !s:clicksel) call s:RestVisual(s:visual) let w = win_getid() @@ -1049,6 +1066,43 @@ function s:RightRelease(click) call s:Open(cmd, a:click, dir, w) endfunc +function AcmeActivate(mode) + let text = a:mode == 'v' ? trim(s:Sel()[0], "\r\n", 2) : getline('.') + let click = a:mode == 'v' ? -1 : col('.') + call s:Open(text, click, s:CtxDir(), win_getid()) +endfunc + +for m in ['', 'i'] + for n in ['', '2-', '3-', '4-'] + for c in ['Mouse', 'Drag', 'Release'] + exe m.'noremap <'.n.'Middle'.c.'> ' + exe m.'noremap <'.n.'Right'.c.'> ' + endfor + endfor + exe m.'noremap ' + exe m.'noremap ' +endfor +for n in ['', '2-', '3-', '4-'] + exe 'nnoremap <'.n.'MiddleMouse>' + \ ':call MousePress("")' + exe 'vnoremap <'.n.'MiddleMouse>' + \ ':call MousePress("v")' + exe 'nnoremap <'.n.'MiddleRelease>' + \ ':call MiddleRelease(col("."))' + exe 'nnoremap <'.n.'RightMouse>' + \ ':call MousePress("")' + exe 'vnoremap <'.n.'RightMouse>' + \ ':call MousePress("v")' + exe 'nnoremap <'.n.'RightRelease>' + \ ':call RightRelease(col("."))' +endfor +inoremap :call MousePress('') +inoremap :call MiddleRelease(col('.')) +vnoremap :call MiddleRelease(-1) +inoremap :call MousePress('') +inoremap :call RightRelease(col('.')) +vnoremap :call RightRelease(-1) + function s:Clear(b) call deletebufline(a:b, 1, "$") if has_key(s:scratch, a:b) @@ -1194,7 +1248,7 @@ endfunc function s:CtrlRecv(ch, data) let len = strridx(a:data, "\x1e") let len += len == -1 ? 0 : len(s:ctrlrx) - s:ctrlrx .= a:data + let s:ctrlrx .= a:data if len == -1 return endif @@ -1353,13 +1407,13 @@ if s:ctrlexe != '' let s:ctrl = jobstart([s:ctrlexe], { \ 'on_stdout': function('s:NvimCtrlRecv'), \ 'rpc': 0, - \ }) + \ }) else let s:ctrl = job_start([s:ctrlexe], { \ 'callback': 's:CtrlRecv', \ 'err_io': 'null', \ 'mode': 'raw', - \ }) + \ }) endif let $EDITOR = s:ctrlexe -endif +endif \ No newline at end of file