Haiyuan Zhang
Haiyuan Zhang

Reputation: 42852

how to let tab display only file name rather than the full path in vim

If the full path of a file is very long, you can't tell which file is in a given tab. so I'm wondering is there is a way let the tab only display the file name rather than the full path of the file, might be convenient in some case.

Upvotes: 37

Views: 18364

Answers (6)

Carson
Carson

Reputation: 8138

If using nvim (Neovim), try the following method:

function _G.get_tabline()
  local s = ""
  for tabnr = 1, vim.fn.tabpagenr('$') do
    local winnr = vim.fn.tabpagewinnr(tabnr)
    local buflist = vim.fn.tabpagebuflist(tabnr)[winnr]
    local bufname = vim.fn.bufname(buflist)
    local bufname_short = vim.fn.fnamemodify(bufname, ":t")
    if tabnr == vim.fn.tabpagenr() then
      s = s .. "%#TabLineSel#" .. " " .. tabnr .. ": " .. bufname_short .. " "
    else
      s = s .. "%#TabLine#" .. " " .. tabnr .. ": " .. bufname_short .. " "
    end
  end
  s = s .. "%#TabLineFill#"
  return s
end

vim.o.tabline = "%!v:lua.get_tabline()"

tabline demo


reference:

Upvotes: 0

Zablon
Zablon

Reputation: 167

Someone on the link at the bottom posted this on reddit, works flawlessly.

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()

Upvotes: 1

Armin Primadi
Armin Primadi

Reputation: 774

The other solutions only work for GUI VIM and does not work for terminal vim or embedded vim (nvim).

You can use vim-plug and vim-airline. Then, add this to your .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'

Upvotes: 2

larsen1
larsen1

Reputation: 251

I have the following in my vimrc:

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

which outputs: [Number] Filename and + sign if a file is modified ([4] foo.html +). Number is very useful to immediate switch to the chosen tab with command [Number]gt (4gt if I want to jump to the file in the tab 4)

Upvotes: 25

David Terei
David Terei

Reputation: 2035

I use this solution instead of Habi's as this one still keeps the default features of putting a '+' symbol in the tab to indicate the files being modified, as well as a count of the number of windows in the tab. So it basically works the same as the default tab labelling but just uses file names, not full paths.

" 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()

Upvotes: 7

Habi
Habi

Reputation: 3300

Try

:set guitablabel=%t

For format of possible options see

:help 'statusline'

Upvotes: 37

Related Questions