131 lines
3.4 KiB
VimL
131 lines
3.4 KiB
VimL
|
" keep track of vimrc setting
|
||
|
let s:updatetime = &updatetime
|
||
|
|
||
|
" keep track of scrollinf window start
|
||
|
let s:window_start = 0
|
||
|
|
||
|
function! s:generate_names()
|
||
|
let names = []
|
||
|
let i = 1
|
||
|
let last_buffer = bufnr('$')
|
||
|
let current_buffer = bufnr('%')
|
||
|
while i <= last_buffer
|
||
|
if bufexists(i) && buflisted(i)
|
||
|
let modified = ' '
|
||
|
if getbufvar(i, '&mod')
|
||
|
let modified = g:bufferline_modified
|
||
|
endif
|
||
|
let fname = fnamemodify(bufname(i), g:bufferline_fname_mod)
|
||
|
if g:bufferline_pathshorten != 0
|
||
|
let fname = pathshorten(fname)
|
||
|
endif
|
||
|
let fname = substitute(fname, "%", "%%", "g")
|
||
|
|
||
|
let skip = 0
|
||
|
for ex in g:bufferline_excludes
|
||
|
if match(fname, ex) > -1
|
||
|
let skip = 1
|
||
|
break
|
||
|
endif
|
||
|
endfor
|
||
|
|
||
|
if !skip
|
||
|
let name = ''
|
||
|
if g:bufferline_show_bufnr != 0 && g:bufferline_status_info.count >= g:bufferline_show_bufnr
|
||
|
let name = i . ':'
|
||
|
endif
|
||
|
let name .= fname . modified
|
||
|
|
||
|
if current_buffer == i
|
||
|
let name = g:bufferline_active_buffer_left . name . g:bufferline_active_buffer_right
|
||
|
let g:bufferline_status_info.current = name
|
||
|
else
|
||
|
let name = g:bufferline_separator . name . g:bufferline_separator
|
||
|
endif
|
||
|
|
||
|
call add(names, [i, name])
|
||
|
endif
|
||
|
endif
|
||
|
let i += 1
|
||
|
endwhile
|
||
|
|
||
|
if len(names) > 1
|
||
|
if g:bufferline_rotate == 1
|
||
|
call bufferline#algos#fixed_position#modify(names)
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
return names
|
||
|
endfunction
|
||
|
|
||
|
function! bufferline#get_echo_string()
|
||
|
" check for special cases like help files
|
||
|
let current = bufnr('%')
|
||
|
if !bufexists(current) || !buflisted(current)
|
||
|
return bufname('%')
|
||
|
endif
|
||
|
|
||
|
let names = s:generate_names()
|
||
|
let line = ''
|
||
|
for val in names
|
||
|
let line .= val[1]
|
||
|
endfor
|
||
|
|
||
|
let index = match(line, '\V'.g:bufferline_status_info.current)
|
||
|
let g:bufferline_status_info.count = len(names)
|
||
|
let g:bufferline_status_info.before = strpart(line, 0, index)
|
||
|
let g:bufferline_status_info.after = strpart(line, index + len(g:bufferline_status_info.current))
|
||
|
return line
|
||
|
endfunction
|
||
|
|
||
|
function! s:echo()
|
||
|
if &filetype ==# 'unite'
|
||
|
return
|
||
|
endif
|
||
|
|
||
|
let line = bufferline#get_echo_string()
|
||
|
|
||
|
" 12 is magical and is the threshold for when it doesn't wrap text anymore
|
||
|
let width = &columns - 12
|
||
|
if g:bufferline_rotate == 2
|
||
|
let current_buffer_start = stridx(line, g:bufferline_active_buffer_left)
|
||
|
let current_buffer_end = stridx(line, g:bufferline_active_buffer_right)
|
||
|
if current_buffer_start < s:window_start
|
||
|
let s:window_start = current_buffer_start
|
||
|
endif
|
||
|
if current_buffer_end > (s:window_start + width)
|
||
|
let s:window_start = current_buffer_end - width + 1
|
||
|
endif
|
||
|
let line = strpart(line, s:window_start, width)
|
||
|
else
|
||
|
let line = strpart(line, 0, width)
|
||
|
endif
|
||
|
|
||
|
echo line
|
||
|
|
||
|
if &updatetime != s:updatetime
|
||
|
let &updatetime = s:updatetime
|
||
|
endif
|
||
|
endfunction
|
||
|
|
||
|
function! s:cursorhold_callback()
|
||
|
call s:echo()
|
||
|
autocmd! bufferline CursorHold
|
||
|
endfunction
|
||
|
|
||
|
function! s:refresh(updatetime)
|
||
|
let &updatetime = a:updatetime
|
||
|
autocmd bufferline CursorHold * call s:cursorhold_callback()
|
||
|
endfunction
|
||
|
|
||
|
function! bufferline#init_echo()
|
||
|
augroup bufferline
|
||
|
au!
|
||
|
|
||
|
" events which output a message which should be immediately overwritten
|
||
|
autocmd BufWinEnter,WinEnter,InsertLeave,VimResized * call s:refresh(1)
|
||
|
augroup END
|
||
|
|
||
|
autocmd CursorHold * call s:echo()
|
||
|
endfunction
|