tabs.vim 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. " MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
  2. " vim: et ts=2 sts=2 sw=2
  3. scriptencoding utf-8
  4. let s:spc = g:airline_symbols.space
  5. let s:current_bufnr = -1
  6. let s:current_tabnr = -1
  7. let s:current_modified = 0
  8. function! airline#extensions#tabline#tabs#off()
  9. augroup airline_tabline_tabs
  10. autocmd!
  11. augroup END
  12. endfunction
  13. function! airline#extensions#tabline#tabs#on()
  14. augroup airline_tabline_tabs
  15. autocmd!
  16. autocmd BufDelete * call airline#extensions#tabline#tabs#invalidate()
  17. augroup END
  18. endfunction
  19. function! airline#extensions#tabline#tabs#invalidate()
  20. if exists('#airline')
  21. let s:current_bufnr = -1
  22. endif
  23. endfunction
  24. function! airline#extensions#tabline#tabs#get()
  25. let curbuf = bufnr('%')
  26. let curtab = tabpagenr()
  27. try
  28. call airline#extensions#tabline#tabs#map_keys()
  29. catch
  30. " no-op
  31. endtry
  32. if curbuf == s:current_bufnr && curtab == s:current_tabnr && &columns == s:column_width
  33. if !g:airline_detect_modified || getbufvar(curbuf, '&modified') == s:current_modified
  34. return s:current_tabline
  35. endif
  36. endif
  37. let s:filtered_buflist = airline#extensions#tabline#buflist#list()
  38. let b = airline#extensions#tabline#new_builder()
  39. call airline#extensions#tabline#add_label(b, 'tabs', 0)
  40. function! b.get_group(i) dict
  41. let curtab = tabpagenr()
  42. let group = 'airline_tab'
  43. if a:i == curtab
  44. let group = 'airline_tabsel'
  45. if g:airline_detect_modified
  46. for bi in tabpagebuflist(curtab)
  47. if index(s:filtered_buflist,bi) != -1
  48. if getbufvar(bi, '&modified')
  49. let group = 'airline_tabmod'
  50. endif
  51. endif
  52. endfor
  53. endif
  54. let s:current_modified = (group == 'airline_tabmod') ? 1 : 0
  55. endif
  56. return group
  57. endfunction
  58. function! b.get_title(i) dict
  59. let val = '%('
  60. if get(g:, 'airline#extensions#tabline#show_tab_nr', 1)
  61. let val .= airline#extensions#tabline#tabs#tabnr_formatter(a:i, tabpagebuflist(a:i))
  62. endif
  63. return val.'%'.a:i.'T %{airline#extensions#tabline#title('.a:i.')} %)'
  64. endfunction
  65. call b.insert_titles(curtab, 1, tabpagenr('$'))
  66. call b.add_section('airline_tabfill', '')
  67. call b.split()
  68. call b.add_section('airline_tabfill', '')
  69. if get(g:, 'airline#extensions#tabline#show_close_button', 1)
  70. call b.add_section('airline_tab_right', ' %999X'.
  71. \ get(g:, 'airline#extensions#tabline#close_symbol', 'X').'%X ')
  72. endif
  73. if get(g:, 'airline#extensions#tabline#show_splits', 1) == 1
  74. let buffers = tabpagebuflist(curtab)
  75. for nr in buffers
  76. if index(s:filtered_buflist,nr) != -1
  77. let group = airline#extensions#tabline#group_of_bufnr(buffers, nr) . "_right"
  78. call b.add_section_spaced(group, '%(%{airline#extensions#tabline#get_buffer_name('.nr.')}%)')
  79. endif
  80. endfor
  81. if get(g:, 'airline#extensions#tabline#show_buffers', 1)
  82. call airline#extensions#tabline#add_label(b, 'buffers', 1)
  83. endif
  84. endif
  85. call airline#extensions#tabline#add_tab_label(b)
  86. let s:current_bufnr = curbuf
  87. let s:current_tabnr = curtab
  88. let s:column_width = &columns
  89. let s:current_tabline = b.build()
  90. return s:current_tabline
  91. endfunction
  92. function! airline#extensions#tabline#tabs#map_keys()
  93. if maparg('<Plug>AirlineSelectTab1', 'n') is# ':1tabn<CR>'
  94. return
  95. endif
  96. let bidx_mode = get(g:, 'airline#extensions#tabline#buffer_idx_mode', 1)
  97. if bidx_mode == 1
  98. for i in range(1, 10)
  99. exe printf('noremap <silent> <Plug>AirlineSelectTab%d :%dtabn<CR>', i%10, i)
  100. endfor
  101. else
  102. for i in range(11, 99)
  103. exe printf('noremap <silent> <Plug>AirlineSelectTab%d :%dtabn<CR>', i, i-10)
  104. endfor
  105. endif
  106. noremap <silent> <Plug>AirlineSelectPrevTab gT
  107. " tabn {count} goes to count tab does not go {count} tab pages forward!
  108. noremap <silent> <Plug>AirlineSelectNextTab :<C-U>exe repeat(':tabn\|', v:count1)<cr>
  109. endfunction
  110. function! airline#extensions#tabline#tabs#tabnr_formatter(nr, i) abort
  111. let formatter = get(g:, 'airline#extensions#tabline#tabnr_formatter', 'tabnr')
  112. try
  113. return airline#extensions#tabline#formatters#{formatter}#format(a:nr, a:i)
  114. catch /^Vim\%((\a\+)\)\=:E117/ " catch E117, unknown function
  115. " Function not found
  116. return call(formatter, [a:nr, a:i])
  117. catch
  118. " something went wrong, return an empty string
  119. return ""
  120. endtry
  121. endfunction