spacevim/autoload/SpaceVim/layers/core/tabline.vim
JIe 2bb7059579
Some checks failed
Detach Plugins / check (FlyGrep.vim) (push) Has been cancelled
Detach Plugins / check (GitHub.vim) (push) Has been cancelled
Detach Plugins / check (JavaUnit.vim) (push) Has been cancelled
Detach Plugins / check (SourceCounter.vim) (push) Has been cancelled
Detach Plugins / check (cpicker.nvim) (push) Has been cancelled
Detach Plugins / check (dein-ui.vim) (push) Has been cancelled
Detach Plugins / check (git.vim) (push) Has been cancelled
Detach Plugins / check (iedit.vim) (push) Has been cancelled
Detach Plugins / check (scrollbar.vim) (push) Has been cancelled
Detach Plugins / check (vim-chat) (push) Has been cancelled
Detach Plugins / check (vim-cheat) (push) Has been cancelled
Detach Plugins / check (vim-todo) (push) Has been cancelled
Detach Plugins / check (xmake.vim) (push) Has been cancelled
test / Linux (nvim, nightly) (push) Has been cancelled
test / Linux (nvim, v0.3.8) (push) Has been cancelled
test / Linux (nvim, v0.4.0) (push) Has been cancelled
test / Linux (nvim, v0.4.2) (push) Has been cancelled
test / Linux (nvim, v0.4.3) (push) Has been cancelled
test / Linux (nvim, v0.4.4) (push) Has been cancelled
test / Linux (nvim, v0.5.0) (push) Has been cancelled
test / Linux (nvim, v0.5.1) (push) Has been cancelled
test / Linux (nvim, v0.6.0) (push) Has been cancelled
test / Linux (nvim, v0.6.1) (push) Has been cancelled
test / Linux (nvim, v0.7.0) (push) Has been cancelled
test / Linux (nvim, v0.7.2) (push) Has been cancelled
test / Linux (nvim, v0.8.0) (push) Has been cancelled
test / Linux (nvim, v0.8.1) (push) Has been cancelled
test / Linux (nvim, v0.8.2) (push) Has been cancelled
test / Linux (nvim, v0.8.3) (push) Has been cancelled
test / Linux (nvim, v0.9.0) (push) Has been cancelled
test / Linux (nvim, v0.9.1) (push) Has been cancelled
test / Linux (true, vim, v7.4.052) (push) Has been cancelled
test / Linux (true, vim, v7.4.1689) (push) Has been cancelled
test / Linux (true, vim, v7.4.629) (push) Has been cancelled
test / Linux (true, vim, v8.0.0027) (push) Has been cancelled
test / Linux (true, vim, v8.0.0183) (push) Has been cancelled
test / Linux (vim, nightly) (push) Has been cancelled
test / Linux (vim, v8.0.0184) (push) Has been cancelled
test / Linux (vim, v8.0.1453) (push) Has been cancelled
test / Linux (vim, v8.1.2269) (push) Has been cancelled
test / Linux (vim, v8.2.2434) (push) Has been cancelled
test / Linux (vim, v8.2.3995) (push) Has been cancelled
test / Windows (nvim, nightly) (push) Has been cancelled
test / Windows (nvim, v0.3.8) (push) Has been cancelled
test / Windows (nvim, v0.4.2) (push) Has been cancelled
test / Windows (nvim, v0.4.3) (push) Has been cancelled
test / Windows (nvim, v0.4.4) (push) Has been cancelled
test / Windows (nvim, v0.5.0) (push) Has been cancelled
test / Windows (nvim, v0.5.1) (push) Has been cancelled
test / Windows (nvim, v0.6.0) (push) Has been cancelled
test / Windows (nvim, v0.6.1) (push) Has been cancelled
test / Windows (nvim, v0.7.0) (push) Has been cancelled
test / Windows (nvim, v0.7.2) (push) Has been cancelled
test / Windows (nvim, v0.8.0) (push) Has been cancelled
test / Windows (nvim, v0.8.1) (push) Has been cancelled
test / Windows (nvim, v0.8.2) (push) Has been cancelled
test / Windows (nvim, v0.8.3) (push) Has been cancelled
test / Windows (nvim, v0.9.0) (push) Has been cancelled
test / Windows (nvim, v0.9.1) (push) Has been cancelled
test / Windows (vim, nightly) (push) Has been cancelled
test / Windows (vim, v7.4.1185) (push) Has been cancelled
test / Windows (vim, v7.4.1689) (push) Has been cancelled
test / Windows (vim, v8.0.0027) (push) Has been cancelled
test / Windows (vim, v8.0.1453) (push) Has been cancelled
test / Windows (vim, v8.1.2269) (push) Has been cancelled
test / Windows (vim, v8.2.2434) (push) Has been cancelled
test / Windows (vim, v8.2.3995) (push) Has been cancelled
docker / docker (push) Has been cancelled
mirror / check (coding) (push) Has been cancelled
mirror / check (gitee) (push) Has been cancelled
mirror / check (gitlab) (push) Has been cancelled
init
2024-08-21 14:17:26 +08:00

774 lines
25 KiB
VimL

"=============================================================================
" tabline.vim --- SpaceVim tabline
" Copyright (c) 2016-2023 Wang Shidong & Contributors
" Author: Wang Shidong < wsdjeg@outlook.com >
" URL: https://spacevim.org
" License: GPLv3
"=============================================================================
""
" @section core#tabline, layers-core-tabline
" @parentsection layers
" This layer provides default tabline for SpaceVim
" If you want to use airline's tabline, just disable this layer
" >
" [[layers]]
" name = "core#tabline"
" enable = false
" <
" @subsection Layer options
"
" 1. `enable_default_mappings`: Enable/disable default key bindings. This is
" enabled by default.
"
" @subsection Key bindings
"
" The following two key bindings require neovim v0.10.0+.
" >
" Key binding | Description
" ----------------- | -----------------------------------------------
" Ctrl-Shift-Right | Move current tabpage to the right
" Ctrl-Shift-Left | Move current tabpage to the left
" <
" @subsection Use Tabline
"
" Buffers will be listed on the tabline if there is only one tab, each item contains
" the index, buffer name and the filetype icon. If there is more than one tab, all
" of them will be listed on the tabline. Each item can be quickly accessed by using
" `<Leader> number`. Default `<Leader>` is `\`.
" >
" Key Bindings | Descriptions
" ------------ | -----------------------------------------------
" <Leader> 1 | Jump to index 1 on tabline
" <Leader> 2 | Jump to index 2 on tabline
" <Leader> 3 | Jump to index 3 on tabline
" <Leader> 4 | Jump to index 4 on tabline
" <Leader> 5 | Jump to index 5 on tabline
" <Leader> 6 | Jump to index 6 on tabline
" <Leader> 7 | Jump to index 7 on tabline
" <Leader> 8 | Jump to index 8 on tabline
" <Leader> 9 | Jump to index 9 on tabline
" g r | Switch to alternate tab (switch back and forth)
" <
" NOTE: `SPC Tab` is the key binding for switching to alternate buffer.
" Read [Buffers and Files](#buffers-and-files) section for more info.
"
" SpaceVim tabline also supports mouse click, the left mouse button will switch to the buffer,
" while the middle mouse button will delete the buffer.
"
" NOTE: This feature is only supported in Neovim with `has('tablineat')`.
" >
" Key Bindings | Descriptions
" ---------------- | --------------------
" <Mouse-left> | Switch to the buffer
" <Mouse-middle> | Delete the buffer
" <
" @subsection Tab manager
"
" You can also use `SPC t t` to open the tab manager window.
"
" Key bindings within the tab manager window:
" >
" Key Bindings | Descriptions
" ----------------- | -----------------------------------------
" o | Close or expand tab windows.
" r | Rename the tab under the cursor.
" n | Create new named tab below the cursor tab
" N | Create new tab below the cursor tab
" x | Delete the tab
" Ctrl-Shift-Up | Move tab backward
" Ctrl-Shift-Down | Move tab forward
" <Enter> | Switch to the window under the cursor.
" <
scriptencoding utf-8
if exists('g:_spacevim_tabline_loaded')
finish
endif
let g:_spacevim_tabline_loaded = 1
let s:enable_default_mappings = 1
if has('nvim-0.9.0')
function! SpaceVim#layers#core#tabline#get() abort
return v:lua.require('spacevim.plugin.tabline').get()
endfunction
function! SpaceVim#layers#core#tabline#config() abort
lua require('spacevim.plugin.tabline').enable()
set tabline=%!v:lua.require('spacevim.plugin.tabline').get()
augroup SpaceVim_tabline
autocmd!
autocmd ColorScheme * lua require('spacevim.plugin.tabline').def_colors()
augroup END
if s:enable_default_mappings
nnoremap <silent> <C-S-Left> <cmd>lua require('spacevim.plugin.tabline').move_to_previous()<CR>
nnoremap <silent> <C-S-Right> <cmd>lua require('spacevim.plugin.tabline').move_to_next()<CR>
endif
let shift_keys = {
\ '1': '!',
\ '2': '@',
\ '3': '#',
\ '4': '$',
\ '5': '%',
\ '6': '^',
\ '7': '&',
\ '8': '*',
\ '9': '(',
\ '0': ')'
\}
for i in range(1, 20)
let key = i % 10
if i > 10
let key = shift_keys[string(key)]
endif
exe "call SpaceVim#mapping#def('nmap <silent>', '<leader>" . key
\ . "', ':call SpaceVim#layers#core#tabline#jump("
\ . i . ")<cr>', 'Switch to airline tab " . i
\ . "', '', 'tabline index " . i . "')"
endfor
endfunction
function! SpaceVim#layers#core#tabline#jump(id, ...) abort
call SpaceVim#logger#info(a:id)
call SpaceVim#logger#info(string(a:000))
lua require('spacevim.plugin.tabline').jump(vim.api.nvim_eval('a:id'))
endfunction
function! SpaceVim#layers#core#tabline#def_colors() abort
call v:lua.require('spacevim.plugin.tabline').def_colors()
endfunction
function! SpaceVim#layers#core#tabline#health() abort
call SpaceVim#layers#core#tabline#config()
return 1
endfunction
function! SpaceVim#layers#core#tabline#loadable() abort
return 1
endfunction
function! SpaceVim#layers#core#tabline#plugins() abort
return []
endfunction
function! SpaceVim#layers#core#tabline#set_variable(var) abort
let s:enable_default_mappings = get(a:var, 'enable_default_mappings', s:enable_default_mappings)
endfunction
function! SpaceVim#layers#core#tabline#get_options() abort
return ['enable_default_mappings']
endfunction
finish
endif
" loadding APIs {{{
let s:MESSLETTERS = SpaceVim#api#import('messletters')
let s:FILE = SpaceVim#api#import('file')
let s:BUFFER = SpaceVim#api#import('vim#buffer')
let s:HI = SpaceVim#api#import('vim#highlight')
let s:LOG = SpaceVim#logger#derive('tabline ')
let s:SYS = SpaceVim#api#import('system')
let s:TAB = SpaceVim#api#import('vim#tab')
" }}}
" init
let s:buffers = s:BUFFER.listed_buffers()
let s:separators = {
\ 'arrow' : ["\ue0b0", "\ue0b2"],
\ 'curve' : ["\ue0b4", "\ue0b6"],
\ 'slant' : ["\ue0b8", "\ue0ba"],
\ 'brace' : ["\ue0d2", "\ue0d4"],
\ 'fire' : ["\ue0c0", "\ue0c2"],
\ 'nil' : ['', ''],
\ }
let s:i_separators = {
\ 'arrow' : ["\ue0b1", "\ue0b3"],
\ 'slant' : ["\ue0b9", "\ue0bb"],
\ 'bar' : ['|', '|'],
\ 'nil' : ['', ''],
\ }
let [s:lsep , s:rsep] = ['', '']
let [s:ilsep , s:irsep] = ['', '']
function! s:get_no_empty(a, b) abort
if empty(a:a)
return a:b
else
return a:a
endif
endfunction
function! s:move_tabpage(direction)
" get number of tab pages.
let ntp = tabpagenr("$")
if ntp > 1
" get number of current tab page.
let ctpn = tabpagenr()
if a:direction > 0
let index = (ctpn + a:direction) % ntp
if index == 0
let index = ntp
elseif index == 1
let index = 0
endif
else
let index = (ctpn + a:direction) % ntp
if index < 0
let index = ntp + index
endif
if index == 0
let index = ntp
elseif index == 1
let index = 0
else
let index -= 1
endif
endif
" move tab page.
execute "tabmove ".index
endif
endfunction
function! s:tabname(bufnr) abort
let name = bufname(a:bufnr)
if name ==# '\[Vader\]'
let fn = '[Vader]'
elseif name =~# 'term://.*'
let fn = 'Terminal'
else
let fn = fnamemodify(name, ':t')
endif
if g:spacevim_enable_tabline_ft_icon || get(g:, 'spacevim_enable_tabline_filetype_icon', 0)
let icon = s:FILE.fticon(fn)
if !empty(icon)
let fn = fn . ' ' . icon
endif
endif
if empty(fn)
return 'No Name'
else
return fn
endif
endfunction
function! s:wrap_id(id) abort
if g:spacevim_buffer_index_type == 3
let id = s:MESSLETTERS.index_num(a:id)
elseif g:spacevim_buffer_index_type == 4
let id = a:id
else
let id = s:MESSLETTERS.bubble_num(a:id, g:spacevim_buffer_index_type)
endif
return id . ' '
endfunction
" build the tab item, the first argv is bufnr, and the second argv is tabnr
function! s:buffer_item(bufnr, ...) abort
let name = s:tabname(a:bufnr)
let tabnr = get(a:000, 0, -1)
if tabnr != -1
let tabname = gettabvar(tabnr, '_spacevim_tab_name', '')
let len = strlen(tabname) + 3
else
let tabname = ''
let len = strlen(name) + 3
endif
let item = {
\ 'bufnr' : a:bufnr,
\ 'len' : len,
\ 'bufname' : name,
\ 'tabname' : tabname,
\ 'tabnr' : tabnr,
\ }
return item
endfunction
" check if the items len longer than &columns
" the check_len function should also check the tab name.
function! s:check_len(items) abort
let len = 0
for item in a:items
let len += item.len
endfor
return len > &columns - 25
endfunction
function! s:is_modified(nr) abort
return getbufvar(a:nr, '&modified', 0)
endfunction
" cache shown_items
let s:shown_items = []
function! SpaceVim#layers#core#tabline#get() abort
let tabpage_counts = tabpagenr('$')
let all_tabline_items = []
let shown_items = []
if tabpage_counts > 1
let current_tabnr = tabpagenr()
let previous_tabnr = s:TAB.previous_tabpagenr()
let matched_len = 0
for i in range(1, tabpage_counts)
call add(all_tabline_items, s:buffer_item(tabpagebuflist(i)[tabpagewinnr(i) - 1], i))
endfor
if previous_tabnr < current_tabnr
for i in range(previous_tabnr == 0 ? 1 : previous_tabnr, current_tabnr)
call add(shown_items, all_tabline_items[i - 1])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, 0)
endif
endfor
if !matched_len && current_tabnr < tabpage_counts
for i in range(current_tabnr + 1, tabpage_counts)
call add(shown_items, all_tabline_items[i - 1])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, -1)
break
endif
endfor
endif
if !matched_len && previous_tabnr > 1
for i in reverse(range(1, previous_tabnr - 1))
call insert(shown_items, all_tabline_items[i - 1])
if s:check_len(shown_items)
call remove(shown_items, 0)
break
endif
endfor
endif
else
for i in range(current_tabnr, previous_tabnr > tabpage_counts ? tabpage_counts : previous_tabnr)
call add(shown_items, all_tabline_items[i - 1])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, -1)
break
endif
endfor
if !matched_len && current_tabnr > 1
for i in reverse(range(1, current_tabnr - 1))
call insert(shown_items, all_tabline_items[i - 1])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, 0)
break
endif
endfor
endif
if !matched_len && previous_tabnr < tabpage_counts
for i in range(previous_tabnr + 1, tabpage_counts)
call add(shown_items, all_tabline_items[i - 1])
if s:check_len(shown_items)
call remove(shown_items, -1)
break
endif
endfor
endif
endif
" get the list of displayed items
let s:shown_items = shown_items
if empty(shown_items)
return ''
endif
let t = ''
let right_hidden_tab_number = shown_items[0].tabnr - 1
let left_hidden_tab_number = tabpage_counts - shown_items[-1].tabnr
if right_hidden_tab_number > 0
let t .= '%#SpaceVim_tabline_a#' . ' << '. right_hidden_tab_number
endif
if current_tabnr == shown_items[0].tabnr
if s:is_modified(shown_items[0].bufnr)
if right_hidden_tab_number > 0
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_m#' . s:lsep
endif
let t .= '%#SpaceVim_tabline_m# '
else
if right_hidden_tab_number > 0
let t .= ' ' . s:ilsep
endif
let t .= '%#SpaceVim_tabline_a# '
endif
else
if right_hidden_tab_number > 0
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep
endif
let t .= s:is_modified(shown_items[0].bufnr) ? '%#SpaceVim_tabline_m_i# ' : '%#SpaceVim_tabline_b# '
endif
let index = 1
for item in shown_items[:-2]
if has('tablineat')
let t .= '%' . index . '@SpaceVim#layers#core#tabline#jump@'
endif
let t .= s:wrap_id(index)
let t .= s:get_no_empty(gettabvar(item.tabnr, '_spacevim_tab_name'), item.bufname)
let index += 1
if item.tabnr == current_tabnr
if s:is_modified(item.bufnr)
let t .= ' %#SpaceVim_tabline_m_SpaceVim_tabline_b#' . s:lsep
else
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep
endif
let t .= s:is_modified(shown_items[index-1].bufnr) ? '%#SpaceVim_tabline_m_i# ' : '%#SpaceVim_tabline_b# '
elseif item.tabnr == current_tabnr - 1
" check if current_tabnr is modified
if s:is_modified(s:BUFFER.bufnr())
let t .= ' %#SpaceVim_tabline_b_SpaceVim_tabline_m#' . s:lsep . '%#SpaceVim_tabline_m# '
else
let t .= ' %#SpaceVim_tabline_b_SpaceVim_tabline_a#' . s:lsep . '%#SpaceVim_tabline_a# '
endif
else
let t .= s:is_modified(shown_items[index-1].bufnr) ? '%#SpaceVim_tabline_m_i# ' : '%#SpaceVim_tabline_b# '
let t .= s:ilsep . ' '
endif
endfor
let item = shown_items[-1]
if has('tablineat')
let t .= '%' . index . '@SpaceVim#layers#core#tabline#jump@'
endif
let t .= s:wrap_id(index) . s:get_no_empty(gettabvar(item.tabnr, '_spacevim_tab_name'), item.bufname)
if item.tabnr == current_tabnr
if left_hidden_tab_number > 0
if s:is_modified(item.bufnr)
let t .= ' %#SpaceVim_tabline_m_SpaceVim_tabline_a#' . s:lsep
let t .= ' %#SpaceVim_tabline_a#' . left_hidden_tab_number . ' >>'
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
else
let t .= ' ' . s:ilsep
let t .= ' ' . left_hidden_tab_number . ' >>'
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
endif
else
if s:is_modified(item.bufnr)
let t .= ' %#SpaceVim_tabline_m_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
else
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
endif
endif
else
if left_hidden_tab_number > 0
let t .= ' %#SpaceVim_tabline_b_SpaceVim_tabline_a#' . s:lsep
let t .= ' %#SpaceVim_tabline_a#' . left_hidden_tab_number . ' >>'
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
else
let t .= ' ' . s:ilsep
endif
endif
" how many buffers after the last item are hidden?
let t .= '%=%#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:rsep
let t .= '%#SpaceVim_tabline_a# Tabs '
return t
else
let s:buffers = s:BUFFER.listed_buffers()
if empty(s:buffers)
return ''
endif
for i in range(len(s:buffers))
call add(all_tabline_items, s:buffer_item(s:buffers[i]))
endfor
let current_buf_index = index(s:buffers, s:BUFFER.bufnr())
let previous_buf_index = index(s:buffers, s:BUFFER.bufnr('#'))
let matched_len = 0
if current_buf_index ==# -1
let shown_items = filter(s:shown_items, 'buflisted(v:val.bufnr)')
else
if previous_buf_index < current_buf_index
if previous_buf_index == -1
let previous_buf_index = 0
endif
for i in range(previous_buf_index, current_buf_index)
call add(shown_items, all_tabline_items[i])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, 0)
endif
endfor
if !matched_len && current_buf_index < len(s:buffers) - 1
for i in range(current_buf_index + 1, len(s:buffers) - 1)
call add(shown_items, all_tabline_items[i])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, -1)
break
endif
endfor
endif
if !matched_len && previous_buf_index > 0
for i in reverse(range(0, previous_buf_index - 1))
call insert(shown_items, all_tabline_items[i])
if s:check_len(shown_items)
call remove(shown_items, 0)
break
endif
endfor
endif
else
if previous_buf_index == -1
let previous_buf_index = len(s:buffers) - 1
endif
for i in range(current_buf_index, previous_buf_index)
call add(shown_items, all_tabline_items[i])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, -1)
break
endif
endfor
if !matched_len && current_buf_index > 0
for i in reverse(range(0, current_buf_index - 1))
call insert(shown_items, all_tabline_items[i])
if s:check_len(shown_items)
let matched_len = 1
call remove(shown_items, 0)
break
endif
endfor
endif
if !matched_len && previous_buf_index < len(s:buffers) - 1
for i in range(previous_buf_index + 1, len(s:buffers) - 1)
call add(shown_items, all_tabline_items[i])
if s:check_len(shown_items)
call remove(shown_items, -1)
break
endif
endfor
endif
endif
let s:shown_items = shown_items
let g:_spacevim_list_buffers = map(deepcopy(s:shown_items), 'v:val.bufnr')
endif
if empty(shown_items)
return ''
endif
let t = ''
" how many buffers before the first item are hidden.
let right_hidden_buffer_number = index(s:buffers, shown_items[0].bufnr)
let left_hidden_buffer_number = len(s:buffers) - 1 - index(s:buffers, shown_items[-1].bufnr)
if right_hidden_buffer_number > 0
let t .= '%#SpaceVim_tabline_a#' . ' << '. right_hidden_buffer_number
endif
if s:BUFFER.bufnr() == shown_items[0].bufnr
if s:is_modified(shown_items[0].bufnr)
if right_hidden_buffer_number > 0
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_m#' . s:lsep
endif
let t .= '%#SpaceVim_tabline_m# '
else
if right_hidden_buffer_number > 0
let t .= ' ' . s:ilsep
endif
let t .= '%#SpaceVim_tabline_a# '
endif
else
if right_hidden_buffer_number > 0
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep
endif
let t .= s:is_modified(shown_items[0].bufnr) ? '%#SpaceVim_tabline_m_i# ' : '%#SpaceVim_tabline_b# '
endif
let index = 1
for item in shown_items[:-2]
if has('tablineat')
let t .= '%' . index . '@SpaceVim#layers#core#tabline#jump@'
endif
let t .= s:wrap_id(index) . item.bufname
let index += 1
if item.bufnr == s:BUFFER.bufnr()
if s:is_modified(item.bufnr)
let t .= ' %#SpaceVim_tabline_m_SpaceVim_tabline_b#' . s:lsep
else
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep
endif
let t .= s:is_modified(s:buffers[index(s:buffers, item.bufnr) + 1]) ? '%#SpaceVim_tabline_m_i# ' : '%#SpaceVim_tabline_b# '
elseif index(s:buffers, s:BUFFER.bufnr()) > 0 && item.bufnr == s:buffers[index(s:buffers, s:BUFFER.bufnr()) - 1]
if s:is_modified(s:BUFFER.bufnr())
let t .= ' %#SpaceVim_tabline_b_SpaceVim_tabline_m#' . s:lsep . '%#SpaceVim_tabline_m# '
else
let t .= ' %#SpaceVim_tabline_b_SpaceVim_tabline_a#' . s:lsep . '%#SpaceVim_tabline_a# '
endif
else
let t .= s:is_modified(s:buffers[index(s:buffers, item.bufnr) + 1]) ? '%#SpaceVim_tabline_m_i# ' : '%#SpaceVim_tabline_b# '
let t .= s:ilsep . ' '
endif
endfor
let item = shown_items[-1]
if has('tablineat')
let t .= '%' . index . '@SpaceVim#layers#core#tabline#jump@'
endif
let t .= s:wrap_id(index) . item.bufname
if item.bufnr == s:BUFFER.bufnr()
if left_hidden_buffer_number > 0
if s:is_modified(item.bufnr)
let t .= ' %#SpaceVim_tabline_m_SpaceVim_tabline_a#' . s:lsep
let t .= ' %#SpaceVim_tabline_a#' . left_hidden_buffer_number . ' >>'
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
else
let t .= ' ' . s:ilsep
let t .= ' ' . left_hidden_buffer_number . ' >>'
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
endif
else
if s:is_modified(item.bufnr)
let t .= ' %#SpaceVim_tabline_m_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
else
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
endif
endif
else
if left_hidden_buffer_number > 0
let t .= ' %#SpaceVim_tabline_b_SpaceVim_tabline_a#' . s:lsep
let t .= ' %#SpaceVim_tabline_a#' . left_hidden_buffer_number . ' >>'
let t .= ' %#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:lsep . '%#SpaceVim_tabline_b#'
else
let t .= ' ' . s:ilsep
endif
endif
" how many buffers after the last item are hidden?
let t .= '%=%#SpaceVim_tabline_a_SpaceVim_tabline_b#' . s:rsep
let t .= '%#SpaceVim_tabline_a# Buffers '
return t
endif
endfunction
function! SpaceVim#layers#core#tabline#config() abort
let [s:lsep , s:rsep] = get(s:separators, g:spacevim_statusline_separator, s:separators['arrow'])
let [s:ilsep , s:irsep] = get(s:i_separators, g:spacevim_statusline_iseparator, s:separators['arrow'])
set tabline=%!SpaceVim#layers#core#tabline#get()
augroup SpaceVim_tabline
autocmd!
autocmd ColorScheme * call SpaceVim#layers#core#tabline#def_colors()
augroup END
if s:enable_default_mappings
nnoremap <silent> <C-S-Left> :call <SID>move_tabpage(-1)<CR>
nnoremap <silent> <C-S-Right> :call <SID>move_tabpage(1)<CR>
endif
let shift_keys = {
\ '1': '!',
\ '2': '@',
\ '3': '#',
\ '4': '$',
\ '5': '%',
\ '6': '^',
\ '7': '&',
\ '8': '*',
\ '9': '(',
\ '0': ')'
\}
for i in range(1, 20)
let key = i % 10
if i > 10
let key = shift_keys[string(key)]
endif
exe "call SpaceVim#mapping#def('nmap <silent>', '<leader>" . key
\ . "', ':call SpaceVim#layers#core#tabline#jump("
\ . i . ")<cr>', 'Switch to airline tab " . i
\ . "', '', 'tabline index " . i . "')"
endfor
endfunction
function! SpaceVim#layers#core#tabline#jump(id, ...) abort
call SpaceVim#logger#info(a:id)
call SpaceVim#logger#info(string(a:000))
if len(s:shown_items) >= a:id
let item = s:shown_items[a:id - 1]
let mouse = get(a:000, 1, '')
if tabpagenr('$') > 1
if mouse ==# 'm'
exe 'tabclose ' . item.tabnr
elseif mouse ==# 'l'
exe 'tabnext' . item.tabnr
else
exe 'tabnext' . item.tabnr
endif
else
if mouse ==# 'm'
exe 'bd ' . item.bufnr
elseif mouse ==# 'l'
exe 'silent b ' . item.bufnr
else
exe 'silent b ' . item.bufnr
endif
endif
endif
endfunction
function! SpaceVim#layers#core#tabline#def_colors() abort
let name = get(g:, 'colors_name', 'gruvbox')
if !empty(g:spacevim_custom_color_palette)
let t = g:spacevim_custom_color_palette
else
try
let t = SpaceVim#mapping#guide#theme#{name}#palette()
catch /^Vim\%((\a\+)\)\=:E117/
let t = SpaceVim#mapping#guide#theme#gruvbox#palette()
endtry
endif
exe 'hi! SpaceVim_tabline_a ctermbg=' . t[0][2] . ' ctermfg=' . t[0][3] . ' guibg=' . t[0][1] . ' guifg=' . t[0][0]
if name ==# 'palenight'
exe 'hi! SpaceVim_tabline_b ctermbg=' . '236' . ' ctermfg=' . t[1][3] . ' guibg=' .'#44475a'. ' guifg=' . t[1][0]
else
exe 'hi! SpaceVim_tabline_b ctermbg=' . t[1][2] . ' ctermfg=' . t[1][3] . ' guibg=' . t[1][1] . ' guifg=' . t[1][0]
endif
" SpaceVim_tabline_c is for modified buffers
exe 'hi! SpaceVim_tabline_m ctermbg=' . t[4][3] . ' ctermfg=' . t[4][2] . ' guibg=' . t[4][1] . ' guifg=' . t[4][0]
if name ==# 'palenight'
exe 'hi! SpaceVim_tabline_m_i ctermbg=' . '236' . ' ctermfg=' . t[4][3] . ' guibg=' . '#44475a' . ' guifg=' . t[4][1]
else
exe 'hi! SpaceVim_tabline_m_i ctermbg=' . t[1][2] . ' ctermfg=' . t[4][3] . ' guibg=' . t[1][1] . ' guifg=' . t[4][1]
endif
call s:HI.hi_separator('SpaceVim_tabline_a', 'SpaceVim_tabline_b')
call s:HI.hi_separator('SpaceVim_tabline_m', 'SpaceVim_tabline_b')
call s:HI.hi_separator('SpaceVim_tabline_m', 'SpaceVim_tabline_a')
endfunction
function! SpaceVim#layers#core#tabline#health() abort
call SpaceVim#layers#core#tabline#config()
return 1
endfunction
function! SpaceVim#layers#core#tabline#loadable() abort
return 1
endfunction
function! SpaceVim#layers#core#tabline#plugins() abort
return []
endfunction
function! SpaceVim#layers#core#tabline#set_variable(var) abort
let s:enable_default_mappings = get(a:var, 'enable_default_mappings', s:enable_default_mappings)
endfunction
function! SpaceVim#layers#core#tabline#get_options() abort
return ['enable_default_mappings']
endfunction