Vim: Tampilkan indeks tab di tabline


8

Katakanlah saya membuka file1.txt, file2.txt, file3a.txtdan file3b.txtsehingga tabline (hal di atas) terlihat seperti ini:

file1.txt  file2.txt  2 file3a.txt

(Perhatikan bagaimana file3b.txt.tidak ada karena ditampilkan dalam split, pada tab yang sama seperti file3a.txt)

Untuk bergerak lebih cepat antar tab (dengan <Number>gt), saya ingin setiap tab menampilkan indeksnya, di sepanjang nama file. Seperti itu:

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

Pemformatan (khususnya kawat gigi sudut) adalah opsional; Saya hanya ingin indeks muncul di sana ( 1:,, 2:dan sebagainya).

Tidak ada petunjuk :h tab-page-commandsatau google sama sekali.


1
Pembaruan: Plugin ini mungkin bermanfaat. Saya pikir itu dibuat jauh setelah pertanyaan ini dijawab sehingga tidak muncul di salah satu jawaban.
crayzeewulf

Jawaban:


0

Anda perlu melihat:

:help 'tabline'
:help setting-tabline

Dan jika Anda memiliki "e" di pengaturan 'guioptions' Anda:

:help 'guitablabel'

Itu membuat saya di jalur yang benar. Terima kasih banyak!
bitmask

9
@ bitmask, bisakah Anda memberikan solusi? Heptite, bisakah Anda mengubah jawaban Anda?
wmarbut

@wmarbut gunakan plugin ini , luar biasa.
ospider

Sepakat. Sangat mengecewakan ketika solusi tampaknya "ditemukan" tetapi tidak disediakan dan setiap orang harus menghabiskan jumlah waktu yang sama menggali dokumen dan menulis konfigurasi yang sama.
Alex H

12

letakkan ini di vimrc Anda

" 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

2
Apakah Anda tahu apa '%999XX'artinya di sini?
Bach

Karena ini berfungsi untuk terminal dan gvim, saya pikir ini solusi terbaik. Terima suara saya, tuan.
imolit

5

Pada halaman wikia Anda mungkin menemukan setidaknya dua (yang saya uji) yang memberi Anda indeks tab, dan salah satunya menghasilkan jumlah jendela di dalam setiap buffer yang telah diedit.

Berikut ini adalah hasil modifikasi saya pada salah satu yang menghasilkan jumlah buffer yang diedit, perubahan yang saya buat adalah untuk membuat nilai sorotan dari jumlah konsisten dengan sisa tab:

masukkan deskripsi gambar di sini

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

Skrip Anda lebih baik daripada yang lain karena skrip ini mempertahankan bagian tempat tab menunjukkan jika file telah diedit. Terima kasih!
Plasty Grove

Ya, saya telah menggunakan tabline dari airlineplugin, tetapi jujur ​​saja, tabline lama yang saya buat ini jauh lebih fungsional ...
Steven Lu

3

The tabline Plugin yaitu sebuah vim plugin yang mengimplementasikan diminta fungsi dan tidak akan meniup vimrc Anda. Cukup instal, dan mulai ulang vim.

Untuk memasang:

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

atau gunakan pengelola plugin.


1
Selamat Datang di Pengguna Super! Silakan baca Cara merekomendasikan perangkat lunak untuk informasi minimum yang diperlukan dan saran tentang cara merekomendasikan perangkat lunak pada Pengguna Super. Agar jawaban Anda bermanfaat bahkan jika tautan yang disediakan memecah detail ini harus diedit ke dalam jawaban Anda.
Saya katakan Reinstate Monica

0

Untuk Vim berbasis GUI (Gvim di Linux, MacVim di Mac, dll), masukkan ini di .gvimrc:

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

Beberapa tips tentang penggunaan nomor yang ditampilkan:

  • Ngtakan beralih ke tab N. Misalnya, 3gtbuka tab 3.
  • :tabm2memindahkan tab saat ini untuk muncul setelah tab 2.
    • Untuk memindahkan tab ini ke posisi pertama, gunakan :tabm0
    • Untuk memindahkan tab ini ke posisi terakhir, cukup gunakan :tabm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.