Vim: afficher l'index des onglets dans la tabline

8

Disons que j'ai ouvert file1.txt, file2.txt, file3a.txtet de file3b.txttelle sorte que les regards tabline (la chose sur le dessus) comme celui - ci:

file1.txt  file2.txt  2 file3a.txt

(Notez comment file3b.txt.est manquant car il est affiché dans une division, dans le même onglet que file3a.txt)

Pour se déplacer plus rapidement entre les onglets (avec <Number>gt), j'aimerais que chaque onglet affiche son index, le long du nom de fichier. Ainsi:

1:<file1.txt>  2:<file2.txt>  3:<2 file3a.txt>

Le formatage (les accolades en particulier) sont facultatifs; Je veux juste que l'index y apparaisse (le 1:, 2:etc.).

Aucun indice sur :h tab-page-commandsGoogle ou quoi que ce soit.

bitmask
la source
1
Mise à jour: ce plugin pourrait être utile. Je pense qu'il a été créé bien après la réponse à cette question, il n'apparaît donc dans aucune des réponses.
crayzeewulf

Réponses:

0

Vous devez regarder:

:help 'tabline'
:help setting-tabline

Et si vous avez "e" dans votre paramètre "guioptions":

:help 'guitablabel'
Heptite
la source
Cela m'a mis sur la bonne voie. Merci beaucoup!
bitmask
9
@bitmask pourriez-vous peut-être fournir votre solution? Heptite, pourriez-vous modifier votre réponse?
wmarbut
@wmarbut utilisez ce plugin , c'est merveilleux.
ospider
D'accord. Extrêmement décevant lorsque la solution est apparemment "trouvée" mais non fournie et que tout le monde doit passer le même temps à fouiller dans les documents et à écrire les mêmes configurations.
Alex H
12

mettez ça dans votre vimrc

" Rename tabs to show tab number.
" (Based on http://stackoverflow.com/questions/5927952/whats-implementation-of-vims-default-tabline-function)
if exists("+showtabline")
    function! MyTabLine()
        let s = ''
        let wn = ''
        let t = tabpagenr()
        let i = 1
        while i <= tabpagenr('$')
            let buflist = tabpagebuflist(i)
            let winnr = tabpagewinnr(i)
            let s .= '%' . i . 'T'
            let s .= (i == t ? '%1*' : '%2*')
            let s .= ' '
            let wn = tabpagewinnr(i,'$')

            let s .= '%#TabNum#'
            let s .= i
            " let s .= '%*'
            let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#')
            let bufnr = buflist[winnr - 1]
            let file = bufname(bufnr)
            let buftype = getbufvar(bufnr, 'buftype')
            if buftype == 'nofile'
                if file =~ '\/.'
                    let file = substitute(file, '.*\/\ze.', '', '')
                endif
            else
                let file = fnamemodify(file, ':p:t')
            endif
            if file == ''
                let file = '[No Name]'
            endif
            let s .= ' ' . file . ' '
            let i = i + 1
        endwhile
        let s .= '%T%#TabLineFill#%='
        let s .= (tabpagenr('$') > 1 ? '%999XX' : 'X')
        return s
    endfunction
    set stal=2
    set tabline=%!MyTabLine()
    set showtabline=1
    highlight link TabNum Special
endif
David Xia
la source
2
Savez-vous ce que cela '%999XX'signifie ici?
Bach
Puisque celui-ci fonctionne à la fois pour le terminal et pour gvim, je pense que c'est la meilleure solution. Prenez mon vote positif, monsieur.
imolit
5

Sur la page wikia, vous pouvez trouver au moins deux (ceux que j'ai testés) qui vous donnent les index des onglets, et l'un d'eux produit le nombre de fenêtres à l'intérieur de chaque tampon qui ont des modifications.

Voici le résultat de mes modifications sur celui qui produit le nombre de tampons édités, le changement que j'ai fait était de rendre la valeur de surbrillance du nombre cohérente avec le reste de l'onglet:

entrez la description de l'image ici

set tabline=%!MyTabLine()  " custom tab pages line
function MyTabLine()
        let s = '' " complete tabline goes here
        " loop through each tab page
        for t in range(tabpagenr('$'))
                " set highlight
                if t + 1 == tabpagenr()
                        let s .= '%#TabLineSel#'
                else
                        let s .= '%#TabLine#'
                endif
                " set the tab page number (for mouse clicks)
                let s .= '%' . (t + 1) . 'T'
                let s .= ' '
                " set page number string
                let s .= t + 1 . ' '
                " get buffer names and statuses
                let n = ''      "temp string for buffer names while we loop and check buftype
                let m = 0       " &modified counter
                let bc = len(tabpagebuflist(t + 1))     "counter to avoid last ' '
                " loop through each buffer in a tab
                for b in tabpagebuflist(t + 1)
                        " buffer types: quickfix gets a [Q], help gets [H]{base fname}
                        " others get 1dir/2dir/3dir/fname shortened to 1/2/3/fname
                        if getbufvar( b, "&buftype" ) == 'help'
                                let n .= '[H]' . fnamemodify( bufname(b), ':t:s/.txt$//' )
                        elseif getbufvar( b, "&buftype" ) == 'quickfix'
                                let n .= '[Q]'
                        else
                                let n .= pathshorten(bufname(b))
                        endif
                        " check and ++ tab's &modified count
                        if getbufvar( b, "&modified" )
                                let m += 1
                        endif
                        " no final ' ' added...formatting looks better done later
                        if bc > 1
                                let n .= ' '
                        endif
                        let bc -= 1
                endfor
                " add modified label [n+] where n pages in tab are modified
                if m > 0
                        let s .= '[' . m . '+]'
                endif
                " select the highlighting for the buffer names
                " my default highlighting only underlines the active tab
                " buffer names.
                if t + 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 to buffer list
                let s .= ' '
        endfor
        " after the last tab fill with TabLineFill and reset tab page nr
        let s .= '%#TabLineFill#%T'
        " right-align the label to close the current tab page
        if tabpagenr('$') > 1
                let s .= '%=%#TabLineFill#%999Xclose'
        endif
        return s
endfunction
Steven Lu
la source
Votre script est meilleur que l'autre car il conserve la partie où l'onglet indique si le fichier a été modifié. Merci!
Plasty Grove
Oui, j'ai utilisé la tabline du airlineplugin, mais pour être honnête, cette vieille tabline que j'ai inventée est beaucoup plus fonctionnelle ...
Steven Lu
3

Le plugin tabline est un plugin vim qui implémente les fonctionnalités demandées et ne fera pas exploser votre vimrc. Installez et redémarrez simplement vim.

À installer:

cd /usr/share/vim/vimfiles/plugin/
wget https://raw.githubusercontent.com/mkitt/tabline.vim/master/plugin/tabline.vim

ou utilisez un gestionnaire de plugins.

éphémère
la source
1
Bienvenue sur Super User! Veuillez lire Comment recommander un logiciel pour obtenir les informations et suggestions minimales requises sur la façon de recommander un logiciel sur Super User. Pour que votre réponse reste utile même si le ou les liens fournis ne fonctionnent pas, ces détails doivent être modifiés dans votre réponse.
Je dis Reinstate Monica
0

Pour Vim basé sur une interface graphique (Gvim sur Linux, MacVim sur Mac, etc.), mettez ceci dans votre .gvimrc:

set guitablabel=%N:%M%t " Show tab numbers

Quelques conseils sur l'utilisation réelle des numéros affichés:

  • Ngtpassera à l'onglet N. Par exemple, 3gtpasse à l'onglet 3.
  • :tabm2déplace l'onglet actuel pour apparaître après l' onglet 2.
    • Pour déplacer cet onglet vers la première position, utilisez :tabm0
    • Pour déplacer cet onglet à la dernière position, utilisez simplement :tabm
Nathan Long
la source