VIM:如何在选项卡中显示文件夹名称,但仅当两个文件具有相同名称时才显示

时间:2013-04-29 11:11:27

标签: vim

我希望在VIM中具有以下功能(特别是GVIM)。我认为Sublime Text有类似的东西:

  1. 在“正常”情况下,标签名称应该只是文件的名称,但是......
  2. 如果有两个文件使用相同名称但在不同目录中打开,我希望看到一个标签名称父文件夹名称+文件名。
  3. 示例:

    当有以下文件的标签时:

    • C:\我\ DIR \与\文件\ justAfile.txt
    • C:\我\ DIR \与\文件\ myfile.txt的
    • C:\我\ DIR \与\备份\ myfile.txt的

    选项卡名称将是:

    justAfile.txt | files\myfile.txt | backup\myfile.txt 
    

    这是否适用于一些聪明的配置?

3 个答案:

答案 0 :(得分:5)

在GVIM中,您可以使用'guitablabel'选项自定义标签标签。

在终端Vim;没有'guitablabel'等价物;一个人必须渲染整个'tabline'。幸运的是,Vim帮助有一个示例,它将标签渲染委托给一个单独的函数,因此重新使用自定义函数非常容易。

上述选项的帮助页面链接到示例;您可能必须使用fnamemodify()将所有缓冲区的路径规范化为完整的绝对路径,找到公共基本目录,然后将其从路径中删除。

另一方面,如果您可以:cd到基本目录,那么您将获得非常开箱即用的那种标签标签。

答案 1 :(得分:1)

Ingo建议你可以使用guitablabel。在我的安装中,它仅配置为显示文件名(:echo &guitablabel报告%M%t)。要将其设置为显示相对路径,请执行:set guitablabel=%M%f。与Ingo说的一样,使用:cd DIRECTORY设置主目录,使用:pwd查看当前设置的位置。

有关(多个)更多格式选项,请参阅:help statusline

答案 2 :(得分:0)

这是我的解决方案,使选项卡名称成为目录---通常是选项卡要代表的项目的良好代理。如果只有一个缓冲区,则可以修改此解决方案以显示文件名(修改如下所示)。

此解决方案从Jerome's中汲取了一点点。我没有做任何复杂的事情,所以我的时间要短5倍。

此外,此解决方案还可以将制表符编号放在名称旁边,使其易于弹跳,这意味着制表符将如下所示:1:log 2:doc 3:vimfiles 2gt将移至第二个制表符。

set tabline=%!TabLine()

function! TabLine()
    let line = ''
    for i in range(tabpagenr('$'))
        let line .= (i+1 == tabpagenr()) ? '%#TabLineSel#' : '%#TabLine#'
        let line .= '%' . (i + 1) . 'T'
        let line .= TabLabel(i + 1) . ' '
    endfor
    let line .= '%#TabLineFill#%T'
    return line
endfunction

function! TabLabel(n)
    " Return list of buffer numbers for each window pane open in tab.
    let panelist = tabpagebuflist(a:n)
    " See :help setting-tabline then search MyTabLabel if you want to
    " use use the active window. I use the topmost pane, which let's
    " me rename the tab just by putting a window from a different
    " directory in the first position.
    let filepath = bufname(panelist[0])
    let dirname = fnamemodify(filepath, ':p:h:t')
    return a:n . ':' . dirname
endfunction

修改为在只有一个缓冲区可见的情况下显示文件名:

function! TabLabel(n)
    " Return list of buffer numbers for each window pane open in tab.
    let panelist = tabpagebuflist(a:n)
    " See :help setting-tabline then search MyTabLabel if you want to
    " use use the active window. I use the topmost pane, which let's
    " me rename the tab just by putting a window from a different
    " directory in the first position.
    let filepath = bufname(panelist[0])
    let dirname = fnamemodify(filepath, ':p:h:t')
    let filename = fnamemodify(filepath, ':t')
    let tabname = len(panelist) > 1 ? dirname : filename
    return a:n . ':' . tabname
endfunction