如何在vim中编写`tabline`函数?

Tim*_*nov 3 vim

我希望 Vim(而不是 gVim)中的选项卡如下所示:

在此输入图像描述

解释:

  1. 选项卡的序列号(1、2、3、4 等)
  2. 文件名(无路径,无缩短路径)
  3. 如果打开了多个文件,请在选项卡中列出它们。
  4. 如果存在重复的选项卡(因此在多个选项卡中打开同一文件),则应突出显示它们。
  5. 如果缓冲区被修改,请+在文件名末尾添加。

有人可以帮忙吗?我想在我的内部有这样的东西.vimrc

set tabline=%!MyTabLine()
function! MyTabLine()
  ...
endfunction
Run Code Online (Sandbox Code Playgroud)

Tim*_*nov 8

我已经编写了我想要的 tabline 函数。行为几乎相同,除了:

  1. +如果选项卡内的任何缓冲区被修改,则该符号出现在选项卡编号之后
  2. 选项卡仅包含可修改的缓冲区(它不会阻塞 netrw 文件浏览器、帮助和只读缓冲区的行),但您可以更改此设置,只需取消注释所需的行即可

在此输入图像描述

这是代码:

set tabline=%!MyTabLine()  " custom tab pages line
function! MyTabLine()
  let s = ''
  " loop through each tab page
  for i in range(tabpagenr('$'))
    if i + 1 == tabpagenr()
      let s .= '%#TabLineSel#'
    else
      let s .= '%#TabLine#'
    endif
    if i + 1 == tabpagenr()
      let s .= '%#TabLineSel#' " WildMenu
    else
      let s .= '%#Title#'
    endif
    " set the tab page number (for mouse clicks)
    let s .= '%' . (i + 1) . 'T '
    " set page number string
    let s .= i + 1 . ''
    " get buffer names and statuses
    let n = ''  " temp str for buf names
    let m = 0   " &modified counter
    let buflist = tabpagebuflist(i + 1)
    " loop through each buffer in a tab
    for b in buflist
      if getbufvar(b, "&buftype") == 'help'
        " let n .= '[H]' . fnamemodify(bufname(b), ':t:s/.txt$//')
      elseif getbufvar(b, "&buftype") == 'quickfix'
        " let n .= '[Q]'
      elseif getbufvar(b, "&modifiable")
        let n .= fnamemodify(bufname(b), ':t') . ', ' " pathshorten(bufname(b))
      endif
      if getbufvar(b, "&modified")
        let m += 1
      endif
    endfor
    " let n .= fnamemodify(bufname(buflist[tabpagewinnr(i + 1) - 1]), ':t')
    let n = substitute(n, ', $', '', '')
    " add modified label
    if m > 0
      let s .= '+'
      " let s .= '[' . m . '+]'
    endif
    if i + 1 == tabpagenr()
      let s .= ' %#TabLineSel#'
    else
      let s .= ' %#TabLine#'
    endif
    " add buffer names
    if n == ''
      let s.= '[New]'
    else
      let s .= n
    endif
    " switch to no underlining and add final space
    let s .= ' '
  endfor
  let s .= '%#TabLineFill#%T'
  " right-aligned close button
  " if tabpagenr('$') > 1
  "   let s .= '%=%#TabLineFill#%999Xclose'
  " endif
  return s
endfunction
Run Code Online (Sandbox Code Playgroud)