Какова реализация функции Vim по умолчанию «tabline»? - PullRequest
13 голосов
/ 08 мая 2011

В Vim текст, который формирует ряд вкладок в верхней части экрана (при использовании вкладок), настраивается с параметром tabline.

Я хотел бы внести несколько незначительных изменений в строку страниц вкладок по умолчанию, например, заменить количество окон на вкладке индексом вкладки. К сожалению, версия этого по умолчанию (которая активна, когда tabline не установлена) является сложной и недокументированной. Мне нечего настраивать.

Есть ли фрагмент скрипта Vim, который обеспечивает реализацию по умолчанию, которую я мог бы приспособить к своим потребностям?

Ответы [ 3 ]

7 голосов
/ 08 мая 2011

Я использую пользовательскую функцию для сброса номера вкладки и номеров области просмотра, начиная с здесь (см. Комментарий Tonymec). Вы можете поиграть с ним, чтобы изменить способ отображения вкладок.

Вот что у меня есть в .vimrc. Это только слегка измененная версия, которая меняет способ отображения табуляции # и окна просмотра.

"Rename tabs to show tab# and # of viewports
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 .= (i== t ? '%#TabNumSel#' : '%#TabNum#')
            let s .= i
            if tabpagewinnr(i,'$') > 1
                let s .= '.'
                let s .= (i== t ? '%#TabWinNumSel#' : '%#TabWinNum#')
                let s .= (tabpagewinnr(i,'$') > 1 ? wn : '')
            end

            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 s .= (i == t ? '%m' : '')
            let i = i + 1
        endwhile
        let s .= '%T%#TabLineFill#%='
        return s
    endfunction
    set stal=2
    set tabline=%!MyTabLine()
endif

А вот цвета, которые определены в моей функции

set tabpagemax=15
hi TabLineSel term=bold cterm=bold ctermfg=16 ctermbg=229
hi TabWinNumSel term=bold cterm=bold ctermfg=90 ctermbg=229
hi TabNumSel term=bold cterm=bold ctermfg=16 ctermbg=229

hi TabLine term=underline ctermfg=16 ctermbg=145
hi TabWinNum term=bold cterm=bold ctermfg=90 ctermbg=145
hi TabNum term=bold cterm=bold ctermfg=16 ctermbg=145
4 голосов
/ 02 июля 2013

Это не тот ответ, о котором вы спрашиваете, но я поделюсь с вами своей собственной таблицей.

Сделал это с помощью страницы вики , вот моя версия.

Здесь на первой вкладке открыто три окна с двумя открытыми в одном отредактированном файле.

enter image description here

(извините за вкладки с 8 пробелами)

set showtabline=1  " 1 to show tabline only when more than one tab is present
set tabline=%!MyTabLine()  " custom tab pages line
function! MyTabLine() " acclamation to avoid conflict
        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
2 голосов
/ 29 ноября 2012

Йода это правильное решение. Чтобы конкретно ответить на вопрос, не существует значения по умолчанию для tabline. Если он не установлен, Vim сам создает отображаемую строку. Реализация в src/screen.c в draw_tabline(), в источнике Vim 7.3. Я надеялся найти здесь скрытое значение по умолчанию, которое запускалось через тот же движок, но, увы, это чистая реализация на Си. Меня удивляет, почему они не просто создали значение табуляции и не использовали механизм для его анализа, но Vim был написан в тот день, когда подсчитывались циклы ЦП, и это, безусловно, немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...