" ___vital___ " NOTE: lines between '" ___vital___' is generated by :Vitalize. " Do not modify the code nor insert new lines before '" ___vital___' function! s:_SID() abort return matchstr(expand(''), '\zs\d\+\ze__SID$') endfunction execute join(['function! vital#_cmp#VS#Vim#Buffer#import() abort', printf("return map({'get_line_count': '', 'do': '', 'create': '', 'pseudo': '', 'ensure': '', 'load': ''}, \"vital#_cmp#function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") delfunction s:_SID " ___vital___ let s:Do = { -> {} } let g:___VS_Vim_Buffer_id = get(g:, '___VS_Vim_Buffer_id', 0) " " get_line_count " if exists('*nvim_buf_line_count') function! s:get_line_count(bufnr) abort return nvim_buf_line_count(a:bufnr) endfunction elseif has('patch-8.2.0019') function! s:get_line_count(bufnr) abort return getbufinfo(a:bufnr)[0].linecount endfunction else function! s:get_line_count(bufnr) abort if bufnr('%') == bufnr(a:bufnr) return line('$') endif return len(getbufline(a:bufnr, '^', '$')) endfunction endif " " create " function! s:create(...) abort let g:___VS_Vim_Buffer_id += 1 let l:bufname = printf('VS.Vim.Buffer: %s: %s', \ g:___VS_Vim_Buffer_id, \ get(a:000, 0, 'VS.Vim.Buffer.Default') \ ) return s:load(l:bufname) endfunction " " ensure " function! s:ensure(expr) abort if !bufexists(a:expr) if type(a:expr) == type(0) throw printf('VS.Vim.Buffer: `%s` is not valid expr.', a:expr) endif badd `=a:expr` endif return bufnr(a:expr) endfunction " " load " if exists('*bufload') function! s:load(expr) abort let l:bufnr = s:ensure(a:expr) if !bufloaded(l:bufnr) call bufload(l:bufnr) endif return l:bufnr endfunction else function! s:load(expr) abort let l:curr_bufnr = bufnr('%') try let l:bufnr = s:ensure(a:expr) execute printf('keepalt keepjumps silent %sbuffer', l:bufnr) catch /.*/ echomsg string({ 'exception': v:exception, 'throwpoint': v:throwpoint }) finally execute printf('noautocmd keepalt keepjumps silent %sbuffer', l:curr_bufnr) endtry return l:bufnr endfunction endif " " do " function! s:do(bufnr, func) abort let l:curr_bufnr = bufnr('%') if l:curr_bufnr == a:bufnr call a:func() return endif try execute printf('noautocmd keepalt keepjumps silent %sbuffer', a:bufnr) call a:func() catch /.*/ echomsg string({ 'exception': v:exception, 'throwpoint': v:throwpoint }) finally execute printf('noautocmd keepalt keepjumps silent %sbuffer', l:curr_bufnr) endtry endfunction " " pseudo " function! s:pseudo(filepath) abort if !filereadable(a:filepath) throw printf('VS.Vim.Buffer: `%s` is not valid filepath.', a:filepath) endif " create pseudo buffer let l:bufname = printf('VSVimBufferPseudo://%s', a:filepath) if bufexists(l:bufname) return s:ensure(l:bufname) endif let l:bufnr = s:ensure(l:bufname) let l:group = printf('VS_Vim_Buffer_pseudo:%s', l:bufnr) execute printf('augroup %s', l:group) execute printf('autocmd BufReadCmd call setline(1, readfile(bufname("%")[20 : -1])) | try | filetype detect | catch /.*/ | endtry | augroup %s | autocmd! | augroup END', l:bufnr, l:group) augroup END return l:bufnr endfunction