In my [library plugin][1], I have a `:Project ls` feature that lists only the files that belongs to the current project as `:ls` would have listed them. The related (GPL w/ exception) code is the following: ``` function! s:As_ls(bid) abort " {{{2 let name = bufname(a:bid) if empty(name) let name = 'Used to be known as: '.lh#project#__buffer(a:bid) endif return printf('%3d%s %s' \ , a:bid \ , (buflisted(a:bid) ? ' ' : 'u') \ . (bufnr('%') == a:bid ? '%' : bufnr('#') == a:bid ? '#' : ' ') \ . (! bufloaded(a:bid) ? ' ' : bufwinnr(a:bid)<0 ? 'h' : 'a') \ . (! getbufvar(a:bid, "&modifiable") ? '-' : getbufvar(a:bid, "&readonly") ? '=' : ' ') \ . (getbufvar(a:bid, "&modified") ? '+' : ' ') \ , '"'.name.'"') endfunction function! s:ls_project(prj) abort " {{{2 if lh#option#is_unset(a:prj) echo '(no project specified!)' endif let lines = map(copy(a:prj.buffers), 's:As_ls(v:val)') echo "Buffer list of ".get(a:prj, 'name', '(unnamed)')." project:" echo join(lines, "\n") endfunction ``` Instead of `a:prj.buffers`, you would have the list of buffers in `range(1, bufnr('$'))`. It would then need to be filtered to keep only the existing buffers (`filter(range(1, bufnr('$')), 'bufexists(v:val)')`). Then you could wrap the call to `bufname()` with `fnamemodify()` to display exactly what you need. [1]: https://github.com/LucHermitte/lh-vim-lib