如何在vim中让标签页仅显示文件名而不是完整路径

35
如果文件的完整路径很长,你无法知道给定选项卡中是哪个文件。所以我想知道有没有一种方法让选项卡只显示文件名而不是文件的完整路径,在某些情况下可能会更方便。
5个回答

36

尝试运行以下命令:

:set guitablabel=%t

有关可用选项的格式,请参见以下帮助文档:

:help 'statusline'


5
仅适用于图形用户界面。 - Breno Leitão
1
在终端中使用 tabline 选项。需要一个函数来指定“整个标签页行”。请参阅 setting-tabline 的帮助页面。 - Qian
2
你读了这个问题吗?这个问题是关于VIM而不是Gvim的,令人惊讶的是stackoverflow上大多数关于这个主题的答案都被误解了! - bora89

26

我在我的vimrc文件中有以下内容:

set guitablabel=\[%N\]\ %t\ %M 

输出如下: [数字] 文件名和加号,如果文件被修改 ([4] foo.html +)。 数字非常有用,可以使用命令 [数字]gt 立即切换到所选选项卡 (如果我想跳转到选项卡 4 中的文件,则为4gt)。


4
需要注意的是,在GUI Vim中,“%N”仅显示选项卡的编号。如果你设置了“set guioptions-=e”,或者使用终端Vim,则“%N”似乎代表此选项卡中打开的窗口(分割)数量,而不是选项卡的编号。请参见“:help setting-tabline”或此链接:https://github.com/mkitt/tabline.vim。 - overthink

6
我使用这个解决方案代替Habi的,因为它仍然保留了默认功能,在选项卡中放置一个“+”符号表示被修改的文件,以及选项卡中窗口数量的计数。因此,它基本上与默认的选项卡标签相同,只是使用文件名而不是完整路径。
" Tab headings
function GuiTabLabel()
    let label = ''
    let bufnrlist = tabpagebuflist(v:lnum)

    " Add '+' if one of the buffers in the tab page is modified
    for bufnr in bufnrlist
        if getbufvar(bufnr, "&modified")
            let label = '+'
            break
        endif
    endfor

    " Append the number of windows in the tab page if more than one
    let wincount = tabpagewinnr(v:lnum, '$')
    if wincount > 1
        let label .= wincount
    endif
    if label != ''
        let label .= ' '
    endif

    " Append the buffer name (not full path)
    return label . "%t"
endfunction

set guitablabel=%!GuiTabLabel()

理想的解决方案:在所有选项卡标题中列出路径/单词/文件名列表,如果两个标题相同,则选择唯一/部分/路径名来命名该选项卡。编码更加复杂,但用户可以自动消除歧义。 - mosh
你想在GitLab上制作一个插件吗? - Vitaly Zdanevich

2
其他解决方案只适用于 GUI VIM,对于终端 VIM 或嵌入式 VIM(nvim)无效。
您可以使用 vim-plugvim-airline。然后将以下内容添加到您的 .vimrc 文件中。
call plug#begin(stdpath('data') . '/plugged')
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
call plug#end()

let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#fnamemod = ':t'

1

底部链接上的某个人在reddit上发布了这篇文章,运行非常顺畅。

function! Tabline() abort
    let l:line = ''
    let l:current = tabpagenr()

    for l:i in range(1, tabpagenr('$'))
        if l:i == l:current
            let l:line .= '%#TabLineSel#'
        else
            let l:line .= '%#TabLine#'
        endif

        let l:label = fnamemodify(
            \ bufname(tabpagebuflist(l:i)[tabpagewinnr(l:i) - 1]),
            \ ':t'
        \ )

        let l:line .= '%' . i . 'T' " Starts mouse click target region.
        let l:line .= '  ' . l:label . '  '
    endfor

    let l:line .= '%#TabLineFill#'
    let l:line .= '%T' " Ends mouse click target region(s).

    return l:line
endfunction

set tabline=%!Tabline()

你是唯一一个倾听而不是提供Gvim解决方案的人,谢谢! - bora89
唯一的问题是 - 如果文件被修改,它不会显示标记 (*)。 - bora89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接