extensions.vim 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  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:loaded_ext = []
  5. let s:ext = {}
  6. let s:ext._theme_funcrefs = []
  7. function! s:ext.add_statusline_func(name) dict
  8. call airline#add_statusline_func(a:name)
  9. endfunction
  10. function! s:ext.add_statusline_funcref(function) dict
  11. call airline#add_statusline_funcref(a:function)
  12. endfunction
  13. function! s:ext.add_inactive_statusline_func(name) dict
  14. call airline#add_inactive_statusline_func(a:name)
  15. endfunction
  16. function! s:ext.add_theme_func(name) dict
  17. call add(self._theme_funcrefs, function(a:name))
  18. endfunction
  19. let s:script_path = tolower(resolve(expand('<sfile>:p:h')))
  20. let s:filetype_overrides = {
  21. \ 'coc-explorer': [ 'CoC Explorer', '' ],
  22. \ 'defx': ['defx', '%{b:defx.paths[0]}'],
  23. \ 'fugitive': ['fugitive', '%{airline#util#wrap(airline#extensions#branch#get_head(),80)}'],
  24. \ 'floggraph': [ 'Flog', '%{get(b:, "flog_status_summary", "")}' ],
  25. \ 'gundo': [ 'Gundo', '' ],
  26. \ 'help': [ 'Help', '%f' ],
  27. \ 'minibufexpl': [ 'MiniBufExplorer', '' ],
  28. \ 'startify': [ 'startify', '' ],
  29. \ 'vim-plug': [ 'Plugins', '' ],
  30. \ 'vimfiler': [ 'vimfiler', '%{vimfiler#get_status_string()}' ],
  31. \ 'vimshell': ['vimshell','%{vimshell#get_status_string()}'],
  32. \ 'vaffle' : [ 'Vaffle', '%{b:vaffle.dir}' ],
  33. \ }
  34. if get(g:, 'airline#extensions#nerdtree_statusline', 1)
  35. let s:filetype_overrides['nerdtree'] = [ get(g:, 'NERDTreeStatusline', 'NERD'), '' ]
  36. else
  37. let s:filetype_overrides['nerdtree'] = ['NERDTree', '']
  38. endif
  39. let s:filetype_regex_overrides = {}
  40. function! s:check_defined_section(name)
  41. if !exists('w:airline_section_{a:name}')
  42. let w:airline_section_{a:name} = g:airline_section_{a:name}
  43. endif
  44. endfunction
  45. function! airline#extensions#append_to_section(name, value)
  46. call <sid>check_defined_section(a:name)
  47. let w:airline_section_{a:name} .= a:value
  48. endfunction
  49. function! airline#extensions#prepend_to_section(name, value)
  50. call <sid>check_defined_section(a:name)
  51. let w:airline_section_{a:name} = a:value . w:airline_section_{a:name}
  52. endfunction
  53. function! airline#extensions#apply_left_override(section1, section2)
  54. let w:airline_section_a = a:section1
  55. let w:airline_section_b = a:section2
  56. let w:airline_section_c = airline#section#create(['readonly'])
  57. let w:airline_render_left = 1
  58. let w:airline_render_right = 0
  59. endfunction
  60. function! airline#extensions#apply(...)
  61. let filetype_overrides = get(s:, 'filetype_overrides', {})
  62. call extend(filetype_overrides, get(g:, 'airline_filetype_overrides', {}), 'force')
  63. if s:is_excluded_window()
  64. return -1
  65. endif
  66. if &buftype == 'terminal'
  67. let w:airline_section_x = ''
  68. let w:airline_section_y = ''
  69. endif
  70. if &previewwindow && empty(get(w:, 'airline_section_a', ''))
  71. let w:airline_section_a = 'Preview'
  72. let w:airline_section_b = ''
  73. let w:airline_section_c = bufname(winbufnr(winnr()))
  74. endif
  75. if has_key(filetype_overrides, &ft) &&
  76. \ ((&filetype == 'help' && &buftype == 'help') || &filetype !~ 'help')
  77. " for help files only override it, if the buftype is also of type 'help',
  78. " else it would trigger when editing Vim help files
  79. let args = filetype_overrides[&ft]
  80. call airline#extensions#apply_left_override(args[0], args[1])
  81. endif
  82. if &buftype == 'help'
  83. let w:airline_section_x = ''
  84. let w:airline_section_y = ''
  85. let w:airline_render_right = 1
  86. endif
  87. for item in items(s:filetype_regex_overrides)
  88. if match(&ft, item[0]) >= 0
  89. call airline#extensions#apply_left_override(item[1][0], item[1][1])
  90. endif
  91. endfor
  92. endfunction
  93. function! s:is_excluded_window()
  94. for matchft in g:airline_exclude_filetypes
  95. if matchft ==# &ft
  96. return 1
  97. endif
  98. endfor
  99. for matchw in g:airline_exclude_filenames
  100. if matchstr(expand('%'), matchw) ==# matchw
  101. return 1
  102. endif
  103. endfor
  104. if g:airline_exclude_preview && &previewwindow
  105. return 1
  106. endif
  107. return 0
  108. endfunction
  109. function! airline#extensions#load_theme()
  110. call airline#util#exec_funcrefs(s:ext._theme_funcrefs, g:airline#themes#{g:airline_theme}#palette)
  111. endfunction
  112. function! airline#extensions#load()
  113. let s:loaded_ext = []
  114. if exists('g:airline_extensions')
  115. for ext in g:airline_extensions
  116. try
  117. call airline#extensions#{ext}#init(s:ext)
  118. catch /^Vim\%((\a\+)\)\=:E117/ " E117, function does not exist
  119. call airline#util#warning("Extension '".ext."' not installed, ignoring!")
  120. continue
  121. endtry
  122. call add(s:loaded_ext, ext)
  123. endfor
  124. return
  125. endif
  126. call airline#extensions#quickfix#init(s:ext)
  127. call add(s:loaded_ext, 'quickfix')
  128. if get(g:, 'loaded_unite', 0) && get(g:, 'airline#extensions#unite#enabled', 1)
  129. call airline#extensions#unite#init(s:ext)
  130. call add(s:loaded_ext, 'unite')
  131. endif
  132. if get(g:, 'loaded_denite', 0) && get(g:, 'airline#extensions#denite#enabled', 1)
  133. call airline#extensions#denite#init(s:ext)
  134. call add(s:loaded_ext, 'denite')
  135. endif
  136. if get(g:, 'loaded_gina', 0) && get(g:, 'airline#extensions#gina#enabled', 1)
  137. call airline#extensions#gina#init(s:ext)
  138. call add(s:loaded_ext, 'gina')
  139. endif
  140. if get(g:, 'loaded_fern', 0) && get(g:, 'airline#extensions#fern#enabled', 1)
  141. call airline#extensions#fern#init(s:ext)
  142. call add(s:loaded_ext, 'fern')
  143. endif
  144. if exists(':NetrwSettings')
  145. call airline#extensions#netrw#init(s:ext)
  146. call add(s:loaded_ext, 'netrw')
  147. endif
  148. " fzf buffers are also terminal buffers, so this must be above term.
  149. if exists(':FZF') && get(g:, 'airline#extensions#fzf#enabled', 1)
  150. call airline#extensions#fzf#init(s:ext)
  151. call add(s:loaded_ext, 'fzf')
  152. endif
  153. " Vim-CMake buffers are also terminal buffers, so this must be above term.
  154. if get(g:, 'loaded_cmake', 0) && get(g:, 'airline#extensions#vimcmake#enabled', 1)
  155. call airline#extensions#vimcmake#init(s:ext)
  156. call add(s:loaded_ext, 'vimcmake')
  157. endif
  158. if (has("terminal") || has('nvim')) &&
  159. \ get(g:, 'airline#extensions#term#enabled', 1)
  160. call airline#extensions#term#init(s:ext)
  161. call add(s:loaded_ext, 'term')
  162. endif
  163. if get(g:, 'airline#extensions#ycm#enabled', 0) && exists('g:loaded_youcompleteme')
  164. call airline#extensions#ycm#init(s:ext)
  165. call add(s:loaded_ext, 'ycm')
  166. endif
  167. if get(g:, 'loaded_vimfiler', 0)
  168. let g:vimfiler_force_overwrite_statusline = 0
  169. endif
  170. if get(g:, 'loaded_ctrlp', 0)
  171. call airline#extensions#ctrlp#init(s:ext)
  172. call add(s:loaded_ext, 'ctrlp')
  173. endif
  174. if get(g:, 'loaded_localsearch', 0)
  175. call airline#extensions#localsearch#init(s:ext)
  176. call add(s:loaded_ext, 'localsearch')
  177. endif
  178. if get(g:, 'CtrlSpaceLoaded', 0)
  179. call airline#extensions#ctrlspace#init(s:ext)
  180. call add(s:loaded_ext, 'ctrlspace')
  181. endif
  182. if get(g:, 'command_t_loaded', 0)
  183. call airline#extensions#commandt#init(s:ext)
  184. call add(s:loaded_ext, 'commandt')
  185. endif
  186. if exists(':UndotreeToggle')
  187. call airline#extensions#undotree#init(s:ext)
  188. call add(s:loaded_ext, 'undotree')
  189. endif
  190. if exists(':RTM')
  191. call airline#extensions#vimodoro#init(s:ext)
  192. call add(s:loaded_ext, 'vimodoro')
  193. endif
  194. if get(g:, 'airline#extensions#hunks#enabled', 1)
  195. \ && (exists('g:loaded_signify')
  196. \ || exists('g:loaded_gitgutter')
  197. \ || exists('g:loaded_changes')
  198. \ || exists('g:loaded_quickfixsigns')
  199. \ || exists(':Gitsigns')
  200. \ || exists(':CocCommand'))
  201. call airline#extensions#hunks#init(s:ext)
  202. call add(s:loaded_ext, 'hunks')
  203. endif
  204. if get(g:, 'airline#extensions#vimagit#enabled', 1)
  205. \ && (exists('g:loaded_magit'))
  206. call airline#extensions#vimagit#init(s:ext)
  207. call add(s:loaded_ext, 'vimagit')
  208. endif
  209. if get(g:, 'airline#extensions#tagbar#enabled', 1)
  210. \ && exists(':TagbarToggle')
  211. call airline#extensions#tagbar#init(s:ext)
  212. call add(s:loaded_ext, 'tagbar')
  213. endif
  214. if get(g:, 'airline#extensions#taglist#enabled', 1) && exists(':TlistShowTag')
  215. call airline#extensions#taglist#init(s:ext)
  216. call add(s:loaded_ext, 'taglist')
  217. endif
  218. if get(g:, 'airline#extensions#vista#enabled', 1)
  219. \ && exists(':Vista')
  220. call airline#extensions#vista#init(s:ext)
  221. call add(s:loaded_ext, 'vista')
  222. endif
  223. if get(g:, 'airline#extensions#bookmark#enabled', 1)
  224. \ && exists(':BookmarkToggle')
  225. call airline#extensions#bookmark#init(s:ext)
  226. call add(s:loaded_ext, 'bookmark')
  227. endif
  228. if get(g:, 'airline#extensions#scrollbar#enabled', 0)
  229. call airline#extensions#scrollbar#init(s:ext)
  230. call add(s:loaded_ext, 'scrollbar')
  231. endif
  232. if get(g:, 'airline#extensions#csv#enabled', 1)
  233. \ && (get(g:, 'loaded_csv', 0) || exists(':Table'))
  234. call airline#extensions#csv#init(s:ext)
  235. call add(s:loaded_ext, 'csv')
  236. endif
  237. if get(g:, 'airline#extensions#zoomwintab#enabled', 0)
  238. call airline#extensions#zoomwintab#init(s:ext)
  239. call add(s:loaded_ext, 'zoomwintab')
  240. endif
  241. if exists(':VimShell')
  242. let s:filetype_regex_overrides['^int-'] = ['vimshell','%{substitute(&ft, "int-", "", "")}']
  243. endif
  244. if get(g:, 'airline#extensions#branch#enabled', 1) && (
  245. \ airline#util#has_fugitive() ||
  246. \ airline#util#has_gina() ||
  247. \ airline#util#has_lawrencium() ||
  248. \ airline#util#has_vcscommand() ||
  249. \ airline#util#has_custom_scm())
  250. call airline#extensions#branch#init(s:ext)
  251. call add(s:loaded_ext, 'branch')
  252. endif
  253. if get(g:, 'airline#extensions#bufferline#enabled', 1)
  254. \ && exists('*bufferline#get_status_string')
  255. call airline#extensions#bufferline#init(s:ext)
  256. call add(s:loaded_ext, 'bufferline')
  257. endif
  258. if get(g:, 'airline#extensions#fugitiveline#enabled', 1)
  259. \ && airline#util#has_fugitive()
  260. \ && index(s:loaded_ext, 'bufferline') == -1
  261. call airline#extensions#fugitiveline#init(s:ext)
  262. call add(s:loaded_ext, 'fugitiveline')
  263. endif
  264. " NOTE: This means that if both virtualenv and poetv are enabled and
  265. " available, poetv silently takes precedence and the virtualenv
  266. " extension won't be initialized. Since both extensions currently just
  267. " add a virtualenv identifier section to the airline, this seems
  268. " acceptable.
  269. if (get(g:, 'airline#extensions#poetv#enabled', 0) && (exists(':PoetvActivate')))
  270. call airline#extensions#poetv#init(s:ext)
  271. call add(s:loaded_ext, 'poetv')
  272. elseif (get(g:, 'airline#extensions#virtualenv#enabled', 0) && (exists(':VirtualEnvList')))
  273. call airline#extensions#virtualenv#init(s:ext)
  274. call add(s:loaded_ext, 'virtualenv')
  275. elseif (get(g:, 'airline#extensions#poetv#enabled', 0) && (isdirectory($VIRTUAL_ENV)))
  276. call airline#extensions#poetv#init(s:ext)
  277. call add(s:loaded_ext, 'poetv')
  278. endif
  279. if (get(g:, 'airline#extensions#eclim#enabled', 1) && exists(':ProjectCreate'))
  280. call airline#extensions#eclim#init(s:ext)
  281. call add(s:loaded_ext, 'eclim')
  282. endif
  283. if get(g:, 'airline#extensions#syntastic#enabled', 1)
  284. \ && exists(':SyntasticCheck')
  285. call airline#extensions#syntastic#init(s:ext)
  286. call add(s:loaded_ext, 'syntastic')
  287. endif
  288. if (get(g:, 'airline#extensions#ale#enabled', 1) && exists(':ALELint'))
  289. call airline#extensions#ale#init(s:ext)
  290. call add(s:loaded_ext, 'ale')
  291. endif
  292. if (get(g:, 'airline#extensions#lsp#enabled', 1) && exists(':LspDeclaration'))
  293. call airline#extensions#lsp#init(s:ext)
  294. call add(s:loaded_ext, 'lsp')
  295. endif
  296. if (get(g:, 'airline#extensions#nvimlsp#enabled', 1)
  297. \ && has('nvim')
  298. \ && luaeval('vim.lsp ~= nil'))
  299. call airline#extensions#nvimlsp#init(s:ext)
  300. call add(s:loaded_ext, 'nvimlsp')
  301. endif
  302. if (get(g:, 'airline#extensions#coc#enabled', 1) && exists(':CocCommand'))
  303. call airline#extensions#coc#init(s:ext)
  304. call add(s:loaded_ext, 'coc')
  305. endif
  306. if (get(g:, 'airline#extensions#languageclient#enabled', 1) && exists(':LanguageClientStart'))
  307. call airline#extensions#languageclient#init(s:ext)
  308. call add(s:loaded_ext, 'languageclient')
  309. endif
  310. if get(g:, 'airline#extensions#whitespace#enabled', 1)
  311. call airline#extensions#whitespace#init(s:ext)
  312. call add(s:loaded_ext, 'whitespace')
  313. endif
  314. if (get(g:, 'airline#extensions#neomake#enabled', 1) && exists(':Neomake'))
  315. call airline#extensions#neomake#init(s:ext)
  316. call add(s:loaded_ext, 'neomake')
  317. endif
  318. if get(g:, 'airline#extensions#po#enabled', 1) && executable('msgfmt')
  319. call airline#extensions#po#init(s:ext)
  320. call add(s:loaded_ext, 'po')
  321. endif
  322. if get(g:, 'airline#extensions#wordcount#enabled', 1)
  323. call airline#extensions#wordcount#init(s:ext)
  324. call add(s:loaded_ext, 'wordcount')
  325. endif
  326. if get(g:, 'airline#extensions#tabline#enabled', 0)
  327. call airline#extensions#tabline#init(s:ext)
  328. call add(s:loaded_ext, 'tabline')
  329. endif
  330. if get(g:, 'airline#extensions#tmuxline#enabled', 1) && exists(':Tmuxline')
  331. call airline#extensions#tmuxline#init(s:ext)
  332. call add(s:loaded_ext, 'tmuxline')
  333. endif
  334. if get(g:, 'airline#extensions#promptline#enabled', 1) && exists(':PromptlineSnapshot') && len(get(g:, 'airline#extensions#promptline#snapshot_file', ''))
  335. call airline#extensions#promptline#init(s:ext)
  336. call add(s:loaded_ext, 'promptline')
  337. endif
  338. if get(g:, 'airline#extensions#nrrwrgn#enabled', 1) && get(g:, 'loaded_nrrw_rgn', 0)
  339. call airline#extensions#nrrwrgn#init(s:ext)
  340. call add(s:loaded_ext, 'nrrwrgn')
  341. endif
  342. if get(g:, 'airline#extensions#unicode#enabled', 1) && exists(':UnicodeTable') == 2
  343. call airline#extensions#unicode#init(s:ext)
  344. call add(s:loaded_ext, 'unicode')
  345. endif
  346. if (get(g:, 'airline#extensions#capslock#enabled', 1) && exists('*CapsLockStatusline'))
  347. call airline#extensions#capslock#init(s:ext)
  348. call add(s:loaded_ext, 'capslock')
  349. endif
  350. if (get(g:, 'airline#extensions#codeium#enabled', 1) && get(g:, 'loaded_codeium', 0))
  351. call airline#extensions#codeium#init(s:ext)
  352. call add(s:loaded_ext, 'codeium')
  353. endif
  354. if (get(g:, 'airline#extensions#gutentags#enabled', 1) && get(g:, 'loaded_gutentags', 0))
  355. call airline#extensions#gutentags#init(s:ext)
  356. call add(s:loaded_ext, 'gutentags')
  357. endif
  358. if get(g:, 'airline#extensions#gen_tags#enabled', 1) && (get(g:, 'loaded_gentags#gtags', 0) || get(g:, 'loaded_gentags#ctags', 0))
  359. call airline#extensions#gen_tags#init(s:ext)
  360. call add(s:loaded_ext, 'gen_tags')
  361. endif
  362. if (get(g:, 'airline#extensions#grepper#enabled', 1) && get(g:, 'loaded_grepper', 0))
  363. call airline#extensions#grepper#init(s:ext)
  364. call add(s:loaded_ext, 'grepper')
  365. endif
  366. if get(g:, 'airline#extensions#xkblayout#enabled', 1) && (exists('g:XkbSwitchLib') || exists('*FcitxCurrentIM') || has('nvim'))
  367. call airline#extensions#xkblayout#init(s:ext)
  368. call add(s:loaded_ext, 'xkblayout')
  369. endif
  370. if (get(g:, 'airline#extensions#keymap#enabled', 1) && has('keymap'))
  371. call airline#extensions#keymap#init(s:ext)
  372. call add(s:loaded_ext, 'keymap')
  373. endif
  374. if (get(g:, 'airline#extensions#windowswap#enabled', 1) && get(g:, 'loaded_windowswap', 0))
  375. call airline#extensions#windowswap#init(s:ext)
  376. call add(s:loaded_ext, 'windowswap')
  377. endif
  378. if (get(g:, 'airline#extensions#obsession#enabled', 1) && exists('*ObsessionStatus'))
  379. call airline#extensions#obsession#init(s:ext)
  380. call add(s:loaded_ext, 'obsession')
  381. endif
  382. if get(g:, 'airline#extensions#vimtex#enabled', 1)
  383. runtime autoload/vimtex.vim
  384. if exists('*vimtex#init')
  385. call airline#extensions#vimtex#init(s:ext)
  386. call add(s:loaded_ext, 'vimtex')
  387. endif
  388. endif
  389. if (get(g:, 'airline#extensions#cursormode#enabled', 0))
  390. call airline#extensions#cursormode#init(s:ext)
  391. call add(s:loaded_ext, 'cursormode')
  392. endif
  393. if get(g:, 'airline#extensions#searchcount#enabled', 1) && exists('*searchcount')
  394. call airline#extensions#searchcount#init(s:ext)
  395. call add(s:loaded_ext, 'searchcount')
  396. endif
  397. if get(g:, 'loaded_battery', 0) && get(g:, 'airline#extensions#battery#enabled', 0)
  398. call airline#extensions#battery#init(s:ext)
  399. call add(s:loaded_ext, 'battery')
  400. endif
  401. if (get(g:, 'airline#extensions#vim9lsp#enabled', 1) && exists('*lsp#lsp#ErrorCount'))
  402. call airline#extensions#vim9lsp#init(s:ext)
  403. call add(s:loaded_ext, 'vim9lsp')
  404. endif
  405. if !get(g:, 'airline#extensions#disable_rtp_load', 0)
  406. " load all other extensions, which are not part of the default distribution.
  407. " (autoload/airline/extensions/*.vim outside of our s:script_path).
  408. for file in split(globpath(&rtp, 'autoload/airline/extensions/*.vim', 1), "\n")
  409. " we have to check both resolved and unresolved paths, since it's possible
  410. " that they might not get resolved properly (see #187)
  411. if stridx(tolower(resolve(fnamemodify(file, ':p'))), s:script_path) < 0
  412. \ && stridx(tolower(fnamemodify(file, ':p')), s:script_path) < 0
  413. let name = fnamemodify(file, ':t:r')
  414. if !get(g:, 'airline#extensions#'.name.'#enabled', 1) ||
  415. \ index(s:loaded_ext, name.'*') > -1
  416. continue
  417. endif
  418. try
  419. call airline#extensions#{name}#init(s:ext)
  420. " mark as external
  421. call add(s:loaded_ext, name.'*')
  422. catch
  423. endtry
  424. endif
  425. endfor
  426. endif
  427. if exists(':Dirvish') && get(g:, 'airline#extensions#dirvish#enabled', 1)
  428. call airline#extensions#dirvish#init(s:ext)
  429. call add(s:loaded_ext, 'dirvish')
  430. endif
  431. if (get(g:, 'airline#extensions#omnisharp#enabled', 1) && get(g:, 'OmniSharp_loaded', 0))
  432. call airline#extensions#omnisharp#init(s:ext)
  433. call add(s:loaded_ext, 'omnisharp')
  434. endif
  435. if (get(g:, 'airline#extensions#rufo#enabled', 0) && get(g:, 'rufo_loaded', 0))
  436. call airline#extensions#rufo#init(s:ext)
  437. call add(s:loaded_ext, 'rufo')
  438. endif
  439. endfunction
  440. function! airline#extensions#get_loaded_extensions()
  441. return s:loaded_ext
  442. endfunction