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

时间:2015-11-14 15:36:58

标签: vim

我想在Vim(不是gVim)中看到如下标签:

enter image description here

说明:

  1. 标签的序号(1,2,3,4等)
  2. 文件名(无路径,无缩短路径)
  3. 如果打开了多个文件,请在选项卡中列出。
  4. 如果有重复的标签(因此在多个标签中打开了相同的文件),则应突出显示它们。
  5. 如果修改了缓冲区,请在文件名末尾添加+
  6. 有人可以帮忙吗?我希望在.vimrc

    中有类似的内容
    set tabline=%!MyTabLine()
    function! MyTabLine()
      ...
    endfunction
    

2 个答案:

答案 0 :(得分:1)

:help setting-tabline包含冗长的描述,包括一个模拟Vim默认tabline的示例函数。您可以将此作为起点。有关可用功能的完整列表,请参阅:help functions

了解如何查找命令并导航内置:help;它是全面的,并提供了许多提示。你不会像其他编辑那样快速学习Vim,但如果你致力于不断学习,那么它将成为一个非常强大和高效的编辑器。

答案 1 :(得分:1)

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

  1. 如果选项卡中的任何缓冲区被修改,则选项卡编号后会显示+符号
  2. 选项卡仅包含可修改的缓冲区(它不会阻塞netrw文件浏览器,帮助和只读缓冲区的缓冲区),但您可以更改此选项,只需取消注释所需的行
  3. enter image description here

    以下是代码:

    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