diff --git a/autoload/SpaceVim/api/vim/buffer.vim b/autoload/SpaceVim/api/vim/buffer.vim index 8d149b089..c204ef321 100644 --- a/autoload/SpaceVim/api/vim/buffer.vim +++ b/autoload/SpaceVim/api/vim/buffer.vim @@ -88,6 +88,21 @@ function! s:self.filter_do(expr) abort endfor endfunction +if exists('*nvim_buf_line_count') + function! s:self.line_count(buf) abort + return nvim_buf_line_count(a:buf) + endfunction +elseif has('lua') + function! s:self.line_count(buf) abort + " lua numbers are floats, so use float2nr + return float2nr(luaeval('#vim.buffer(vim.eval("a:buf"))')) + endfunction +else + function! s:self.line_count(buf) abort + return len(getbufline(a:buf, 1, '$')) + endfunction +endif + " just same as nvim_buf_set_lines function! s:self.buf_set_lines(buffer, start, end, strict_indexing, replacement) abort diff --git a/autoload/SpaceVim/plugins/repl.vim b/autoload/SpaceVim/plugins/repl.vim index b83f64ed8..da3adecbe 100644 --- a/autoload/SpaceVim/plugins/repl.vim +++ b/autoload/SpaceVim/plugins/repl.vim @@ -8,6 +8,7 @@ let s:JOB = SpaceVim#api#import('job') let s:BUFFER = SpaceVim#api#import('vim#buffer') +let s:WINDOW = SpaceVim#api#import('vim#window') let s:STRING = SpaceVim#api#import('data#string') let s:VIM = SpaceVim#api#import('vim') @@ -73,6 +74,7 @@ function! s:start(exe) abort let s:start_time = reltime() call s:open_windows() call s:BUFFER.buf_set_lines(s:bufnr, s:lines , s:lines + 3, 0, ['[REPL executable] ' . string(a:exe), '', repeat('-', 20)]) + call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) let s:lines += 3 let s:_out_data = [''] let s:_current_line = '' @@ -97,7 +99,9 @@ if has('nvim') && exists('*chanclose') if bufexists(s:bufnr) call s:BUFFER.buf_set_lines(s:bufnr, s:lines , s:lines + 1, 0, map(s:_out_data[:-2], "substitute(v:val, ' $', '', 'g')")) let s:lines += len(s:_out_data) - 1 - call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) + if s:WINDOW.get_cursor(s:winid)[0] == s:BUFFER.line_count(s:bufnr) - len(s:_out_data) + 1 + call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) + endi call s:update_statusline() endif let s:_out_data = [''] @@ -105,7 +109,9 @@ if has('nvim') && exists('*chanclose') if bufexists(s:bufnr) call s:BUFFER.buf_set_lines(s:bufnr, s:lines , s:lines + 1, 0, map(s:_out_data[:-2], "substitute(v:val, ' $', '', 'g')")) let s:lines += len(s:_out_data) - 1 - call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) + if s:WINDOW.get_cursor(s:winid)[0] == s:BUFFER.line_count(s:bufnr) - len(s:_out_data) + 1 + call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) + endi call s:update_statusline() endif let s:_out_data = [s:_out_data[-1]] @@ -116,7 +122,9 @@ else if bufexists(s:bufnr) call s:BUFFER.buf_set_lines(s:bufnr, s:lines , s:lines + 1, 0, a:data) let s:lines += len(a:data) - call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) + if s:WINDOW.get_cursor(s:winid)[0] == s:BUFFER.line_count(s:bufnr) - len(a:data) + 1 + call s:VIM.win_set_cursor(s:winid, [s:VIM.buf_line_count(s:bufnr), 1]) + endi call s:update_statusline() endif endfunction