tabws.vim 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. " MIT License. Copyright (c) 2016-2021 Kevin Sapper et al.
  2. " PLugin: https://github.com/s1341/vim-tabws
  3. " vim: et ts=2 sts=2 sw=2
  4. scriptencoding utf-8
  5. let s:current_bufnr = -1
  6. let s:current_modified = 0
  7. let s:current_tabnr = -1
  8. let s:current_tabline = ''
  9. let s:highlight_groups = ['hid', 0, '', 'sel', 'mod_unsel', 0, 'mod_unsel', 'mod']
  10. function! airline#extensions#tabline#tabws#off()
  11. augroup airline_tabline_tabws
  12. autocmd!
  13. augroup END
  14. endfunction
  15. function! airline#extensions#tabline#tabws#on()
  16. augroup airline_tabline_tabws
  17. autocmd!
  18. autocmd BufDelete * call airline#extensions#tabline#tabws#invalidate()
  19. augroup END
  20. endfunction
  21. function! airline#extensions#tabline#tabws#invalidate()
  22. if exists('#airline')
  23. let s:current_bufnr = -1
  24. let s:current_tabnr = -1
  25. endif
  26. endfunction
  27. function! airline#extensions#tabline#tabws#add_buffer_section(builder, cur_tab, cur_buf, pull_right)
  28. let pos_extension = (a:pull_right ? '_right' : '')
  29. let bufnr_list = tabws#getbuffersfortab(a:cur_tab)
  30. if index(bufnr_list, a:cur_buf) == -1 && a:cur_tab == s:current_tabnr
  31. return 0
  32. endif
  33. let s:current_modified = getbufvar(a:cur_buf, '&modified')
  34. let visible_list = tabpagebuflist(a:cur_tab)
  35. for buffer in bufnr_list
  36. let group = 'airline_tab'
  37. \ .s:highlight_groups[(4 * getbufvar(buffer, '&modified')) + (2 * (index(visible_list, buffer) != -1)) + (a:cur_buf == buffer)]
  38. \ .pos_extension
  39. let buf_name = '%(%{airline#extensions#tabline#get_buffer_name('.buffer.')}%)'
  40. if has("tablineat")
  41. let buf_name = '%'.buffer.'@airline#extensions#tabline#buffers#clickbuf@'.buf_name.'%X'
  42. endif
  43. call a:builder.add_section_spaced(group, buf_name)
  44. endfor
  45. " add by tenfy(tenfyzhong@qq.com)
  46. " if the selected buffer was updated
  47. " return true
  48. return 1
  49. endfunction
  50. function! airline#extensions#tabline#tabws#add_tab_section(builder, pull_right)
  51. let pos_extension = (a:pull_right ? '_right' : '')
  52. for tab in range(1, tabpagenr('$'))
  53. let current = tab == tabpagenr()
  54. let group = 'airline_tab'
  55. \ .s:highlight_groups[(3 * current)]
  56. \ .pos_extension
  57. if get(g:, 'airline#extensions#tabline#tabws_show_tab_nr', 0) == 0
  58. call a:builder.add_section_spaced(group, '%'.tab.'T'.tabws#gettabname(tab).'%T')
  59. else
  60. call a:builder.add_section_spaced(group, '%'.tab.'T'.tab.(g:airline_symbols.space).tabws#gettabname(tab).'%T')
  61. endif
  62. endfor
  63. endfunction
  64. function! airline#extensions#tabline#tabws#get()
  65. let cur_buf = bufnr('%')
  66. let buffer_label = get(g:, 'airline#extensions#tabline#buffers_label', 'buffers')
  67. let tab_label = get(g:, 'airline#extensions#tabline#tabs_label', 'tabs')
  68. let switch_buffers_and_tabs = get(g:, 'airline#extensions#tabline#switch_buffers_and_tabs', 0)
  69. try
  70. call airline#extensions#tabline#tabs#map_keys()
  71. endtry
  72. let cur_tab = tabpagenr()
  73. if cur_buf == s:current_bufnr && cur_tab == s:current_tabnr
  74. if !g:airline_detect_modified || getbufvar(cur_buf, '&modified') == s:current_modified
  75. return s:current_tabline
  76. endif
  77. endif
  78. let builder = airline#extensions#tabline#new_builder()
  79. let show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
  80. let show_tabs = get(g:, 'airline#extensions#tabline#show_tabs', 1)
  81. let AppendBuffers = function('airline#extensions#tabline#tabws#add_buffer_section', [builder, cur_tab, cur_buf])
  82. let AppendTabs = function('airline#extensions#tabline#tabws#add_tab_section', [builder])
  83. let AppendLabel = function(builder.add_section_spaced, ['airline_tabtype'], builder)
  84. " <= 1: |{Tabs} <tab|
  85. " == 2: |{Buffers} <buffers|
  86. " == 3: |buffers> {Buffers} {Tabs} <tabs|
  87. let showing_mode = (2 * show_buffers) + (show_tabs)
  88. let ignore_update = 0
  89. " Add left tabline content
  90. if showing_mode <= 1 " Tabs only mode
  91. call AppendTabs(0)
  92. elseif showing_mode == 2 " Buffers only mode
  93. let ignore_update = !AppendBuffers(0)
  94. else
  95. if !switch_buffers_and_tabs
  96. call AppendLabel(buffer_label)
  97. let ignore_update = !AppendBuffers(0)
  98. else
  99. call AppendLabel(tab_label)
  100. call AppendTabs(0)
  101. endif
  102. endif
  103. if ignore_update | return s:current_tabline | endif
  104. call builder.add_section('airline_tabfill', '')
  105. call builder.split()
  106. call builder.add_section('airline_tabfill', '')
  107. " Add right tabline content
  108. if showing_mode <= 1 " Tabs only mode
  109. call AppendLabel(tab_label)
  110. elseif showing_mode == 2 " Buffers only mode
  111. call AppendLabel(buffer_label)
  112. else
  113. if !switch_buffers_and_tabs
  114. call AppendTabs(1)
  115. call AppendLabel(tab_label)
  116. else
  117. let ignore_update = AppendBuffers(1)
  118. call AppendLabel(buffer_label)
  119. endif
  120. endif
  121. if ignore_update | return s:current_tabline | endif
  122. let s:current_bufnr = cur_buf
  123. let s:current_tabnr = cur_tab
  124. let s:current_tabline = builder.build()
  125. return s:current_tabline
  126. endfunction