Vimのtablineに、vim-lspのrunningなserversを表示する

example


以下を設定すると、できる。

.vimrc

set tabline=%!vimrc#tabline#make()

autoload/vimrc/tabline.vim

" 大事なところ!
function vimrc#tabline#make() abort
  let running_lsp_servers = execute(':LspStatus')
    \ ->split('\n')
    \ ->filter({ _, x ->
      \ x !~# 'not running$'
    \ })
    \ ->map({ _, x -> x->split(':')[0] })
    \ ->join(', ')

  return '%1*[%{tabpagenr("$")}]%* '
    \. s:tabs() . ' => '
    \. printf('%6*[${%s}]%*', running_lsp_servers)
endfunction

" 以下、その他設定

" NOTE: http://d.hatena.ne.jp/thinca/20111204/1322932585
function s:tabs()
  let titles = map(range(1, tabpagenr('$')), { _, tabnr ->
    \ vimrc#tabline#tabpage_label(tabnr)
  \ })
  return join(titles) . '%#TabLineFill#%T'
endfunction

function vimrc#tabline#tabpage_label(tabnr)
  let title = gettabvar(a:tabnr, 'title')
  if title !=# ''
    return title
  endif
  let focused_winnr = tabpagewinnr(a:tabnr)
  let curbufnr = tabpagebuflist(a:tabnr)[focused_winnr - 1]
  let file_name = fnamemodify(bufname(curbufnr), ':t')
  let file_name =
    \ (file_name == '')
      \ ? '[NoName]' :
    \ (len(file_name) > 20)
      \ ? (file_name[0:7] . '...' . file_name[-10:-1]) :
    \ file_name

  " Please see `:h TabLineSel` and `:h TabLine`
  let window_num = '[' . len(tabpagebuflist(a:tabnr)) . ']'
  let label_of_a_buf = s:is_stayed_tab(a:tabnr)
    \ ? ('%#TabLineSel#[* ' . s:get_mod_mark_for_window(focused_winnr) . window_num . file_name . ' *]')
    \ : ('%#TabLine#[' . s:get_mod_mark_for_tab(a:tabnr) . window_num . file_name . ']')

  return '%' . a:tabnr . 'T' . label_of_a_buf . '%T%#TabLineFill#'
endfunction

" Do you staying the specified tab?
function s:is_stayed_tab(tabnr) abort
  return a:tabnr is tabpagenr()
endfunction

" Return '+' if the buffer of the specified window is modified
function s:get_mod_mark_for_window(winnr) abort
  return getbufvar(winbufnr(a:winnr), '&modified') ? '+' : ''
endfunction

" Return '+' if one or more a modified non terminal buffer is existent in the taken tab
function s:get_mod_mark_for_tab(tabnr) abort
  let term_buffers = term_list()
  let modified_buffer = s:List.find(tabpagebuflist(a:tabnr), v:null, { bufnr_at_tab ->
    \ !s:List.has(term_buffers, bufnr_at_tab) &&
    \ getbufvar(bufnr_at_tab, '&modified')
  \ })
  return (modified_buffer is v:null) ? '' : '+'
endfunction

筆者プロフィール

my-latest-logo

aiya000(あいや)

せつラボ 〜圏論の基本〜」 「せつラボ2~雲と天使と関手圏~」 「矢澤にこ先輩といっしょに代数!」を書いています!

強い静的型付けとテストを用いて、バグを防ぐのが好き。Haskell・TypeScript。