ctrlspace.vim 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. " MIT License. Copyright (c) 2016-2021 Kevin Sapper et al.
  2. " Plugin: https://github.com/szw/vim-ctrlspace
  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#ctrlspace#off()
  11. augroup airline_tabline_ctrlspace
  12. autocmd!
  13. augroup END
  14. endfunction
  15. function! airline#extensions#tabline#ctrlspace#on()
  16. augroup airline_tabline_ctrlspace
  17. autocmd!
  18. autocmd BufDelete * call airline#extensions#tabline#ctrlspace#invalidate()
  19. augroup END
  20. endfunction
  21. function! airline#extensions#tabline#ctrlspace#invalidate()
  22. if !exists('#airline')
  23. return
  24. endif
  25. let s:current_bufnr = -1
  26. let s:current_tabnr = -1
  27. endfunction
  28. function! airline#extensions#tabline#ctrlspace#add_buffer_section(builder, cur_tab, cur_buf, pull_right)
  29. let pos_extension = (a:pull_right ? '_right' : '')
  30. let buffer_list = []
  31. for bufferindex in sort(keys(ctrlspace#api#Buffers(a:cur_tab)), 'N')
  32. for buffer in ctrlspace#api#BufferList(a:cur_tab)
  33. if buffer['index'] == bufferindex
  34. call add(buffer_list, buffer)
  35. endif
  36. endfor
  37. endfor
  38. " add by tenfy(tenfyzhong@qq.com)
  39. " if the current buffer no in the buffer list
  40. " return false and no redraw tabline.
  41. " Fixes #1515. if there a BufEnter autocmd execute redraw. The tabline may no update.
  42. let bufnr_list = map(copy(buffer_list), 'v:val["index"]')
  43. if index(bufnr_list, a:cur_buf) == -1 && a:cur_tab == s:current_tabnr
  44. return 0
  45. endif
  46. let s:current_modified = getbufvar(a:cur_buf, '&modified')
  47. for buffer in buffer_list
  48. let group = 'airline_tab'
  49. \ .s:highlight_groups[(4 * buffer.modified) + (2 * buffer.visible) + (a:cur_buf == buffer.index)]
  50. \ .pos_extension
  51. let buf_name = '%(%{airline#extensions#tabline#get_buffer_name('.buffer.index.')}%)'
  52. if has("tablineat")
  53. let buf_name = '%'.buffer.index.'@airline#extensions#tabline#buffers#clickbuf@'.buf_name.'%X'
  54. endif
  55. call a:builder.add_section_spaced(group, buf_name)
  56. endfor
  57. " add by tenfy(tenfyzhong@qq.com)
  58. " if the selected buffer was updated
  59. " return true
  60. return 1
  61. endfunction
  62. function! airline#extensions#tabline#ctrlspace#add_tab_section(builder, pull_right)
  63. let pos_extension = (a:pull_right ? '_right' : '')
  64. let tab_list = ctrlspace#api#TabList()
  65. for tab in tab_list
  66. let group = 'airline_tab'
  67. \ .s:highlight_groups[(4 * tab.modified) + (3 * tab.current)]
  68. \ .pos_extension
  69. if get(g:, 'airline#extensions#tabline#ctrlspace_show_tab_nr', 0) == 0
  70. call a:builder.add_section_spaced(group, '%'.tab.index.'T'.tab.title.ctrlspace#api#TabBuffersNumber(tab.index).'%T')
  71. else
  72. call a:builder.add_section_spaced(group, '%'.(tab.index).'T'.(tab.index).(g:airline_symbols.space).(tab.title).ctrlspace#api#TabBuffersNumber(tab.index).'%T')
  73. endif
  74. endfor
  75. endfunction
  76. function! airline#extensions#tabline#ctrlspace#get()
  77. let cur_buf = bufnr('%')
  78. let buffer_label = get(g:, 'airline#extensions#tabline#buffers_label', 'buffers')
  79. let tab_label = get(g:, 'airline#extensions#tabline#tabs_label', 'tabs')
  80. let switch_buffers_and_tabs = get(g:, 'airline#extensions#tabline#switch_buffers_and_tabs', 0)
  81. try
  82. call airline#extensions#tabline#tabs#map_keys()
  83. endtry
  84. let cur_tab = tabpagenr()
  85. if cur_buf == s:current_bufnr && cur_tab == s:current_tabnr
  86. if !g:airline_detect_modified || getbufvar(cur_buf, '&modified') == s:current_modified
  87. return s:current_tabline
  88. endif
  89. endif
  90. let builder = airline#extensions#tabline#new_builder()
  91. let show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
  92. let show_tabs = get(g:, 'airline#extensions#tabline#show_tabs', 1)
  93. let AppendBuffers = function('airline#extensions#tabline#ctrlspace#add_buffer_section', [builder, cur_tab, cur_buf])
  94. let AppendTabs = function('airline#extensions#tabline#ctrlspace#add_tab_section', [builder])
  95. let AppendLabel = function(builder.add_section_spaced, ['airline_tabtype'], builder)
  96. " <= 1: |{Tabs} <tab|
  97. " == 2: |{Buffers} <buffers|
  98. " == 3: |buffers> {Buffers} {Tabs} <tabs|
  99. let showing_mode = (2 * show_buffers) + (show_tabs)
  100. let ignore_update = 0
  101. " Add left tabline content
  102. if showing_mode <= 1 " Tabs only mode
  103. call AppendTabs(0)
  104. elseif showing_mode == 2 " Buffers only mode
  105. let ignore_update = !AppendBuffers(0)
  106. else
  107. if !switch_buffers_and_tabs
  108. call AppendLabel(buffer_label)
  109. let ignore_update = !AppendBuffers(0)
  110. else
  111. call AppendLabel(tab_label)
  112. call AppendTabs(0)
  113. endif
  114. endif
  115. if ignore_update | return s:current_tabline | endif
  116. call builder.add_section('airline_tabfill', '')
  117. call builder.split()
  118. call builder.add_section('airline_tabfill', '')
  119. " Add right tabline content
  120. if showing_mode <= 1 " Tabs only mode
  121. call AppendLabel(tab_label)
  122. elseif showing_mode == 2 " Buffers only mode
  123. call AppendLabel(buffer_label)
  124. else
  125. if !switch_buffers_and_tabs
  126. call AppendTabs(1)
  127. call AppendLabel(tab_label)
  128. else
  129. let ignore_update = AppendBuffers(1)
  130. call AppendLabel(buffer_label)
  131. endif
  132. endif
  133. if ignore_update | return s:current_tabline | endif
  134. let s:current_bufnr = cur_buf
  135. let s:current_tabnr = cur_tab
  136. let s:current_tabline = builder.build()
  137. return s:current_tabline
  138. endfunction